电子琴设计摘要:本设计是用AT89S52单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器、LED显示器等模块组成核心主控制模块。
在主控模块上设有8个按键,其中7个按键控制7个音符,而1个作为功能转换键使用,具有手动随意弹奏和自动播放乐曲的功能。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:AT89C52单片机 LED显示器扬声器 1×8矩阵键盘 7个音符自动播放乐曲1 引言电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
目前市场上各种品牌、型号的电子琴有上百种,由几十块的玩具电子琴到几百,几千的学习、演奏用琴真是琳琅满目,电子琴能够模仿各种音色和具有自动伴奏功能,这些是电子琴最基本的特征。
档次的高低无非是音色模仿的是否逼真,自动伴奏设计的是否丰富,或者增加了其他制作,编曲功能的。
本设计主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴系统硬件组成。
利用单片机产生不同频率来获得我们要求的7个音符,最终可随意弹奏想要表达的音乐。
并且本设计分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
2 总体设计方案2.1 设计思路2.1.1 从系统实现的功能上来看,电子琴的设计主要分为手动弹奏乐曲和自动播放音乐两大部分组成。
手动弹奏乐曲是根据具体的硬件键盘设置了7个音符按键和1个功能转换键,自动播放音乐是在单片机的存储器中通过软件编程的方法放置音乐代码和相关播放程序来实现。
2.1.2 从系统硬件结构上来看,主要使用到52系列单片机、矩阵1×8键输入电路、LED 数码管显示电路、扬声器以及电源电路等等。
将这些硬件电路有机地结合起来使之满足电子琴设计的基本硬件要求。
2.1.3 从系统软件设计角度来看,将电子琴的设计采用程序模块化设计方法,将程序分为主程序、键盘扫描程序模块、数码显示模块、转换控制模块、音乐产生模块等等。
此外,采用程序设计思想,将中断定时方式与外部按键查询方式相结合,实现手动弹奏乐曲到自动播放音乐的切换。
2.1.4 从音乐产生原理方面来看,通过控制单片机的定时器的定时时间产生不同频率的音频脉冲,经放大后驱动扬声器发出不同音乐的声音。
用软件延时来控制发音时间的长短,控制节拍。
把音乐的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在程序存储器中,由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出音频脉冲的持续时间。
因此,我们可以综合上述的不同角度的方案设计原理,主要从软件和硬件两部分进行有计划有步骤的系统分析与设计,最终确立总体的设计方案。
方案确立1、手动弹奏乐曲和自动播放音乐用非编码的矩阵键盘来实现,其中包括数字键和功能键,功能键主要是将手动弹奏模块转换到自动播放乐曲模块。
手动弹奏乐曲中7个键分别设置不同的7个音符,然后通过功能键可实现手动弹奏乐曲到播放乐曲之间的切换。
2、一位LED数码管显示当前工作状态,将按下的键值送入显示,并一一对应各个音符。
采用动态扫描输出。
3、软件的设计主要包括矩形键盘键值的读取、LED动态扫描输出程序、手动弹奏乐曲程序和音乐自动播放程序。
4、此次程序设计主要分为两大块:手动弹奏乐曲程序和自动播放程序。
两者之间用功能转换程序对其进行结合,并实现各种不同功能的控制。
2.2 设计方框图基于单片机系统的电子琴的基本结构如图(1)所示图(1)3 设计原理分析3.1演奏音乐原理通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经放大后驱动蜂鸣器发出不同音节的声音。
用软件延时来控制发音时间的长短,控制节拍。
把乐谱的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中,由程序到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间。
单片机晶振频率为12MHZ时,乐曲中的音符、频率及定时常数之间的对应关系可制成表格。
本次设计中,定时常数是有16定时器T0根据不同的音符,装入不同的初值实现延时的,而延时常数是在自动播放音乐部分使用,控制不同音符的节拍,其延时常数是通过16位定时器T1实现的。
根据设计要求给出的各音符频率,我们只需要的各音符频率与计数值T的关系如表(1)所示表(1): C调各音符频率与计数值T的关系音符频率(Hz)半周期(ms)简谱码T值定时值(H)简谱码T值定时值(D)1 Do262 1.90F894H626282 Re294 1.70F95CH638353 Mi330 1.51FA1AH640214 Fa349 1.43FA6AH641035 So392 1.28FB00H642606 La440 1.14FB8CH644007 Si494 1.01FC0EH645243.2 键盘扫描原理先将1×8矩阵键盘的行(P2.0)和列(P1口)全部置为高电平,然后再逐行置为低电平,当有键按下时P1口的值会发生相应的改变,通过与给定数的比较,判定是否有键按下和是否键已松开。
并给定列号并保存,根据所给的列号的值,一方面通过P0口给LED送入确定好的段码数值,从而相对应地在LED上显示音符数字,另一方面从TABLE表中取出相应的值,给此时作为16位定时器的T0装入初值,不同的音符给T0装入的初值不同,即定时器的定时时间将不相同,将产生不同频率的音频脉冲,转换成声音播出的频率也将不同,从而实现7个不同的音符。
同时,通过示波器可查看P3.7的音频输出方波。
3.3 硬件电路设计分析因为AT89CXX系列与MCS-51系列单片机相比,有两大优势:第一,片内程序存储器采用闪速存储器,使程序的写入更方便;第二,提供了更小尺寸的芯片,使整个硬件电路的体积更小。
它以较小的体积、良好的性能价格比倍受青睐。
本次综合实验设计采用89C52单片机。
3.3.1 按键模块的设计如图(2)所示为1×8矩阵键盘模块,其行接P2.0口,其列逐一与P1口相接图(2)因为不同的音符对应的频率是不同的,当按到不同的按键,发出的声音不一样,所以其产生的方波频率信号也会不一样,如下列7个小图①~⑦对应着7个不同音符的方波频率信号。
图① 1 Do 图② 2 Re图③ 3 Mi 图④ 4 Fa图⑤ 5 So 图⑥ 6 La图⑦ 7 Si3.3.2LED数码管显示模块的设计如图(3)所示,为LED数码显示模块电路的设计部分图(3) 一位共阳数码管本系统用单片机的P0口的P0.0~P0.6来控制LED显示器的数字显示。
当有7个音符按键1~7中有被按下,LED数码管将对应显示出该音符的数字,从而可以通过手动和眼看来确定所按的是哪个音符,应该发出哪个音符的声音。
而最后一个功能转换键一旦被按下,程序将会调用倒计3秒子程序,LED数码管将从3开始倒数到0,紧接着进入自动播放音乐子程序,播放程序中通过表格数据形式存放在ROM的音乐代码而形成的乐曲3.3.3扬声器模块的设计如图(4)所示为扬声器模块电路图(4) 扬声器模块电路电磁式蜂鸣器由振荡器、电磁线圈、磁铁振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。
振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
本设计的蜂鸣器通过驱动电路与单片机的P3.7连接,单片机就可以通过P3.7的输出信号频率就行控制。
令外,通过示波器接到P3.7可方便我们观察波形。
3.3.4复位和晶振等其他附属部分的电路设计如图(5)所示,为复位和晶振等其他附属部分的电路图(5) 复位和晶振等其他附属部分的电路XTAL1、XTAL2分别是系统时钟信号f osc的输入和输出端。
晶振电路的设计可以两个电容与一个晶振即可,用来产生一个约等于12MHZ的稳定的频率。
复位是单片机的初始化操作,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
本系统采用上电与按键复位电路,为了防止干扰串扰复位端,所以再接一个去耦电容。
4 实验数据1、利用AT89C52的内部定时器T0使其工作在方式1的定时方式下,改变计数值TH0及TL0以产生不同频率的方法产生不同音符。
计数脉冲值与频率的关系式是:N=fi÷2÷fr式中,N是计数值,fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz),fr是想要产生的频率。
其计数初值T的求法如下:T=65536-N=65536-fi÷2÷fr 实验中的K=65536,fi=1MHz,根据设计要求中给出的音阶频率表,可求出各自的计数初值。
T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr因此,可以通过计算求得各音阶的简谱码T值如下:1 Do的T=65536-500000/262.1=636282 Re的T=65536-500000/293.7=638363 Mi的T=65536-500000/329.6=640214 Fa的T=65536-500000/349.2=641045 So的T=65536-500000/392.0=642616 La的T=65536-500000/440.0=644007 Si的T=65536-500000/493.9=64524相应求得在要发出不同音符时先给定时器T0装入的初值如下表:5 结束语在这一周里,一有空余时间都把时间花在本次实验。
其过程很艰苦,有时候做到深夜,但收获是颇多。
一开始拿到题目,关于不同频率的音符,我就知道肯定需要用到定时中断来实现,可是自己学习的进度很慢,大多数时间都是自学。
不过后来用大量时间去细看每一章节,做起实验来就容易多了。
本次设计性实验让我无论是在硬件还是软件方面都有了很大的提高,同时也增强了自己的信心和对学习的兴趣。
这些也是老师严格要求我们做好每一个实验的好处。
参考文献[1] 潘永雄.新编单片机原理与应用(第二版).西安电子科技大学出版社,2007[2] 杨欣.51单片机应用从零开始:清华大学出版社,2008[3] 彭伟.单片机C语言程序设计实训100例——基于8051+proteus仿真.电子工业出版社,2010附录1:总体电路图附录2:程序流程图设计附录3:源程序代码KEYBUF EQU 30HSTH0 EQU 31HSTL0 EQU 32HTEMP EQU 33HSPK EQU P3.7 ; 发声器所在端口ORG 0000HLJMP STARTORG 000BHLJMP INT_T0 ;定时器0放置弹奏乐曲程序ORG 001BHLJMP TIME0START:MOV TMOD,#11H ;设置定时器的工作方式,定时器T0和T1都是方式1,作为16为定时计数器使用(定时方式)SETB ET0 ;开各中断开关SETB ET1SETB EA ;开放中断总允许和源允许ACALL SAOMIAO ;进入手动弹奏程序SJMP START;********手动弹奏程序********SAOMIAO:MOV P2,#0FFH ;手动弹奏程序MOV P1,#0FFH ;先将键盘的行和列全部置为高电平,然后再逐行置为低电平CLR P2.0MOV A,P1XRL A,0FFHCJNE A,#00H,NEQ ;判断有没键按下LJMP NOKEYS ;没有按键按下即跳转到NOKEYSNEQ: ;有按键按下即跳到NEQLCALL DELY10MS ;延时10msMOV A,P1 ;消除扰动和干扰XRL A,0FFHCJNE A,#00H,NEQ1LJMP NOKEYSNEQ1:MOV A,P1 ;判断是否按下#0键CJNE A,#0FEH,NK1 ;按下#0键即顺序执行程序,否则跳到NK1检查下一键位 MOV KEYBUF,#0 ;保存列号#0MOV P0,#79H ;让LED显示为1LJMP DK1NK1:CJNE A,#0FDH,NK2 ;判断是否按下#1键MOV KEYBUF,#1 ;保存列号#1MOV P0,#24H ;让LED显示为2LJMP DK1NK2:CJNE A,#0FBH,NK3 ;判断是否按下#2键MOV KEYBUF,#2 ;保存列号#2MOV P0,#30H ;让LED显示为3LJMP DK1NK3:CJNE A,#0F7H,NK4 ;判断是否按下#3键MOV KEYBUF,#3 ;保存列号#3MOV P0,#19H ;让LED显示为4LJMP DK1NK4:CJNE A,#0EFH,NK5 ;判断是否按下#4键MOV KEYBUF,#4 ;保存列号#4MOV P0,#12H ;让LED显示为5LJMP DK1NK5:CJNE A,#0DFH,NK6 ;判断是否按下#5键MOV KEYBUF,#5 ;保存列号#5MOV P0,#02H ;让LED显示为6LJMP DK1NK6:CJNE A,#0BFH,NK7 ;判断是否按下#6键MOV KEYBUF,#6 ;保存列号#6MOV P0,#78H ;让LED显示为7LJMP DK1NK7: CJNE A ,#7FH,NK8NK8: LJMP CHOICEDK1:MOV A,KEYBUFMOV B,#2MUL AB ;对应读取表格TABLE1的数据 MOV TEMP,AMOV DPTR,#TABLE1MOVC A,@A+DPTRMOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOV STL0,AMOV TL0,ASETB TR0 ;开启定时器T0,T0开始计数DK1A:MOV A,P1XRL A,#0FFHJNZ DK1AMOV A,P2ANl A,#0f0HMOV P2,ACLR TR0NOKEYS: RET;*******功能转换程序********CHOICE:MOV P2,#0FFH ;功能转换程序MOV P1,#0FFHCLR P2.0MOV A,P1CJNE A,#7FH,NEXT1111 ;按下了P1.7键后,顺序执行,否则则跳转到NEXT1111NEXT111:MOV P2,#0FFHMOV P1,#0FFHCLR P2.0MOV A,P1XRL A,#0FFHJNZ NEXT111 ;如果A不为0,即按键有变化,继续循环ACALL DISPLAY ;如果按键没变化,即调用DISPLAYMOV SP,#60HMOV DPTR,#TABLEACALL MUSICNEXT1111:LJMP SAOMIAO;*******自动播放音乐程序********MUSIC: MOV 21H,#00HMOV P2,#0FFHMOV P1,#0FFHCLR P2.0MOV A,P1JNB ACC.7,AA1SETB 21H.7AA1: MOV P2,#0FFHCLR P2.0MOV A,P1XRL A, #0FFHJNZ AA1JNB 21H.7,NEXT1111 CLR AMOVC A,@A+DPTRMOV R1,AINC DPTRCLR AMOVC A,@A+DPTRMOV R0,AORL A,R1JZ NEXT1MOV A,R0ANL A,R1CJNE A,#0FFH,NEXTSJMP MUSICNEXT: MOV TH1,R1MOV TL1,R0SETB TR1SJMP NEXT2NEXT1: CLR TR1NEXT2: CLR AINC DPTRMOVC A,@A+DPTRMOV R2,ALOOP1: ACALL DELAYDJNZ R2,LOOP1INC DPTRSJMP MUSICREP12: CLR TR1RETTIME0: MOV TH1,R1MOV TL1,R0CPL P3.7RETIDEL1S: MOV R5,#30D1: MOV R6,#100D2: MOV R7,#80DJNZ R7,$DJNZ R5,D1RETDEL:NOPDEL3:MOV R4,#02HDEL4:NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETNOP;********延时10ms子程序******DELY10MS:MOV R6,#10D3: MOV R7,#248DJNZ R7,$DJNZ R6,D3RET;*******T0中断服务子程序**********INT_T0:MOV TH0,STH0MOV TL0,STL0CPL P3.7RETI;******倒计3秒进入自动播放音乐子程序******** DISPLAY:MOV DPTR,#table0MOV R0,#0LOOP10 :MOV A,R0MOVC A,@A+DPTRMOV P0,ACLR P2.0LCALL DELAY0INC R0CJNE R0,#4,LOOP10RET;*******数码显示DISPLAY9*********DISPLAY9:MOV DPTR,#table8 ;数码管显示数字MOV R0,#0LOOP15 :MOV A,R0MOVC A,@A+DPTRMOV P0,A ;送到P0口显示数字CLR P2.0LCALL DELAY0INC R0CJNE R0,#10,LOOP15RETDELAY0:MOV R7,#50DELA: MOV R6,#100DEL12: MOV R5,#100DJNZ R5,$DJNZ R6,DEL12DJNZ R7,DELARET;*******延时子程序DELAY********DELAY: MOV R7,#02D5: MOV R6,#187D6: MOV R5,#248DJNZ R5,$DJNZ R6,D6DJNZ R7,D5RETtable0: DB 30h,24h,79h,40h ;倒计时3秒table8: DB 10h,00h,78h,02h,12h,19h,30h,24h,79h,40h ;9,8,7,6,5,4,3,2,1,0 TABLE1: DW 62628,63835,64021,64103,64260,64400,64524 ;定时器TO初值TABLE: DB 0FDH,80H,03H, 0FDH,80H,01H ;音乐代码DB 0FDH,0C6H,04H, 0FDH,80H,04HDB 0FEH,2AH,04H, 0FEH,02H,04HDB 00H,00H,04HDB 0FDH,80H,03H, 0FDH,80H,01HDB 0FDH,0C6H,04H, 0FDH,80H,04HDB 0FEH,5CH,04H, 0FEH,2AH,04HDB 00H,00H,04HDB 0FDH,80H,03H, 0FDH,80H,01HDB 0FEH,0C0H,04H, 0FEH,84H,04HDB 0FEH,2AH,04H,0FEH,02H,04HDB 0FDH,0C6H,04HDB 0FEH,98H,03H,0FEH,98H,01HDB 0FEH,84H,04H,0FEH,2AH,04HDB 0FEH,5CH,04H,0FEH,2AH,04HDB 00H,00H,04HDB 0FFH,0FFH END。