基于单片机的简易电子琴系统设计(程序)

发布者:星辰耀眼最新更新时间:2022-04-21 来源: eefocus关键字:单片机 手机看文章 扫描二维码
随时随地手机看文章

#include  

#define uint unsigned int 

#define uchar unsigned char

#define output P1

#define input P1

//方便移植在其他电路板上,我的电路使用P1口做键盘输入接口

//定义16个按键

enum KEY{key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15};

uchar code table[]={   //数组定义,显示数码管

    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

unsigned int code Freqtab[] = { //定时半周期的初始值

     64021,64103,64260,64400,      //低音3 4 5 6

     64524,64580,64684,64777,      //低音7,中音1 2 3

     64820,64898,64968,65030,      //中音4 5 6 7

     65058,65110,65157,65178};     //高音1 2 3 4

uint FreqTemp;

//蜂鸣器声音不怎么样,我们使用扬声器,接P3.7口

sbit SPEAK = P3^7;

void delay1ms(uint n)   //误差 0us ,延时n毫秒

{

    uint a,b,c;

for(c=n;c>0;c--)

    for(b=199;b>0;b--)

        for(a=1;a>0;a--);

}

 

uint key_input(void)

{

uchar temp1,temp2; //临时保存读取的行或者列

uchar num = 16;     //返回按键的值

output = 0x0f;

    temp1 = input; //先读取行

if(0x0f != temp1)    //按键按下

{    

delay1ms(5); //延时,消除抖动

temp1 = input; //再次读取行

if(0x0f != temp1) //说明按键确实按下

{

temp1 = temp1 & 0x0f; //保留低4位

output = 0xf0; //准备读取列

delay1ms(1); //延时一下,防止下一句读不到

temp2 = input; //直接读取列

temp2 = temp2 & 0xf0; //保留高4位

temp1 = temp1 | temp2; //将temp1和temp2的值合并

}

}

switch(temp1)

{

case 0xee:num=0;break;  

        case 0xde:num=1;break;  

        case 0xbe:num=2;break;   

        case 0x7e:num=3;break; 

case 0xed:num=4;break;               

        case 0xdd:num=5;break;           

        case 0xbd:num=6;break;             

        case 0x7d:num=7;break;   

case 0xeb:num=8;break;    

        case 0xdb:num=9;break;    

        case 0xbb:num=10;break;   

        case 0x7b:num=11;break;    

case 0xe7:num=12;break;   

        case 0xd7:num=13;break;   

        case 0xb7:num=14;break;    

        case 0x77:num=15;break;      

default:break;

}

return num;

}

void T0_INT(void) interrupt 1

{

     TL0 = FreqTemp;                //载入定时半周期的初始值

     TH0 = FreqTemp >> 8;

     SPEAK = ~SPEAK;                    //发音

int main()

{

TMOD = 0X01; //定时器T0设置为方式1

EA = 1;

ET0 = 1;

TR0 = 0;

while(1)

{

uint num,temp;

num = key_input();

temp = num;

P0 = table[num];

if(16 != num)

{

FreqTemp = Freqtab[num];

TR0 = 1;

while(0xf0 != output); //检测按键松开

TR0 = 0;

SPEAK = 1;

}

}

return 0;

}

关键字:单片机 引用地址:基于单片机的简易电子琴系统设计(程序)

上一篇:基于单片机的温湿度监测系统设计(程序)
下一篇:基于单片机的数字时钟系统设计

推荐阅读最新更新时间:2024-11-11 12:10

PIC 单片机软件异步串行口实现技巧
在用单片机开发各种嵌入式应用系统时,异步串行通信是经常要用到的一种通信模式,很多应用中还要求实现多路异步串行通 信。大家平时熟悉的各种厂家的单片机,绝大部分片上只提供一个硬件UART模块,利用它可以方便实现一路串行通讯。PIC系列单片机也不例外,在其丰富的 产品家族成员中,除高端系列(PIC17/18)一些型号片上带有两路硬件UART模块外,其它大部分型号片上只有一路UART,一些低端廉价的PIC单 片机甚至还不带硬件 UART。为了提高系统的性能价格比,就要求设计工程师用软件增加实现一路或多路异步串行通信。很多工程师对用软件实现的UART在可靠性和效率方面持怀 疑态度,其实关键问题是看软件采用何种方式来实现可靠的UART功能。  
[单片机]
PIC <font color='red'>单片机</font>软件异步串行口实现技巧
单片机与PC机串口通讯程序
单片机与PC机串口通讯程序 #include reg51.h #define uchar unsigned char #define SLAVE 0xF1 // 单片机 地址 #define BN 10 //传送一次的字节数 uchar idata rdata ; uchar idata tdata ={ abcdefghij }; uchar receive(uchar addrs); char send(); void main(void) { uchar i; for(i=0;i 10;i++) TMOD=0x20; //定时器T1定义为模式2 TL1=
[单片机]
26-基于单片机的简单温控风扇
具体实现功能 系统由STC89C51单片机+LCD1602液晶显示屏+L298N控制模块+直流电机+DS18B20温度传感器构成。 具体功能: (1)LCD1602实时显示DS18B20测得的温度值; (2)无人情况下风扇停止转动; (3)有人情况下,实现温度对风扇转速的调整,温度越低,风扇转速越慢;温度越高,风扇转速越快。 设计背景 近些年来,随着空调行业的迅速发展,电风扇行业受到一定的打击。然而,家用电风扇并没有随着空调的普及而淡出市场,近两年反而出现了市场销售复苏的态势。与空调相比,一方面,空调有强大的制冷功能,可以快速有效地降低环境温度,但电风扇的风更温和,更加适合老人儿童和体质较弱的人使用。另一方
[单片机]
26-基于<font color='red'>单片机</font>的简单温控风扇
单片机测量三相电网功率因数的接口电路分析
为了测量时间r,又为使测量的φ角的精度不受电网频率(或周期T)的影响,采用图所示的接口电路。 由变压器TR取得的UCA线电压信号和由电流互感器取得的线电流iB信号均由检查器转换成相应的方波信号。电压方波信号经G1门反相后,作为测量T/2脉宽的门控脉冲加至G3门输入端,由“或非”门G2得到UCA与iB同时为负的正极性方波脉冲,作为测量时间r的门控脉冲加至G4门输入端。计数脉冲是用8031的ALE脉冲四分频后获得的。因ALE脉冲频率在8031执行非MOVX类指令时是稳定的,且为1/6×晶振频率。因而可用8031内部定时器/计数器T0和Tl对G3与G4门输出脉冲进行计数。上述各点的波形及对应关系已经表示于图1中。 图2中,8031的P3
[单片机]
<font color='red'>单片机</font>测量三相电网功率因数的<font color='red'>接口</font>电路分析
MCS-51单片机指令系统(1)
指令系统概述 指令是计算机用于控制各种功能部件完成的某一特定动作的指示和命令。一台计算机能识别和执行的指令集合即为其指令系统。指令系统是一套控制计算机执行操作的编码,通常称为机器语言。机器语言是计算机唯一能识别和执行的指令。指令系统由硬件决定,且不具有通用性。汇编语言可以准确地计算出控制操作时间并灵活地实施控制,及高效开发必须掌握指令系统和汇编语言。 在实际开发应用中,由于指令系统与汇编语言开发的繁琐和开发效率低则应用C语言开发或者直接应用固件集成库开发提高开发效率和时间。但是对于单片机及其他硬件开发过程,开发过程的调试和资源应用都应对于汇编和指令系统的熟悉才能真正的高效开发完成调试达到目的。 常用单位和术语 位(
[单片机]
AVR单片机高压解锁器的制作设计
概述: 利用常用的AVR单片机ATmega16制作的高压解锁器,可以解开所有芯片锁死的情况(除非芯片损坏、烧毁)。制作作品经实验验证,解开了山东大学物理学院AVR单片机实验室所有近40片锁死的单片机以及许多同学锁死的单片机。制作方法简单,保证你一小时之内做完。 所需元件极少(如电路图所示):仅一只三极管、一片7805,三支电阻、一只LED、三个小电容,一片可用的单片机,一个12V电源。 程序与电路连接可方便的移植到其它型号单片机上(凡支持高压编程的,都可以)。 希望能对初学单片机的同学有所帮助,特别是我们学校暑假参加电子设计比赛的同学。 制作背景(常见芯片锁死情况与高压解锁介绍): AVR单片机是我们学校同学经常使用的
[单片机]
AVR<font color='red'>单片机</font>高压解锁器的制作设计
[单片机框架][AT指令框架][从机版] 高内聚 低耦合
核心思想 采用__attribute__((used)) attribute((section (“atcmd”)))的形式 优点: 可以自由变换输出通道,实现三方通讯。 注册AT指令,只用写到模块内部,不用耦合其他文件 下面就是举例使用方法:test.c #include atcmd_slave.h #if ATCMD_EN // 在功能模块中定义一个标准函数 static int test(atcmd_pack_t *pack) { uint8_t buff = testrn ; strcat((char*)buff, AT_OK); pack- reply(buff, strlen((char*)buff
[单片机]
[<font color='red'>单片机</font>框架][AT指令框架][从机版] 高内聚 低耦合
节省IO的小技巧:GD32 MCU如何使用一个GPIO实现串口半双工收发
一般情况串口的接受和发送分别需要使用TX和RX两个引脚来实现,但在一些UART的实际应用中,通信双方身份为主机和从机,数据流是半双工的,那么当IO口资源紧张时可以使用半双工模式通过一个引脚实现数据的发送和接受,同时又保证数据不出错。我们一起来看下红枫派开发板例程中是如何实现的? 首先GD32F303的UART是支持半双工模式的,但想要真正使用起来,软硬件还需要特殊设计。 首先是硬件设计,在红枫派开发板中的RS485通信使用半双工实现,原理图是这样的: 其中很重要的两个点是: 1、在MCU的TX引脚上一定要增加一个上拉电阻,保证MCU发送和接受模式切换时IO口电平可以保持高电平的空闲态。 2、485端实际还是发送和接受
[单片机]
节省IO的小技巧:GD32 <font color='red'>MCU</font>如何使用一个GPIO实现串口半双工收发

推荐帖子

WinCE6.0中应用中使用物理地址
做应用的需要一片固定的内存,我在Config.bib中划好,在驱动里增加了MmIOMapSpace和MmIOUnMapSpace以及对应的IOCTL,在驱动内部测试,这片内存可以正常访问,map以及unmap。我用IOCTL为应用返回这片内存的物理及虚拟地址,为什么在应用中使用该虚拟地址操作这片内存就会DataAbort?? //RequestApplicationMemory if(!DeviceIoControl(hCamDrv,IOCTL
f123 WindowsCE
一起开发嵌入式操作系统
打算开发嵌入式操作系统,召集有志同道合者,现在已经做好了semaphore部分,其它部分正在开发中,论坛:http://dawn.tech.topzj.com/index.php,欢迎大家光临指导!一起开发嵌入式操作系统高手,可惜自己没有那么高的水平,真想参加.有问题请先GOOGLE,BAIDU帮楼主顶一下!顺便也接点分
yytzc 嵌入式系统
《Windows CE实用开发技术》张冬泉著的示例程序代码谁有啊?
《WindowsCE实用开发技术》张冬泉著的示例程序代码谁有啊?哪位能搞到源码或者自己能编出源码,给我发一份吧,不胜感激将。zhangpei_eric@hotmail.com《WindowsCE实用开发技术》张冬泉著的示例程序代码谁有啊?兄弟你有了也给我一份拉我现在也在搞这个拉yuaiping5164@163.com那个有相关的电子书给我万分感谢拉我也在学WINCE,有也给我一份.感谢一下!jacky0097@163.com我也想学,谁有也给我一份,谢谢!yangxh1-
betopelec 嵌入式系统
GY-26电子指南针 STM32 GUI--LCD采集显示,VB上位机.exe同步采集 第一版终于完工
弄着玩玩,新手,不要批评吆,呵呵·····GY-26电子指南针STM32GUI--LCD采集显示,VB上位机.exe同步采集第一版终于完工不错继续加油哦回复楼主hjw199089的帖子楼主照片是手机照的吗?是的,用同学的手机照的,几天又照了几张。新手,做的简陋,多向你们学习了,呵呵回复板凳编号洞洞拐的帖子不错,这个角度需要校正不?可以校正,在博客里有修正后的,https://home.eeworld.com.cn/my/sp...o=blog&i
hjw199089 stm32/stm8
GBT 18488.1-2006电动汽车用电机及其控制器 第1部分:技术条件
GBT18488.1-2006电动汽车用电机及其控制器第1部分:技术条件GBT18488.1-2006电动汽车用电机及其控制器第1部分:技术条件很好!谢谢您发来的资料,很有用,开点下载喽!可惜没有币啦!哈哈!来顶顶呵呵呵加油,谢谢分享赞一个谢谢了灰常感谢灰常感谢
安_然 DSP 与 ARM 处理器
《人工智能实践教程——从Python入门到机器学习》阅读报告(3)
本书的第三部分,作者深入探讨了神经网络的构建与应用,这一部分是全书的精华所在。以下是对书中核心内容的简要介绍: 感知机:作者首先从感知机的原理出发,详细阐述了其从逻辑电路到多层神经网络的演变过程。书中不仅介绍了基础的激活函数,还深入探讨了如何通过这些函数构建更为复杂的神经网络结构; 反向传播算法:通过链式法则和计算图,作者清晰地推导了反向传播算法的理论基础。书中不仅涵盖了常见的激活函数,还特别介绍了Softmax等复杂函数的推导过程,为读者揭示了误差反向传播在神
Aclicee 编程基础
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved