《单片机电子琴课程设计 .doc》由会员分享,可在线阅读,更多相关《单片机电子琴课程设计 .doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、 设计目的1. 提高51单片机理论知识2. 学会如何设计电子琴3. 提高编程能力二、 设计要求1.设计一个(44)的键盘,并将16个键设计成16个音2.可弹奏想要表达的音乐3.该电子琴包含1首示例音乐,接通电源可播放示例音乐三、 设计过程1. 主要芯片功能描述AT89C51是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多种功能的I/O线等一台计算机所需要的基本部件。其内包含下列几个部件: 1).一个8位CPU ; 2).一个片内振荡器及时钟电路; 3).4K字节ROM程序存储器; 4).128字节RAM数据存储器 5).可寻址64K外部数据存储器和64K外部程序存储器空间的控
2、制电路; 6).32条可编程的I/O线(四个8为并行I/O端口); 7).具有五个中断源、两个优先级嵌套结构;其外型如图示: 2.音乐频率一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。单片机12MHZ晶振,高中低音符与单片机计数T0相关的计数值如下表所示 : 音 符 频 率 简码值(T值)低3 M33064021低4 FA349 64103低5 SO392 6426
3、0低6 LA44064400低7 SI49464524中 1 DO52364580 中 2 RE58764684中 3 M65964777中 4 FA69864820中 5 SO78464898中 6 LA88064968中 7 SI98865030高 1 DO106465058高 2 RE117565110高 3 M131865157高 4 FA1397651783.设计硬件部分如下图所示,硬件部分采用的是逐列扫描,右边16个按键对应16个音。不断检测十六个按键,当某个按键被按下,先检测出是哪一列被按下,再判断哪个键被按下。左边的三个按键是我设置的三个功能键,P1.0是歌曲祝你生日快乐, P
4、1.1是歌曲找朋友,当检测到按键被按下时,P1.0和P1.1接地,所以歌曲就播放。P1.2是一个暂停/启动按键,当歌曲播放时,按下它就启动;当歌曲再次按下,它就停止播放。 4. 软件设计部分 程序设计的流程图如下图,不断检测16个音阶键或功能键哪个被按下,当音阶键被按下时,发出对应的音;当功能键被按下时,执行相应的功能。然后再检测按键释放成不成功,也就是平时所说的松手检测,不成功就不断再检测,成功就停止工作。四、 设计心得通过本次课程设计,遇到了许多问题,也提高了自己的实践能力。如设计硬件部分,我用了另外三个独立功能键,虽然这样做简单很多,但是浪费了IO口的资源;设计软件部分,发现自己的编程能
5、力还有很多问题,改了又改,特别是实现功能键,花了很多时间。在这次课程设计中,之所以存在着很多的问题,最主要是课外知识不够广,电子方面的知识比较欠缺,认识到了自己的弱点,在接下来的时间会针对这方面努力。回顾起此次单片机课程设计,至今我仍感慨颇多,科技日益更新,我们要跟上时代的步伐就要掌握好知识,努力向上。 附录 设计源程序:#include#define uchar unsigned char#define uint unsigned intsbit beep=P23; /定义蜂鸣器uchar temp,key;sbit s1=P10; /定义功能键1 sbit s2=P11; /定义功能键2s
6、bit s3=P12; /定义功能键3uint code table=64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178; /频率void delay(uint z) /延时程序 uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);void main() TMOD=0x01; EA=1; /开总中断 ET0=1; /开定时器0中断 while(1) P3=0xfe; temp=P3; temp=temp&0xf0; if(t
7、emp!=0xf0) /检测第一行按键 delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; TH0=tablekey/256; TL0=tablekey%256; TR0=1; while(temp!=0xf0) /松手检测 temp=P3; temp=temp&0xf0; TR0=0; beep=1;
8、P3=0xfd; /检测第二行按键 temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0) temp=P3; switch(temp) case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=7; break; TH0=tablekey/256; TL0=tablekey%256; TR0=1; while(temp!=0xf0) temp=P3; te
9、mp=temp&0xf0; TR0=0; beep=1; P3=0xfb; /检测第三行按键 temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; TH0=tablekey/256; TL0=tablekey%256; TR0=1
10、; while(temp!=0xf0) temp=P3; temp=temp&0xf0; TR0=0; beep=1; P3=0xf7; /检测第四行按键 temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; TH0=t
11、ablekey/256; TL0=tablekey%256; TR0=1; while(temp!=0xf0) temp=P3;temp=temp&0xf0; TR0=0; beep=1; if(s1=0) /功能键1 delay(10); if(s1=0) TR0=1; while(1) if(s3=0) /功能键3 delay(1); if(s3=0) TR0=TR0; /设置启动暂停 while(!s3); key=4; /祝你生日快乐TH0=tablekey/256;TL0=tablekey%256;delay(150); key=4; TH0=tablekey/256; TL0=ta
12、blekey%256; delay(150); key=5; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=7; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=6; TH0=tablekey/256; TL0=tablekey%256; delay(600); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(150); k
13、ey=4; TH0=tablekey/256; TL0=tablekey%256; delay(150); key=5; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=8; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=6; TH0=tablekey/256; TL0=tablekey%256; delay(300); beep=1; while(!s1); /松手检测
14、if(s2=0) /功能键2 delay(10); if(s2=0) TR0=1; while(1) if(s3=0) /功能键3 delay(10); if(s3=0) TR0=TR0; key=4; /找朋友 TH0=tablekey/256; TL0=tablekey%256; delay(400); key=5; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=5; TH0=tablekey/256; TL0=tablek
15、ey%256; delay(400); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(800); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=7; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=6; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=5; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(800); key=2; TH0=tablekey/256; TL0=tablekey%256; delay(800); beep=1; while(!s2); /松手检测 void time() interrupt 1 /中断 TH0=tablekey/256;TL0=tablekey%256;beep=beep;
限制150内