单片机课程设计简易电子琴Word文档格式.docx
《单片机课程设计简易电子琴Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计简易电子琴Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
音符
频率(HZ)
简谱码(T值)
低1 DO
262
63628
#4FA#
740
64860
#1 DO#
277
63731
中5SO
784
64898
低2 RE
294
63835
#5SO#
831
64934
#2RE#
311
63928
中6LA
880
64968
低3M
330
64021
#6
932
64994
低4FA
349
64103
中7SI
988
65030
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
466
64463
高3M
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
1480
65198
554
64633
高5SO
1568
65217
中2RE
587
64684
1661
65235
622
64732
高6LA
1760
65252
中3M
659
64777
1865
65268
中4FA
698
64820
高7SI
1967
65283
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
低音0-19之间,中音在20-39之间,高音在40-59之间
用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。
为了输出合适的方波,首先应该知道音符与频率的关系。
2.音名
从常见的电子琴的键盘谈起。
主要分成低音、中音和高音三个区域,每个区域都有12个琴键。
其中的白键,简谱音符标为1、2、3、4、5、6、7,大家一般都读成哆、来、咪、发、嗦、拉、西。
按键
1
3
4
5
6
7
8
I
频率值
524
660
1048
3.音调数据表
单片机发出不同频率的方波,人听起来,就是不同的音调。
上表中的频率数值,有些过多,去掉不常用的黑键频率,只是把白键对应的数据存放在单片机中,即可满足绝大部分的应用需求。
定义音调数据表的程序如下:
DW63628,63835,64021,64103,64260,64400,64524;
64580,低音区:
1234567
DW64580,64671,64777,64820,64898,64968,6503065058中音区:
DW65058,65110,65157,65178,65217,65252,6528365312高音区:
把这个数据表,放在程序中,需要播音的时候,就从表中取出一个数据送到定时器,当定时器溢出中断的时候,再对输出引脚取反,那么,在扬声器中,即可听到上表中频率的声音。
音乐的音拍,一个节拍为单位(C调)
曲调值
DELAY
调4/4
125ms
62ms
调3/4
187ms
94ms
调2/4
250ms
三.设计电路图
1.晶振部分
本次采用12MHZ晶振,机器周期为1us,连接两个30pF的电容,连接到AT89C51的XATL1,XATL2 上面,连接电路图如下:
2.音频输出 本次只是简单的使用一个蜂鸣器连接到AT89C51的p1.0口上
3.高。
中。
低及音乐播放键:
检测高中低是否按下,来跳转到音阶键上输出不同频率的音阶音,检测播放是否按下,跳转到示范曲目播放
4.AT89C51
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
1.主要特性:
·
与MCS-51兼容
4K字节可编程闪烁存储器
寿命:
1000写/擦循环
数据保留时间:
10年
全静态工作:
0Hz-24Hz
三级程序存储器锁定
128*8位内部RAM
32可编程I/O线
两个16位定时器/计数器
5个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
5.音阶键部分
6.设计电路总体图样
4、设计流程图
1.音阶键识别
5、程序如下:
KEYBUFEQU30H
STH0EQU31H
STL0EQU32H
DELYEQU33H
NUMEQU34H
ORG0000H
AJMPMAIN;
跳转到主函数
ORG000BH
LJMPINT_T0;
音乐输出口
ORG0040H
MAIN:
MOVTMOD,#01H;
写出计时器控制字,T0方式计时
SETBEA;
开中断总开关
SETBET0;
允许T0中断
MOVNUM,#01H;
;
num置1
MOVR1,#00H
TEST:
;
低音检测
ANLTH0,#00H;
高位清零
ANLTL0,#00H;
低位清零
MOVA,P2;
P2进入
CJNEA,#0FEH,TEST1;
检测P2.0口低音键是否按下
MOVDPTR,#TABLE1;
低音键按下,进入低音表地址
AJMPWAIT;
跳转到音阶检测
TEST1:
;
中音检测
CJNEA,#0FDH,TEST2;
检测P2.0中音键是否按下
MOVDPTR,#TABLE2;
中音键按下,进入中音表地址
AJMPWAIT
TEST2:
高音检测
CJNEA,#0FBH,TEST3;
检测P2.0口高音键是否按下
MOVDPTR,#TABLE3;
高音键按下,进入高音表地址
TEST3:
音乐播放检测
CJNEA,#0F7H,TEST4;
检测音乐播放键是否按下若有按下则转至EXIT
LCALLDELAY10MS;
软件延时消抖
MOVA,P2
检测播放键是否再次按下
MOVA,NUM
CJNEA,#01H,EXIT;
检测高低中是否再次按下
MOVNUM,#00H
MOVDPTR,#TABLE4;
进入音乐播放表
AJMPWAIT1;
跳转至音乐播放入口
EXIT:
CLRTR0;
计数器停止,音乐播放结束
MOVR1,#00H;
清零
MOVNUM,#01H
TEST4:
CJNEA,#01H,WAIT2
LJMPTEST;
跳转至TEST重新检测
WAIT2:
LJMPWAIT1;
WAIT:
CLRTR0
MOVNUM,#01H
SCAN1:
MOVP3,#0F0H;
音阶按键检测程序入口
CLRTR0
MOVA,P3;
ANLA,#0F0H
CJNEA,#0F0H,TEE1
AJMPTEST;
TEE1:
CJNEA,#0F0H,TEE2
AJMPTEST
TEE2:
MOVA,#0FEH
SCAN2:
MOVP3,A
MOVA,P3
MOVB,A
CJNEA,#0F0H,CARRY
MOVA,B
RLA
CJNEA,#0BFH,SCAN2
LJMPSCAN1
CARRY:
ANLB,#0FH;
键值处理
ORLA,B
CJNEA,#0EEH,KEY1;
检测音符键1是否按下
MOVKEYBUF,#00H;
赋予键值
LJMPWAI;
调至按键处理程序
KEY1:
CJNEA,#0EDH,KEY2;
检测音符键2是否按下
MOVKEYBUF,#02H;
赋予键值
调至按键处理程序
KEY2:
CJNEA,#0EBH,KEY3;
检测音符键3是否按下
MOVKEYBUF,#04H;
KEY3:
CJNEA,#0E7H,KEY4;
检测音符键4是否按下
MOVKEYBUF,#06H;
KEY4:
CJNEA,#0DEH,KEY5;
检测音符键5是否按下
MOVKEYBUF,#08H;
KEY5:
CJNEA,#0DDH,KEY6;
MOVKEYBUF,#0AH;
KEY6:
CJNEA,#0DBH,KEY7;
检测音符键6是否按下
MOVKEYBUF,#0CH;
KEY7:
CJNEA,#0D7H,SCAN1
MOVKEYBUF,#0EH;
WAI:
MOVA,KEYBUF;
按键处理程序入口
MOVCA,@A+DPTR
MOVSTH0,A
INCKEYBUF
MOVA,KEYBUF
MOVSTL0,A
MOVTH0,STH0
MOVTL0,STL0
SETBTR0
LCALLDELAY100MS
WAIT1:
CJNER1,#00H,LOOP;
播放音乐程序入口
LOOP:
MOVA,R1
MOVSTH0,A
INCR1
MOVA,R1
CJNEA,#0FEH,NEXT1
LJMPLOOP
NEXT1:
MOVSTL0,A
MOVA,R1
MOVDELY,A
SETBTR0
NEXT2:
LJMPDELAY187MS;
节拍延时控制
NEXT3:
DJNZDELY,NEXT2
LJMPTEST
NOKEY:
LJMPTEST;
重新检测
DELAY10MS:
MOVR6,#10;
10ms延时
D1:
MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET;
子程序返回
DELAY100MS:
MOVR5,#06EH;
100ms延时
DL0:
MOVR4,#0CFH
DJNZR4,$
DJNZR5,DL0
RET;
DELAY187MS:
MOVR3,#187;
187ms延时,用于节拍控制
DL1:
MOVR2,#248
DJNZR2,$
DJNZR3,DL1
LJMPNEXT3
INT_T0:
MOVTH0,STH0;
高8为输入
MOVTL0,STL0;
低8位输入
CPLP1.0;
音乐输出口启用
RETI;
中断返回
TABLE1:
DB0f8h,094h,0f9h,05ch,0fah,01Ah,0FAH,06AH;
低音调表值
DB0FBH,00H,0FBH,08CH,0FCH,0EH,0FCH,044H;
TABLE2:
DB0FCH,04AH,0FCH,0AEH,0FDH,008H,0FDH,030H;
中音调表值
DB0FDH,080H,0FDH,0C6H,0FEH,02H,0FEH,022H;
TABLE3:
DB0FEH,02AH,0FEH,05CH,0FEH,084H,0FEH,098H;
高音调表值
DB0FEH,0C0H,0FEH,0E8H,0FFH,006H,0FFH,029H;
•SONG1:
;
化蝶
•.DB-3,04H,-5,03H,-6,01H,1,03H,2,01H,-6,01H,1,01H,-5,02H
•.DB5,03H,+1,01H,6,01H,5,01H,3,01H,5,01H,2,08H
•.DB2,02H,2,01H,3,01H,-7,02H,-6,02H,-5,03H,-6,01H,1,02H,2,02H
•.DB-3,02H,1,02H,-6,01H,-5,01H,-6,01H,1,01H,-5,08H
•.DB3,03H,5,01H,-7,03H,2,01H,-6,01H,1,01H,5,05H
•.DB-3,02H,-5,01H,-3,01H,-5,01H,-6,01H,-7,01H,2,01H,-6,06H,-5,01H,-6,01H
•.DB1,03H,2,01H,5,02H,3,02H,2,02H,3,01H,2,01H,1,02H,-6,01H,-5,01H
•.DB-3,04H,1,04H,-6,01H,1,01H,-6,01H,-5,01H,-3,01H,-5,01H,-6,01H,1,01H
•.DB-5,08H,FFH,08H
6、心得体会
本次单片机课程设计,本身题目并没有多大难度,但对初学者得我来说还是有些小困难,但经过理论知识的进一步学习,查阅了大量资料之后,了解了设计思路,在参考了网上的一些程序及类似作品之后,仍将它安老师要求做了出来,中间花费了很大功夫,对程序及电路图做了多次修改,终于,一份还算令自己满意的完成品诞生了!
本次简易单片机设计,要求是能发出八个音阶声音,并能控制低,中,高三音变换,还能播放示范曲目。
我利用AT89C51单片机
这次我主要的设计是一个游戏型的电子琴,采用16个键分别代表16个音,通过对按键的随意按击从而产生不同的音乐,主要是通过每个按键所产生的频率不同来使得发出的各个音不同,从而产一音乐,虽然显得单一,但是至少很简单。
这次主要参考了网上的一个实例,再加上了一些自己的补充。
我主要针对了这个设计的原理和程序的编写,从而来更好的会习设计的方法和创新。
最后,通过这次的自主完成单片机的应用系统设计,虽说不完全是自己完成,但是至少有一点,让我们学会了如何去完成一个设计报告,让我更进一步了解了单片机,也让我感受到做出一个设计的开心,喜悦与担心。
相信这对以后的毕业设计也会有很大的帮助。
参与本次设计,我也有不少收获:
第一、系统而比较全面地检查了我所学的专业知识,补充了我未学的专业知识,对一个产品的开发的步骤有一定的认识。
“查漏补缺”的同时进一步巩固了专业知识,锻炼了自己。
第二、训练了我的动手能力。
电路板得读取,程序得编制等实际操作让我真正地理解了“学以致用”的含义。
第三、在学习怎样开发SPCE061A板的同时也使我们对相应的软件环境有了更进一步的认识和了解。
比如:
Protel99SE电路板的设计环境,IDE单片机的开发环境等。
第四、使我真正意识到团队合作的重要性。
一个产品的诞生,离不开设计参与者的文化素质,更离不开他们的团队精神。
所有的参与者都是优秀的,但谁都不是最优秀的。
第五、发掘自我潜能,重视能力,注重培养自己的兴趣与爱好。
学习分析和解决问题,不要因为困难而害怕困难,只有坚持才能够取得最后的成功。
.