1、单片机技术及系统设计课程设计题 目: 基于单片机的电子琴制作 专 业: 自动化 班 级: 姓 名: 学 号 摘要: 随着电子技术的发展,尤其是大规模集成电路的出现,给人类生活带来了根本性的改变。本文首先描述系统硬件工作原理,并附以结构框图加以说明。着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,并且按照设计要求利用单片机设计微型电子琴。完成电路原理图、程序,并进行相关分析。关键词:单片机,电子琴,程序一、设计主要内容:(1)键盘矩阵识别。即矩阵扫描,显示当前按键。(2)不同频率音符播放,可以通过按键控制 16 种发音。(3)可弹奏想要表达的音乐;(4)该电子琴包含 1 首
2、示例音乐,接通电源可播放示例音乐。二、设计要求(1)按设计指标进行电路设计;(2)列出音阶与单片机定时器输出频率关系表格;(3)制作符合设计指标的硬件电路。三、设计说明单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。它的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的
3、主要内容是用AT89S51 单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有 16 个按键和扬声器。本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。 。四、设计简单原理介绍一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单
4、片机的定时/计数器 T0 来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。若要产生音频脉冲,只要算出某一音频的周期(1/ 频率) ,再将此周期除以 2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将 P1.0 反相,然后重复计时再反相。就可在P1.0 引脚上得到此频率的脉冲。利用 AT89C51 的内部定时器使其工作计数器模式(MODE1)下,改变计数值 TH0 及 TL0 以产生不同频率的方法产生不同音阶,例如,频率为 523Hz,其周期T1/5231912s,因此只要令计数器计时 956 s/1s 956,每计数 956 次时将 I/O 反相,
5、就可得到中音 DO(523Hz) 。计数脉冲值与频率的关系式(如式 3-1 所示)是:Nfi2fr 3-1式中,N 是计数值;fi 是机器频率(晶体振荡器为 12MHz 时,其频率为 1MHz) ;fr 是想要产生的频率。其计数初值 T 的求法如下:T65536N65536fi2fr例如:设 K65536,fi1MHz,DO(523Hz)的计数值。T65536N65536fi2fr 6553610000002fr65536500000/fDO 的 T65536500000/52364580单片机 12MHZ 晶振,高中低音符与计数 T0 相关的计数值如表 4-2 所示表 3-2 音符频率表低音
6、音符 频率 HZ 中音音符 频率 HZ 高音音符 频率 HZ1 261.63 1 523.25 1 1045.52 293.67 2 587.33 2 1174.663 329.63 3 659.46 3 1318.514 349.23 4 698.46 4 1396.925 391.99 5 738.99 5 1567.986 440.00 6 880.00 6 1760.007 493.88 7 987.76 7 1975.52我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据低音 019 之间,中音在 2039 之间,高音在 4059 之间TABLE: DW 0,6362
7、8,63835,64021,64103,64260,64400,64524,0,0DW 0,63731,63928,0,64185,64331,64463,0,0,0DW 0,64580,64684,64777,64820,64898,64968,65030,0,0DW 0,64633,64732,0,64860,64934,64994,0,0,0DW 0,65058,65110,65157,65178,65217,65252,65283,0,0DW 0,65085,65134,0,65198,65235,65268,0,0,0DW 0 在这个程序中,弹奏音乐的程序是用定时/计数器 T0 来完
8、成的,播放音乐程序则是用定时/计数器 T1 来完成的。五、软件总体方案及设计流程(1)键盘扫描程序:检测是否有键按下,有键按下则记录按下键的键值,并跳转至功能转移程序;无键按下,则返回键盘扫描程序继续检测(2)功能转移程序:对检测到得按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲功能(3)琴键处理程序:根据检测到得按键值,查询音律表,给计时器赋值,使发出相应频率的声音(4)自动播放歌曲程序:检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放好的歌曲,歌曲播放完毕之后自动返回至键盘扫描
9、程序,继续等待是否有键按下程序简易流程图否是否是开始T0 初始化并开中断允许 T0 中断T1 初始化并开中断允许 T1 中断键盘扫描程序有键按下否识别按键功能播放键根据按键功能装入相应音符值到 T0 取相应的音符码装入 T1启动 T0 启动 T1按键释放成功否 按键释放成功否停止 T0 工作 停止 T1 工作延时去抖动是否弹奏键弹奏程序流程图弹奏子程序开中断并允许中断设定定时器工作方式取键值根据键值查音律表给定时器 T0 赋值进入中断CPL P3.0 P3.0退出中断延时返回键盘扫描程序开始计时自动播放歌曲程序流程图Y NY YN自动播放音乐程序休止符开始计时进入中断退出中断返回键盘扫描STO
10、P查音律表,给定时器赋值取该音符的节拍码取简谱码开中断,设定定时器 T1 工作模式INC DPTRA 0,DPTR歌谱地址延时A=0A=0FFHCPL3.0六、硬件总体方案及说明51 单片机 P1 口通过连接 4*4 的矩阵键盘,作为琴键键盘;P2.0接播放音乐键;P3.0 口接喇叭,通过执行相应的功能程序使电子琴发出不同音色的声音。(一)芯片介绍:在本次电子琴设计中,我们组成员单片机芯片选用了 AT89C51芯片,而 89C51 系列的兼容性也比较好。XTAL218XTAL119ALE30 EA31 PSEN29RST9P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.
11、3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32P1.01 P1.12 P1.23P1.34 P1.45 P1.56P1.67 P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WR 16P3.5/T1 15P2.7/A15 28P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27U1AT89C51P3 口也可作为 AT89C51 的一些特殊
12、功能口,如下表所示:P3 口引脚 特殊功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 (外部中断 0)P3.3 (外部中断 1)P3.4 T0(定时器 0 外部输入)P3.5 T1(定时器 1 外部输入)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读先通)P3 口同时为闪烁编程和编程校验接收一些控制信号。(二)硬件接线:(1)利用 P1 口为按键接入口,形成 44 组成 16 个按键矩阵,设计成 16 个音,下图所示:(2)p3.0 口音频输出,接一个喇叭。(3)复位电路我们本来在方案选择的时候有两种选择的,上电复位和按扭复位,上电复位是利用电
13、容充电来实现的,而按扭复位是电源对外节电容的充电使 RST 为高电平,复位松开后,电容通过下拉电阻放电,使 RST 恢复低电平。为了制作软件的方便我们还是选择用按扭复位,因为它比较直观。(4)电路设计图如下:0 1 2 34 5 6 78 9 A BC D E F所对应的键码为:七、设计仪器、设备和材料清单主要仪器设备:个人计算机和相关的软件主要元器件: 独立按键 16 个单片机芯片 AT80C51 一片12MHz 晶振一个S8550 三极管一个不同阻值电阻数个开关一个USB 电源插口一个喇叭一个10uF、30pF 电容数个电路板一块电烙铁一个等八、设计源程序BUFF EQU 30HSTH0
14、EQU 31HSTL0 EQU 32HTEMP EQU 33HORG 00HLJMP STARTORG 0BHLJMP INT_T0ORG 001BHLJMP TIM1START: MOV TMOD,#01H ;设置 T0 工作方式SETB ET0SETB EA ;启动 T0MAIN: MOV P1,#0FFH ;P1 全置 1CLR P1.4 ;开始扫描第一行MOV A,P1ANL A,#0FH ;屏蔽高四位XRL A,#0FH ;低位 有”0”则有键按下,否则无JZ KKEY1 ; 判断有无键按下,有则继续,没有则转移到 KKEY1LCALL DELY10MS ;调用延时程序MOV A,P
15、1 ;重新开始判断有无键按下ANL A,#0FHXRL A,#0FHJZ KKEY1MOV A,P1ANL A,#0FH ;求键值CJNE A,#0EH,CKK1 ;相等说明该行第一列有键按下,不等则转移MOV BUFF,#0 ;该键值为 0LJMP NDK1 ;跳到 NDK1 执行相应的功能程序CKK1: CJNE A,#0DH,KK2;相等说明该行第二列有键按下,不等则转移MOV BUFF,#1;该键值为 1LJMP NDK1;跳到 NDK1 执行相应的功能程序KK2: CJNE A,#0BH,KK3;相等说明该行第三列有键按下,不等则转移MOV BUFF,#2;该键值为 2LJMP ND
16、K1;跳到 NDK1 执行相应的功能程序KK3: CJNE A,#07H,KK4;相等说明该行第四列有键按下,不等则转移MOV BUFF,#3;该键值为 2LJMP NDK1;跳到 NDK1 执行相应的功能程序KK4: NOPNDK1: MOV A,BUFF MOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,AMOV A,BUFFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1MOVC A,A+DPTRMOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,A+DPTRMOV STL0,AMOV TL0,ASE
17、TB TR0NDK1A: MOV A,P1ANL A,#0FHXRL A,#0FHJNZ NDK1ACLR TR0KKEY1: MOV P1,#0FFH ;开始扫描第二行CLR P1.5MOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY2LCALL DELY10MSMOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY2MOV A,P1ANL A,#0FHCJNE A,#0EH,KK5MOV BUFF,#4LJMP NDK2KK5: CJNE A,#0DH,KK6MOV BUFF,#5LJMP NDK2KK6: CJNE A,#0BH,KK7MOV BUFF
18、,#6LJMP NDK2KK7: CJNE A,#07H,KK8MOV BUFF,#7LJMP NDK2KK8: NOPNDK2: MOV A,BUFFMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,AMOV A,BUFFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1MOVC A,A+DPTRMOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,A+DPTRMOV STL0,AMOV TL0,ASETB TR0NDK2A: MOV A,P1ANL A,#0FHXRL A,#0FHJNZ NDK2ACLR
19、TR0KKEY2:MOV P1,#0FFH ;开始扫描第三行CLR P1.6MOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY3LCALL DELY10MSMOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY3MOV A,P1ANL A,#0FHCJNE A,#0EH,KK9MOV BUFF,#8LJMP NDK3KK9: CJNE A,#0DH,KK10MOV BUFF,#9LJMP NDK3KK10: CJNE A,#0BH,KK11MOV BUFF,#10LJMP NDK3KK11: CJNE A,#07H,KK12MOV BUFF,#11LJMP
20、NDK3KK12: NOPNDK3:MOV A,BUFFMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,AMOV A,BUFFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1MOVC A,A+DPTRMOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,A+DPTRMOV STL0,AMOV TL0,ASETB TR0NDK3A: MOV A,P1ANL A,#0FHXRL A,#0FHJNZ NDK3ACLR TR0KKEY3:MOV P1,#0FFH;开始扫描第四行CLR P1.7MOV A,P1ANL
21、 A,#0FHXRL A,#0FHJZ KKEY4LCALL DELY10MSMOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY4MOV A,P1ANL A,#0FHCJNE A,#0EH,KK13MOV BUFF,#12LJMP NDK4KK13: CJNE A,#0DH,KK14MOV BUFF,#13LJMP NDK4KK14: CJNE A,#0BH,KK15MOV BUFF,#14LJMP NDK4KK15: CJNE A,#07H,KK16MOV BUFF,#15LJMP NDK4KK16: NOPNDK4: MOV A,BUFFMOV DPTR,#TABLEM
22、OVC A,A+DPTRMOV P0,AMOV A,BUFFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1MOVC A,A+DPTRMOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,A+DPTRMOV STL0,AMOV TL0,ASETB TR0NDK4A: MOV A,P1ANL A,#0FHXRL A,#0FHJNZ NDK4ACLR TR0KKEY4: MOV A,#0FFHMOV P2,A MOV A,P2JB ACC.0, KKEY5LCALL DELY10MSMOV A,P2JB ACC.0, KKEY5MO
23、V BUFF,#16LJMP START22START22: MOV A,BUFFCJNE A,#16,KKEY5LJMP START2KKEY5: LJMP MAIN START2: MOV TMOD,#10H ;设 T1 在 M1 MOV IE,#88H ;中断使能 START0: MOV 30H,#00 ;取简谱码指针 NEXT: MOV A,30H ;简谱码指针载入 A MOV DPTR,#TAB ;至 TAB 取简谱码 MOVC A,A+DPTR ;MOV R2,A ;渠道的简谱码暂存于 R2 JZ END0 ;是否渠道 00(结束码) ANL A,#0FH ;不是,则取低 4 位(
24、节拍码) MOV R5,A ;将节拍码存入 R5 MOV A,R2 ;将取到的简谱码再载入 A SWAP A ;高低 4 位交换 ANL A,#0FH ;取低 4 位(音符码) JNZ SING ;取到的音符码是否为 0? CLR TR1 ;开始,则不发音 SJMP D1 ;跳至 D1 SING: DEC A ;取到的音符码减 1(不含 0) MOV 22H,A ;存入(22H) RL A ;乘 2 MOV DPTR,#TAB1 ;至 TABLE1 取相对的高位字节计数值 MOVC A,A+DPTR ; MOV TH1,A ;取到的高位字节存入 TH0 MOV 21H,A ;取到的高位字节存入
25、(21H) MOV A,22H ;在载入取到的音符码 RL A ;乘 2 INC A ;加 1 MOVC A,A+DPTR ;至 TABLE1 取相对的低位字节计数值 MOV TL1,A ;取到的低位字节存入 TL0 MOV 20H,A ;取到的低位字节存入(20H) SETB TR1 ;启动 TIMER0D1: LCALL DELAY ;其本单位时间 1/4 拍 187 毫秒 INC 30H ;取简谱码指针加 1 JMP NEXT ;取下一个简谱码 END0: CLR TR1 ;停止 TIMER0 LJMP MAIN ;重复循环 TIM1: PUSH ACC ;将 A 的值暂存于堆栈 PUS
26、H PSW ;将 PSW 的值暂存于堆栈 MOV TL1,20H ;重设计数值 MOV TH1,21H ; CPL P3.0 ;将 P1.0 位反相,控制蜂鸣器发声 POP PSW ;至堆栈取回 PSW 的值 POP ACC ;至堆栈取回 A 的值 RETI DELAY: MOV R7,#02 D2: MOV R4,#187 D3: MOV R3,#248 DJNZ R3,$ DJNZ R4,D3 DJNZ R7,D2 RET DELY10MS:MOV R6,#10D10: MOV R7,#248DJNZ R7,$DJNZ R6,D10RETINT_T0:MOV TH0,STH0MOV TL0
27、,STL0CPL P3.0RETITABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HTABLE1: DW 64021,64103,64260,64400DW 64524,64580,64684,64777DW 64820,64898,64968,65030DW 65058,65110,65157,65178TAB1: ;决定节拍 DW 64260,64400,64521,64580 DW 64684,64777,64820,64898 DW 64968,65030,65058,65110 DW
28、65157,65178,65217 TAB: ;乐曲 DB 02H,82H,62H,52H,48H,02H,52H,32H,22H,18H DB 83H,91H,72H,62H,51H,61H,71H,61H,83H,61H DB 81H,51H,61H,71H,61H,51H,46H,82H,32H,52H DB 22H,42H,16H,21H,41H,18H,0E4H,13H,21H,43H DB 51H,21H,41H,12H,83H,81H,61H,81H,58H,53H DB 61H,31H,22H,13H,21H,42H,52H,0E2H,42H,21H DB 11H,91H,41
29、H,18H,63H,81H,32H,52H,21H,41H DB 16H,0E4H,11H,21H,31H,51H,26H,11H,21H,43H DB 51H,82H,62H,52H,61H,51H,42H,21H,11H,0E4H DB 44H,21H,41H,21H,11H,0E1H,11H,21H,41H,18H DB 61H,81H,51H,61H,51H,41H,32H,21H,41H,18H DB 08H,0H,04H ;曲子最后静音 5 拍长的时间 DB 00H ;乐曲结束 END九、心得体会:这次设计从软件方面来讲不是很难,程序相对长一点,但都是书本上所学的知识,主要是中端及
30、其服务程序的编写。在protues 上仿真,则起到很好的效果,因为元器件都是理想状态的,但做出实物来却没有那么简单啦。经过多次调试、修改才得以出结果。将程序烧入芯片,调试成功后,可任意弹奏自己想要的旋律。同时可以播放一首示例歌曲,但是也有不足之处的,声音杂音时而有点大,不稳定。经过本次课程设计,我们比较好的把理论知识与实践相结合,而我们在也本次设计中收获不少。设计过程中,首先,对于汇编语言多了一层了解,其次,还有硬件的接线,还有 8051 芯片的引脚方面,都让我们收获不少。加强了自身的动手能力。十、参考文献1周美娟 肖来胜 单片机原理及系统设计清华大学出版社2 谢自美. 电子线路设计实验测试华中理工大学出版社,