电子琴的设计 课程设计_第1页
电子琴的设计 课程设计_第2页
电子琴的设计 课程设计_第3页
电子琴的设计 课程设计_第4页
电子琴的设计 课程设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1、 前言.12、 方案论证.13、 系统框图.24、 硬件设计.21、89c52单片机芯片.22、 发声电路.53、按键电路.6五、软件设计.61、主程序流程图.62、初使化程序.63、按键扫描及消抖程序.74、发声程序.85、延时程序.96、中断子程序.9六、系统调试.101、硬件调试.102、软件调试.12七、设计总结.14八、参考书目.15九、附录.161、附录一:系统设计原理框图.162、附录二:电子琴音符频率表.183、附录三:二十一音电子琴源程序.194、附录四:二十一音电子琴仿真图.245、附录五:二十一音电子琴硬件清单.256、附录六:keil调试图和二十一音电子琴实物图

2、.261、 前言单片机因其体积小、功能强、价格低廉而得到广泛应用,同时随着我国经济的飞速发展,单片机在越来越多的领域中得到了很好的应用。单片机在中国产品应用领域十分广泛,也与人民生活越来越密切。因此这次课程设计,我们尝试做一个21键的电子琴,将我们平时所学,学以致用。本设计主要是通过对电子琴主体部分的电路进行模仿设计,达到电子琴固有的基本功能。整个设计利用单片机定时器可发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同音调原理来设计。首先,利用21个独立按键电路把我所需要发出声音的信号输入单片机;其次通过程序,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一

3、次反转发出脉冲高电平,由于定时参数不同,就发出不同频率的脉冲,本设计中按键一次,就会调用一个延时程序,在延时后继续检测按键,若此时又有键被按下,若被按下的仍为原键则声音不变,否则键盘会译出被按下的另一个键的音调。从而实现了一个简易电子琴的功能。二、方案论证第一种方法是使用循环语句来实现延时。让单片机循环的执行某条指令然后根据单片机每条指令运行的时间以及循环的次数来计算延时时间。从延时程序可知,djnz指令执行时间为2个机器周期,mov指令执行时间为1个机器周期,对于单片机的晶振频率为12mhz时,机器周期为1 s。因此可以根据这些指令的执行时间和每条指令的循环次数计算出以上的延时程序延时时间大

4、约为50ms。但这种方法的计算的延时时间不是很准确并且为达到一定的延时时间先必须进行很复杂的运算。所以在延时时间要求不严格的时候才采用这种方法。但对于电子琴电路,由于每个音符的频率值要求比较严格,变化范围不能太大,因此产生方波的频率也要求比较严格,不能采用延时程序来产生此方波。第二种方法是使用单片机的定时/计数器延时。at89c51单片机内部有两个16位的定时计数器t0和t1,单片机的定时计数器实际上是个计数装置,它既可以对单片机的内部晶振驱动时钟计数也可以对外部输入的脉冲计数,对内部晶振计数时称为定时器,对外部时钟计数时称为计数器。当对单片机的内部晶振驱动时钟计数时,每个机器周期定时计数器的

5、计数值就加1,当计数值达到计数最大值时计数完毕并通知单片机的cpu;对外部输入的时钟信号计数时,外部时钟的每个时钟上升沿定时计数器的计数值就加1,当计数值达到计数最大值时计数完毕并通知单片机的cpu。因此,如果知道单片机的机器周期或者外部输入时钟信号的周期,单片机就可以根据定时器的计数值计算出定时的时间。用此方法定时十分准确,想得到多大的延时时间就可以给定时器赋一定的计数初值,定时器从预先设置的计数初值开始不断增1当增加到计数最大值时计数完毕,调整计数初值的大小就可以调整定时器定时的时间,从而达到准确的延时。本系统中就采用第二种方法通过定时/计数器延时。3、 系统框图系统设计原理框图见附录一4

6、、 硬件设计本次设计采用at89c52单片机作为面板控制部件,at89c52用11.0592mhz的晶振和两个微调电容形成晶振电路。面板上有21个按键,用于输入音符;由放大器和蜂鸣器作为声音信号的输出电路;一个直流稳压电路为系统提供一个稳定的直流电压。硬件系统框图如图2-1所示89c52芯片发声电路按键输入电路晶振电路 图4-1 硬件原理框图1、89c52单片机芯片89c52是intel公司mcs-51系列单片机中基本的产品,它采用intel公司可靠的chmos工艺技术制造的高性能8位单片机,属于标准的mcs-51的hcmos产品。它结合了hmos的高速和高密度技术及chmos的低功耗特征,它

7、基于标准的mcs-51单片机体系结构和指令系统,属于80c51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。89c52内置8位中央处理单元、256字节内部数据存储器ram、8k片内程序存储器(rom)32个双向输入/输出(i/o)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,89c52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结cpu而ram定时器、串行口和中断系统维持其功能。掉电模式下,保存ram数据,时钟振荡停止,同时停止芯片内其它功能。89c52有pdip(40pin

8、)和plcc(44pin)两种封装形式。 (1)功能特性标准mcs-51内核和指令系统片内8krom(可扩充64kb外部存储器)32个双向i/o口256x8bit内部ram(可扩充64kb外部存储器)3个16位可编程定时/计数器时钟频率3.5-12/24/33mhz向上或向下定时计数器改进型快速编程脉冲算法6个中断源5.0v工作电压全双工串行通信口布尔处理器帧错误侦测4层优先级中断结构自动地址识别兼容ttl和cmos逻辑电平空闲和掉电节省模式pdip(40)和plcc(44)封装形式(2) 管脚说明vcc:供电电压。 gnd:接地。p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8tt

9、l门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在fiash编程时,p0 口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时

10、,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。p3

11、口作为at89c51的一些特殊功能口,管脚 备选功能p3.0 rxd(串行输入口)p3.1 txd(串行输出口)p3.2 /int0(外部中断0)p3.3 /int1(外部中断1)p3.4 t0(记时器0外部输入)p3.5 t1(记时器1外部输入)p3.6 /wr(外部数据存储器写选通)p3.7 /rd(外部数据存储器读选通)rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频

12、率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行movx,movc指令是ale才起用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。/psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。/ea / vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/

13、ea将内部锁定为reset;当/ea端保持高电平时,此间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。xtal2:来自反向振荡器的输出。2、发声电路发声电路是这次设计的电路中的一个重要的组成部分,它承担着把单片机所产生的声音信号放大并输出的重要作用。而我的设计中的发声电路主要是由放大器和蜂鸣器组成。放大部分,主要由三极管完成。这里的三极管属于npn型三极管,而对三极管管脚的判断可以使用下面的方法。一、判断三极管基极。对于npn型三极管,用黑表笔接某一个电极,红表笔分别接另外两个电极,若测量结果阻值都较小

14、,交换表笔后测量结果阻值都较大,则可断定第一次测量中黑表笔所接电极为基极;如果测量结果阻值一大一小,相差很大,则第一次测量中黑表笔接的不是基极,应更换其他电极重测。二、判断三极管发射极e和集电极c。三极管基极确定后,通过交换表笔两次测量e、c极间的电阻,如果两次测量的结果应不相等,则其中测得电阻值较小的一次为红表笔接的是e极,黑表笔接的是c极。对于pnp型三极管,方法与npn管类似,只是红、黑表笔的作用相反。在测量e、c极间电阻时要注意,由于三极管的v(br)ceo很小,很容易将发射结击穿。3、按键电路按键电路作为二十一音电子琴系统中最重要的输入设备,在系统中承担着把操作人员想要输入的信号输入

15、单片机的重要作用,所以对这这部分电路的设计我也花了不少心思,为了能最合理地应用单片机的端口,我采用了37的矩阵按键电路。5、 软件设计1、主程序流程图见附录 2、 初使化程序org 0000hljmp mainorg 000bhljmp breakmain:mov tmod,#01h;设置定时器t0,工作方式0setb et0;设置定时器t0中断setb tr0;启动定时器0wait1:clr ea ;屏蔽中断lcall key1 ;调用按键扫描子程序,判断有键按下否?第几个键?cjne r3,#00h,wait1;如果r3=0,表示有键按下,若没有键按下,则继续 扫描按键mov a,22h;

16、将22h里存放的按键号送给arl a;因为查表里都是字,所以得乘2查得数据mov dptr,#table;指向表头movc a,a+dptr;查表mov th0,a;将数据高位送th0mov 21h,a;将高位备份mov a,22hrl a;因为查表里都是字,所以得乘2查得数据inc a;取低位数据movc a,a+dptrmov tl0,amov 20h,asetb ea;开启中断lcall d10ms;调用延时程序jmp wait13、 按键扫描及消抖程序key1:mov r0,#00h;键盘扫描,p1口(低音) ,r0为按键位置,cy判断是 否有按下mov a,p1;p1口状态存alca

17、ll job;调用job,cy置1,r2=7为扫描个数wait2:rrc a;带进位右移jnc xiaozheng1;如果c=0,可能有按键按下,则跳到消抖动inc r0;若上一位没按下,r0加1为将要扫描的按键位djnz r2,wait2;判断7个按键是否扫描完ljmp key2;p1扫描完,跳到下一段i/o口xiaozheng1:mov 23h,r0 ;保存上一次得到的扫描结果lcall d10ms;延时mov r0,#00h;再次扫描mov a,p1lcall jobwait2_1:rrc ajnc store1;c=0,去判断两次扫描结果是否相同inc r0 djnz r2,wait2

18、_1ljmp key2;上次是抖动引起的,跳到下一个扫描任务store1:mov a,r0cjne a,23h,key2;两次结果不同,是抖动引起的,跳到下一个扫描任务lcall ok;两次结果相同,则调用子程序,保存结果ret4、 发声程序key2:mov r0,#07h;扫描p3口(中音)mov a,p3lcall jobwait3:rrc ajnc xiaozheng2inc r0djnz r2,wait3ljmp key3xiaozheng2:mov 23h,r0lcall d10msmov r0,#07hmov a,p3lcall jobwait3_1:rrc ajnc store2

19、inc r0djnz r2,wait3_1ljmp key3store2:mov a,r0cjne a,23h,key3lcall okretkey3:mov r0,#0eh ;扫描p2口(高音) mov a,p2lcall jobwait4:rrc ajnc xiaozheng3inc r0djnz r2,wait4xiaozheng3:mov 23h,r0lcall d10msmov r0,#0ehmov a,p2lcall jobwait4_1:rrc ajnc store3inc r0djnz r2,wait4_1ljmp key1store3:mov a,r0cjne a,23h,k

20、ey1lcall okret5、 延时程序d10ms:mov r4,#100 ;延时子程序,延时10msd1:mov r5,#98 nopd2:djnz r5,d2djnz r4,d1ret6、 中断子程序 break:push acc ;中断子程序 push psw mov tl0,20h mov th0,21h cpl p0.0 pop psw pop acc reti六、系统调试1、硬件调试单片机应用系统的硬件和软件调试是交叉进行的,但通常是先排除样机中明显的硬件故障,尤其是电源故障,然后才能安全地和仿真机相连,进行综合调试。在没有单片机介入的情况下,对焊点的是否完好以及元器件的连接进行

21、检测。如果完好,则进行各单元电路的检测。(1)电源电路的调试:由于本次采用单独的外接电源,许多电源部分不需要去测试。(2)发声电路的测试:发声电路作为系统的重要组成部分,具有十分重要的地位。所以,对于这个电路的测试显得尤为关键。为了测试这个电路是不是正常,我特地找了一段声音程序来测试。这段程序的功能是每过0.5秒发出一个音,从低音的1一直到高音的7。程序如下:length equ 255org 0jmp startorg 1bhjmp tone_intstart:mov tmod,#10h setb ea setb et1 mov sp,#70h mov dptr,#tone mov a,#0

22、 mov r3,a call load mov r0,#length setb tr1 jmp $load: mov a,r3 movc a,a+dptr jnz continue mov r3,#0 jmp loadcontinue: mov th1,a mov 20h,a inc r3 movc a,a+dptr mov tl1,a mov 21h,a inc r3 rettone_int: clr tr1 cpl p1.0 mov a,20h mov th1,a mov a,21h mov tl1,a djnz r0,again mov r0,#length call loadagain

23、: setb tr1 retitone: db 248,140,248,243 db 249,92,249,185 db 250,21,250,104 db 250,185,251,144 db 251,208,252,12 db 252,68,252,122 db 252,173,252,221 db 253,10,253,52 db 253,93,253,131 db 253,167,253,200 db 253,232,254,6 db 254,34,254,62 db 254,87,254,111 db 254,133,254,155 db 254,175,254,194 db 254

24、,211,254,228 db 254,244,255,3,0end 经过这段程序的测试,发现发声电路工作十分正常。(3)按键电路测试:对按键电路的测试也是十分关键的,因为按键工作的正常与否也直接关系到了整个系统能否正常工作。对于按键电路的测试是十分简单的。只要让电路上电后,用万用表测试一下按键两个接线端的电阻,此时电阻应该是无穷大。然后,任意按下一个键,用万用表测试这个按键两个接线端,此时电阻应该是0。只要有这样的结果,就可以说明按键电路焊接无误。2、软件调试软件调试部分采用keil软件和proteus软件配合使用,来完全软件调试。keil调试显示结果如图6-1图6-1 keil调试结果显示

25、proteus原理图如图6-2图6-2 proteus原理图七、设计总结1、设计中遇到的问题:(1)因为一开始就确定了做21个音的电子琴,即有21个按键,所以在实物焊接的时候,at89c52芯片的大部分引脚都要焊接并要引出接线和其他器件相接。而芯片的引脚密集,接线较多,电路板面积较小,所以在焊机实物的时候就出现了较多的麻烦,一不小心就会将不同的点连在一起。要小心翼翼的焊接,又要认真的检查,以至于在焊接的时候花费了较长的时间。(2)在设计过程中遇到的最大问题就是程序的设计和调试问题,由于资料查找不足,考虑不成熟,所以在设计程序的时候没有注意到独立按键的抖动产生的影响。而当把程序烧到芯片里实物运行

26、的时候,与仿真效果相比出现了很大的差异,因此才发现在一问题。后来又将程序做了修改,考虑到了按键抖动的消除,这一问题才得以解决。2、心得体会这次课程设计让我受益匪浅,使我弄懂了不少课本上的知识,还扩展了一些课本没有的知识,通过自己的思考和努力,较好的完成了这次课程设计。首先在课程设计的硬件方面,基本了解了电子产品的开发流程和所需的设计要求,并对电路的分析和理解有了更实际的感受。在软件方面,做的最多的工作就是程序的设计和调试,在设计程序时,自己先画出了设计思路流程图,再根据流程图设计出了程序,通过keil软件的编译和proteus软件的仿真,不断的发现程序中的问题,然后又不断的修改调试,最后完善了

27、我们的程序。这个课程设计也培养了我的耐心和毅力,尤其是在编写程序、程序调试的时候,一不小心,考虑不成熟就会出现问题。在遇到问题时,能通过查找资料,不断修改、调试,解决相关的问题。其中,不仅使我对相关软件的使用更加的熟练,更掌握了所学知识运用,巩固了自己的理论知识,使自己得到了一定的锻炼,获得了一些经验,相信这些经验在我以后的学习、工作中会有很大的帮助。八、参考书目1李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社2李广弟.单片机基础.北京:北京航空航天大学出版社3阎石.数字电子技术基础(第三版). 北京:高等教育出版社4廖常初.现场总线概述j.电工技术5 徐仁贵等编著.

28、单片微型计算机应用技术.北京:机械工业出版社 6 张毅刚等编著.单片机原理及应用. 北京:高等教育出版社7 杨素行 主编.模拟电子技术基础简明教程. 北京:高等教育出版社.附录中断返回ny将a左移后的值加1查表获得数据低位,并送tl0,设定定时器初值的低位保存初值低位(a) 给20hsetb ea,开启中断延时10ms中断子程序扫描按键,判断中否有键按下得到按键对应的返回值(22h)给(a)a左移,即将返回值乘2通过查表获得数据高位,并送th0,设定定时器初值的高位保存初值高位(a)给(21h)开始设置定时器t0,并启动定时器中断clr ea屏蔽中断结束附录一:系统设计流程图 保护现场将保存的

29、定时初值分别送给th0,tl0,再次设置同样的定时初值cpl p0.0,即p0.0的输出值翻转恢复现场返回中断子程序:附录二:电子琴音符频率表低1do26263628th0=f7htl0=24h1do#27763731th0=f8htl0=f3h低2re29463835th0=f9htl0=5bh2re31163928th0=f9htl0=b8h低3m33064021th0=fahtl0=15h低4fa34964103th0=fahtl0=67h4fa37064185th0=fahtl0=b9h低5so39264260th0=fbhtl0=04h5so41564331th0=fbhtl0=4b

30、h低6la44064400th0=fbhtl0=90h646664463th0=fbhtl0=cfh低7si49464524th0=fchtl0=0ch中1do52364580th0=fchtl0=44h1do#55464633th0=fchtl0=79h中2re58764684th0=fchtl0=ach2re62264732th0=fchtl0=dch中3m65964777th0=fdhtl0=09h中4fa69864820th0=fdhtl0=34h4fa74064860th0=fdhtl0=5ch中5so78464898th0=fdhtl0=82h5so83164934th0=fdht

31、l0=a6h中6la88064968th0=fdhtl0=c8h693264994th0=fdhtl0=e2h中7si98865030th0=fehtl0=06h高1do104665058th0=fehtl0=22h1do110965085th0=fehtl0=3dh高2re117565110th0=fehtl0=56h2re124565134th0=fehtl0=6eh高3m131865157th0=fehtl0=85h高4fa139765178th0=fehtl0=9ah4fa#148065198th0=fehtl0=aeh高5so156865217th0=fehtl0=c1h5so166

32、165235th0=fehtl0=d3h高6la176065252th0=fehtl0=e4h6186565268th0=fehtl0=f4h高7si196765283th0=ffhtl0=03h 休止符用th0=ffh ,tl0=ffh表示。附录三:二十一音电子琴源程序org 0000hljmp mainorg 000bhljmp breakmain:mov tmod,#01h;设置定时器t0,工作方式0setb et0;设置定时器t0中断setb tr0;启动定时器0wait1:clr ea;屏蔽中断lcall key1 ;调用按键扫描子程序,判断有键按下否?第几个键?cjne r3,#0

33、0h,wait1;如果r3=0,表示有键按下,若没有键按下,则继续扫描按 键mov a,22h;将22h里存放的按键号送给arl a;因为查表里都是字,所以得乘2查得数据mov dptr,#table;指向表头movc a,a+dptr;查表mov th0,a;将数据高位送th0mov 21h,a;将高位备份mov a,22hrl a;因为查表里都是字,所以得乘2查得数据inc a;取低位数据movc a,a+dptrmov tl0,amov 20h,asetb ea;开启中断lcall d10ms;调用延时程序jmp wait1key1:mov r0,#00h;键盘扫描,p1口(低音) ,r

34、0为按键位置,cy判断是否有 按下mov a,p1;p1口状态存alcall job;调用job,cy置1,r2=7为扫描个数wait2:rrc a;带进位右移jnc xiaozheng1;如果c=0,可能有按键按下,则跳到消抖动inc r0;若上一位没按下,r0加1为将要扫描的按键位djnz r2,wait2;判断7个按键是否扫描完ljmp key2;p1扫描完,跳到下一段i/o口xiaozheng1:mov 23h,r0;保存上一次得到的扫描结果lcall d10ms;延时mov r0,#00h;再次扫描mov a,p1lcall jobwait2_1:rrc ajnc store1;c=0,去判断两次扫描结果是否相同inc r0 djnz r2,wait2_1ljmp key2;上次是抖动引起

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论