1简易电子琴的设计一.设计目的设计一个简易电子琴,要求能够发出1、2、3、4、5、6、7等七个音符,并且能具备自动播放功能。使用元件:AT89C51,喇叭,按键,三极管等。(1).能够实现基本的琴键功能即每按下一个琴键,单片机能够检测到键盘的按键,并根据按键的位置通过程序来控制,使蜂鸣器发著不同频率的声音,声音延迟延迟一段时间,等到按键2放开后,声音停止。然后再继续扫描,看是否有键按下,如此循环下去,即实现基本的琴键功能。(2).能够实现通过按键自动播放歌曲的功能在键盘上设置一个功能键,按下之后会根据功能键跳转到自动播放歌曲的程序,来播放相应的歌曲。本次设计硬件部分的设计由周桂龙同学负责,软件部分的设计则由周彬负责。二.系统设计2.1最小系统单片机:本次设计使用单片机芯片AT89C51,AT89C51的工作特性:·内含4KB的FLASH存储器檫写次数1000次;·内含128字节的RAM;·具有32根可编程I/O线;·具有2个16位编程定时器3·具有6个中断源,5个中断矢量,2级优先权的中断结构;·具有1个全双工的可编程串行通信接口;·具有1个数据指针DPTR;·具有可编程3级程序锁定位;·AT89C51的工作电源为5(1±0.2)V且典型值为5V;·AT89C51最高工作频率为24MHZ;·AT89C51的编程频率为3~24MHZ,编程启动电流和启动电压分别为1mA、5或12V。图(1)2.2硬件设计51单片机的P2口连接8个按钮开关,作为电子琴的琴键键盘,喇叭接与P1.0口,用两个NPN型的三极管组成放大电路来驱动喇叭播放音乐。P3.0口作为自动音乐播放控制口,连接一个按钮开关,当按下该按钮时,喇叭自动播放歌曲。系统总框图如图(2)所示。图(2)2.3软件设计(1)主程序(弹奏程序)主程序的功能是给寄存器赋初值,判断播放键是否按下,即P3.0是否为0,按下则转入播放子程序,若没按下则进入弹奏程序,判断有无键盘按下,即读取P2口的状态,有则播放相应的音调。主程序流程图如图(3)所示。音调实际上是有固定周期的信号,每个音调的频率都是固定的。因此只要计算出每个音的频率就可以产生相应的声音。在弹奏程序中利用查表法,根据表(1)4将开关状态转换成延时子程序的执行次数,而延迟子程序是为了产生音频的半周期,其延时时间等于(10A+2)us。另外,按钮开关S1的键值取1,S2的键值取2……依次类推。若按下S1的话,则读取表格中的第一个数据,即ACC=95,执行一次延时子程序,其半周期约为0.95ms,执行2次则为1.9ms,其频率为526Hz,大概是中音的Do。其他键也是一样的算法。延时程序如下:DELAY:NOP;1usMOVR4,#3;1usDJNZR4,$;2*R7usDJNZ22H,DELAY;2usRET;2us上面程序的时间延迟为:t=A*(1+1+2*R4+2)+2=A*(1+1+2*3+2)+2=(10A+2)usYNYESNO开始初始化读入P2口状态P3.0为0?RRCACY=0?RRCA驱动喇叭延时依R1读取音阶5N0NOYES图(3)主程序流程图表(1)按键音阶参数S1中音Do95S2中音Re85S3中音Mi76S4中音Fa71S5中音So64S6中音La57S7中音Si50S8高音Do48(2)播放子程序播放子程序流程图如图(4)所示。此次所要演奏的音乐是《生日快乐》,将乐谱简化成音谱,如下所示。|DODOREDO|FAMI|DODOREDO|SOFA||DODODO^LA|FAMIRE^|SISILAFA|SOFA|再根据表(2),将THx与TLx的值带入音谱,如下所示。第一小节:252,68,252,68,252,173,252,68第二小节:253,52,253,10第三小节:252,68,252,68,252,173,252,68CY=0?6第四小节:253,131,253,52第五小节:252,68,252,68,252,34,253,200第六小节:253,52,253,10,254,87第七小节:254,6,254,6,253,200,253,52第八小节:253,131,253,52,0将结果填入程序里的TONE表格。紧接着制作节拍表格,同样从简谱里,写出其拍子数,如下:|1/2、1/2、1、1|1、2|1/2、1/2、1、1|1、2||1/2、1/2、1、1|1、1、1|1/2、1/2、1、1|1、2|再根据表(3),将中断此处带入音谱,将结果填入程序里的BEAT表格。当播放按键按下时,就可以自动播放音乐了。如下:|4、4、8、8|8、16|4、4、8、8|8、16||4、4、8、8|8、8、8|4、4、8、8|8、16|NOYESNOYES图(4)播放子程序流程图初始化载入音阶载入节拍音乐结束?返回播放程序入口节拍结束?7表(2)音符频率(HZ)音符频率(HZ)低1DO262#4FA#740#1DO#277中5SO784低2RE294#5SO#831#2RE#311中6LA880低3M330#6932低4FA349中7SI988#4FA#370高1DO1046低5SO392#1DO#1109#5SO#415高2RE1175低6LA440#2RE#1245#6466高3M1318低7SI494高4FA1397中1DO523#4FA#1480#1DO#554高5SO1568中2RE587#5SO#16618#2RE#622高6LA1760中3M659#61865中4FA698高7SI1967表(3)拍数中断次数拍数中断次数拍数中断次数1/811/241又1/4101/423/461又1/2123/8318216(3)音调中断子程序一首完整的曲子有音调和节拍组合而成,音调的频率是固定的,在音调中断子程序中,是利用定时器定时的方式来产生频率的,不同与演奏程序中的查表方式。音调中断子程序流程图如图(5)所示。图(5)音调中断子程序返回显示程序入口关闭TIMER0驱动喇叭填入TIMER0定时值启动TIMER09(4)节拍中断子程序节拍有快有慢,拍子越短节奏越快,拍子越长节奏越慢。此处用定时器中断的方法产生节拍,节拍子程序流程图如图(6)所示。采用mode1,定时值初值设为62500,若要产生1/2拍的长度,则执行4次中断,产生3/4拍的长度,则执行6次中断,依次类推。YES!!!NO图(6)节拍中断子程序分别打开各位控R5!=0?指定定时时间启动TIMER0返回显示程序入口指定定时时间启动TIMER010三.仿真与调试根据功能需求与电路结构编写程序,然后将该程序用Keil软件对程序进行调试,再将调试正确的程序用烧录器烧进AT89C51芯片中,讲芯片安装到连接好的电路中,进行实际的弹奏和播放操作。调试如图(7)所示。调试步骤:打开Keil软件,新建一个工程,在工程中载入一个后缀为.ASM的源程序文件,将编写好的程序写入。进行调试仿真,排除错误,最终产生一个正确的.HEX文件,将电脑连接到烧录器,选择该.HEX文件,将目标程序写入芯片。图(7)11四.课程小结通过这一周的紧张工作,终于完成了简易电子琴的设计,这个课程设计使我受益匪浅,他不仅使我对软件设计更加熟练,更使我了解了硬件设计的整个流程,并且加深了我对新型单片机这门课内容的理解,扩充了我的知识面。这个课程设计也培养了我们的耐心和毅力,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,由于这个课程设计也使我积累了一些经验,相信这些经验在我以后的学习工作中会有很大的作用。12五.参考文献◆《单片机原理及其应用》范力旻编著电子工业出版社◆《51系列单片机设计实列》楼然苗李光飞编著北航出版社◆《例说8051》张义合陈敌北编著人民邮电出版社◆《单片机实用技术问答》谢宜仁主编人民邮电出版社◆《8051单片机实践与应用》吴金茂沈庆阳郭庭吉编著清华大学出版社◆《单片机原理及其接口技术》(第二版)胡汗才编著北京大学出版社◆《电子琴原理及电路》徐明远,徐多闻.上海科学技术文献出版社◆《电子琴原理使用与维修》刘启武,刘启文.电子工业出版社◆◆:元件清单序号名称代号型号数量1贴片电容C1C230pF22贴片电容C310uF13贴片电容C40.1uF14贴片电容C50.47uF15贴片电阻R11K1146贴片电阻R210K17电解电容C61000uF18电解电容C7470uF19发光二极管10晶振11.0592M111扬声器IC38Ω112电阻R3~R101K813电阻R112K114三极管V1~V38550215按键S1~S8815附录2:总体原理图16附录3:实物图17附录4:程序BASEEQU-62500ORG0000HJMPSTARTORG000BHJMPTONE_INTORG001BHJMPBEAT_INTSTART:MOVP3,#0FFH;主程序MOVP2,#0FFHMOVA,P3CJNEA,#0FEH,TANZOUJMPINITIALTANZOU:MOVA,P2;弹奏程序SETBCYMOVR0,#8MOVR1,#0LOOP:RRCAJNCSOUNDINCR1DJNZR0,LOOPJMPSTARTSOUND:MOVDPTR,#TIMESMOVA,R1MOVCA,@A+DPTRMOV22H,ACPLP1.0CALLDELAYMOVA,22HCPLP1.0CALLDELAYJMPSTARTDELAY:NOPMOVR4,#3DJNZR4,$DJNZ22H,DELAYNOPNOPRET18INITIAL:MOVTMOD,#11H;播放子程序MOVIE,#10001010BMOVSP,#70HCLRF0MOVR7,#0MOVR6,#0LOAD_TONE:MOVDPTR,#TONE;载入音阶MOVA,R7MOVCA,@A+DPTRJNZCONTINUEMOVR6,#0MOVR7,#0JMPLOAD_TONECONTINUE:MOV20H,AMOVTH0,AINCR7MOVA,R7MOVCA,@A+DPTRMOV21H,AMOVTL0,AINCR7SETBTR0LOAD_BEAT:MOVDPTR,#BEAT;载入节拍MOVA,R6MOVCA,@A+DPTRMOVR5,AMOVTH1,#HIGH(BASE)MOVTL1,#LOW(BASE)SETBTR1JNBF0,$CLRF0JMPLOAD_TONETONE_INT:CLRTR0;音阶中断子程序CPLP1.0MOVA,20HMOVTH0,AMOVA,21HMOVTL0,ASETBTR019RETIBEAT_INT:CLRTR1;节拍中断子程序DJNZR5,AGAINCLRTR0SETBF0JMPEXIT1AGAIN:MOVTH1,#HIGH(BASE)MOVTL1,#LOW(BASE)SETBTR1EXIT1:RETITIMES:DB95,85,76,71,64,57,50,48TONE:;音阶表DB252,68,252,68DB252,173,252,68DB253,52,253,10DB252,68,252,68DB252,173,252,68DB253,131,253,52DB252,68,252,68DB252,34,253,200DB253,52,253,10DB254,87DB254,6,254,6DB253,200,253,52DB253,131,253,52,0BEAT:;节拍表DB4,4,8,8DB8,16DB4,4,8,8DB8,16DB4,4,8,8DB8,8,8DB4,4,8,8DB8,16,0END20