单片机课程设计电子琴 (汇编语言)_第1页
单片机课程设计电子琴 (汇编语言)_第2页
单片机课程设计电子琴 (汇编语言)_第3页
单片机课程设计电子琴 (汇编语言)_第4页
单片机课程设计电子琴 (汇编语言)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、 目 录1. 引言.1 1.1. 设计的目的.1 1.2. 设计的内容与要求.12. 总体设计.1 2.1. 音乐产生原理.1 2.2. 设计流程.33. 硬件设计.8 3.1. at89c51芯片简介 .8 3.1.1 主要特性.8 3.1.2 功能描述.8 3.1.3 引脚说明与硬件连接.9 3.2. 元器件清单.134. 系统工作说明.135.结束语.14 5.1 收获与体会.14 5.2 遇到的问题与解决方法.15 5.3 教程建议.156. 参考文献.157. 附录.161. 引言 1.1 设计的目的 本设计的主要目的是掌握单片机系统的开发应用,掌握prteus和keil c51软件

2、的应用,巩固和加深已学过的知识,提高动手能力及解决实际问题的能力,同时培养团队合作精神。 1.2. 设计内容与要求(1) 本设计以at89c52单片机为核心控制元件设计一个电子琴,与键盘、扬声 器等模块组成核心主控制模块,在主控模块上设有16个弹奏按键、1个播 放按键和扬声器,并且按下时按键发声,松开延时一段时间停止,中间再 按别的键则发另一音调的声音。16个按键设置成4x4矩阵键盘,能弹奏出 16个音,添加歌曲程序同时能够播放出歌曲。(2)利用软件 keil c51进行程序的调试。(3)利用proteus软件画电路图,并在单片机加载程序进行仿真。(4)根据电路图运用proteus软件的布局和

3、布线功能绘制pcb图并输出显 示电路的3d图。(5)根据电路图、pcb图和3d图快速地焊接电路。(6)下载程序代码,调试(easy 51pro) 。2. 方案总体设计 2.1. 音乐产生设计原理 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器t0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系正确即可。若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止

4、后就将p1.0反相,然后重复计时再反相。就可在p1.0引脚上得到此频率的脉冲。 利用at89c51的内部定时器使其工作计数器模式(mode1)下,改变计数值th0及tl0以产生不同频率的方法产生不同音阶,例如,频率为523hz,其周期t1/5231912s,因此只要令计数器计时956s/1s956,每计数956次时将i/o反相,就可得到中音do(523hz)。 计数脉冲值与频率的关系式是: n=fi2fr式中n是计数值;fi是机器频率(晶体振荡器为12mhz时,其频率为1mhz);fr是想要产生的频率。 其计数初值t的求法如下: t65536n65536fi2fr例如:设k65536,fi1m

5、hz,求低音do(261hz)、中音do(523hz)、高音do(1046hz)的计数值。t65536n65536fi2fr6553610000002fr65536500000/fr 低音do的t65536500000/26263627 中音do的t65536500000/52364580 高音do的t65536500000/104665059 单片机12mhz晶振,高中低音符与计数t0相关的计数值如表1所示:音符频率(hz)简谱码(t值)音符频率(hz)简谱码(t值)低1do26263628# 4 fa#74064860#1do#27763731中 5 so78464898低2re29463

6、835# 5 so#83164934#2 re#31163928中 6 la88064968低 3 m33064021# 693264994低 4 fa34964103中 7 si98865030# 4 fa#37064185高 1 do104665058低 5 so39264260# 1 do#110965085# 5 so#41564331高 2 re117565110低 6 la44064400# 2 re#124565134# 646664463高 3 m131865157低 7 si49464524高 4 fa139765178中 1 do52364580# 4 fa#1480651

7、98# 1 do#55464633高 5 so156865217中 2 re58764684# 5 so#166165235# 2 re#62264732高 6 la176065252中 3 m65964777# 6186565268中 4 fa69864820高 7 si196765283 表1 音符频率表我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据。 低音019之间,中音在2039之间,高音在4059之间。table: dw 0,63628,63835,64021,64103,64260,64400,64524,0,0 dw 0,63731,63928,0,64185

8、,64331,64463,0,0,0 dw 0,64580,64684,64777,64820,64898,64968,65030,0,0 dw 0,64633,64732,0,64860,64934,64994,0,0,0 dw 0,65058,65110,65157,65178,65217,65252,65283,0,0 dw 0,65085,65134,0,65198,65235,65268,0,0,0 dw 0 在这个程序中,弹奏音乐的程序是用定时/计数器t0来完成的,播放音乐程序则是用定时/计数器t1来完成的。2.2. 设计流程 (1)键盘扫描程序: 检测是否有键按下,有键按下则记录

9、按下键的键值,并跳转至功能转移程序;无键按下,则返回键盘扫描程序继续检测。 (2)功能转移程序: 对检测到得按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲功能。 (3)琴键处理程序: 根据检测到得按键值,查询音律表,给计时器赋值,使发出相应频率的声音。 (4)自动播放歌曲程序:检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放好的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有键按下。 程序简易流程图: 开始键盘扫描程序t0初始化并开中断允许t0中断t1初始化并开中断允许

10、t1中断有键按下否 否延时去抖动识别按键功能 是 是否弹奏键 否 播放键 是取相应的音符码装入t1根据按键功能装入相应音符值到t0启动t1启动t0按键释放成功否按键释放成功否停止t0工作停止t1工作 图1 程序简易流程图 弹奏程序流程图:弹奏子程序开中断并允许中断设定定时器工作方式取键值根据键值查音律表给定时器t0赋值开始计时进入中断cpl p3.0 p3.0退出中断延时返回键盘扫描程序 图2 弹奏程序流程图自动播放歌曲程序流程图:自动播放音乐程序a 0,dptr歌谱地址开中断,设定定时器t1工作模式取简谱码 取该音符的节拍码stopa=0 y n休止符返回键盘扫描a=0ffh y n 查音律

11、表,给定时器赋值inc dptr 开始计时进入中断cpl3.0退出中断延时 图3 自动播放歌曲程序流程图3.硬件设计 3.1. at89c51芯片简介 3.1.1 主要特性与mcs-51 兼容 4k字节可编程闪烁存储器 寿命:1000写/擦循环数据保留时间:10年全静态工作:0hz-24hz三级程序存储器锁定128*8位内部ram32可编程i/o线两个16位定时器/计数器5个中断源 可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路 3.1.2 功能描述 (1) at89c51是一种带4k字节闪烁可编程可擦除只读存储器(fperomfalsh programmable and erasa

12、ble read only memory)的低电压,高性能cmos8位微处理器,俗称单片机。at89c2051是一种带2k字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的at89c51是一种高效微控制器,at89c2051是它的一种精简版本。at89c单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 (2)振荡器特性: xtal1和xtal2分别为反向放大器的输入和输出。该反向放大器可

13、以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,xtal2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 (3)芯片擦除: 整个perom阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ale管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,at89c51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,cpu停止工作。但ram,定时器,计数器,串口和中断系统仍在工

14、作。在掉电模式下,保存ram的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 3.1.3 引脚说明与硬件连接 (1) 引脚图,如图4: 图4 at89c51引脚图 (2)p1口: p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。 利用p1口为按键接入口,形成4x4组成具有16个按键矩阵的键盘,作为琴键键盘,设计成16个音,如下图5: 所对应的键码 0 1 2 3 4 5 6

15、7 8 9 a b c d e f 图5 4x4键盘(3) p2口: p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。 利用p2.0接播放音乐键,如图6: 图6 自

16、动播放歌曲 (4)p3口: p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。p3口同时为闪烁编程和编程校验接收一些控制信号。 利用p3.0rxd口(串行输入口)接1个喇叭,通过执行相应的功能程序使电子琴发出不同音色的声音,如图7: 图7 p3.0的输出电路 图中喇叭处接了1个2n3906的pnp,其引脚图如下图8: 图8 2n3906引脚图 (5)rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的 高电平时间。 /ea

17、/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。 当按下按键,rst端口输入高点平,电路进行复位,歌曲停止播发,如图9: 图9 复位部分 (6)xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。 xtal2:来自反向振荡器的输出。如图10: 图10 晶振部分 3.2. 元器件清单 如下表2: 名称 数值 个数 单片机 at89c51 1 独立按键(可弹起的) 18 2n3

18、906 1 喇叭 1 电阻r1 10k 1 电阻r2 1k 1 电阻r3 200 1 电容c1、c2 16pf 各1个 电容c3 4.7uf 1 晶振 12mhz 1 表2 元器件清单4. 系统工作说明 接上电源,按下自动播放歌曲按键b17,p2.0口此时接上低电平,作为输出口,因为p2.0具有输出寄存器寄存的内容的特殊功能,所以播放出已编好程序的歌曲。当按下复位部分的按键b18时,因为复位部分是接高电平的,按下按键就产生高电平输入进行电路的复位,自动播放的歌曲就马上停止。而4x4矩阵键盘是接p1口作为输入,16个键位产生不同的频率对应其简谱码而产生不同的音阶。喇叭输出部分接p3.0口,一直保

19、持低电平作为输出,接上一个pnp 2n3906作为放大功能使其播放声音。5. 结束语 5.1 收获与体会 通过这次课程设计,让我感觉到了单片机的乐趣以及运用单片机设计电路比较方便和简单。在课程设计过程中,我学会了怎么通过各种方式查询相关的资料,尤其是要充分利用互联网来查找自己想要的资料。这次的课程设计涉及硬件和软件两方面的内容。首先是软件部分,我学会了运用keil c51软件建立工程文件来调试程序的正确性,同时也学会了运用proteus软件来画电路图,基本掌握proteus软件的使用方法包括绘制原理图、pcb图、3d图,通过这些图与焊接硬件电路紧密的联在一起。由于自己所学有限,所以程序的编写事

20、件很头疼的事,所以我们是先从网上下载一些类似的程序,然后对程序进行分析修改加以利用。硬件部分,在选取单片机前必须知道我们将要制作的电路需要实现什么功能,根据其功能来选取我们需要的单片机。而在焊接的过程中我发现每个元器件的排布是十分讲究的,布局得好焊接起来就方便且简单多了。 设计好后,要将程序烧入芯片,经过调试成功后,我们可以任意弹奏自己想要的旋律。本研究通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶。说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不

21、同的频率的组合,即可构成我们所想要的音乐了,所以我们只要把一首歌曲的音阶对应频率关系弄正确来,然后我们利用功放电路来将音乐声音放大。 5.2 遇到的问题与解决方法 (1)绘制好电路总原理图准备焊接的时候,发现按照原理图来焊接相当困难,不知从何下手。于是我上网查了一下资料,发现原来proteus软件有自动布局和自动布线的功能来绘制pcb图,而且还可以输出3d图。根据这总原理图、pcb图还有3d图来焊接电路,很快地焊接好电路而且一插上电源电路就跟仿真一样成功了。 (2)在购买材料的时候那间店没有at89c51单片机,只好购买了stc89c52单片机。回来上网查了一下资料,发现它们的引脚都一样,而且

22、stc89c52的容量大一些,功能更强,所以完全可以代替at89c51来实现本设计的电子琴电路的功能。 5.3 教程建议 我觉得只是单纯的上课来学习单片机是很难的,老师应该多找一些电路的实例来讲授单片机的知识,这样会让学生更容易接受而且更容易明白。课程应该多安排一些课程设计来让学生自己动手来提高对单片机的知识和动手能力。6. 参考文献1 李朝青 . 单片机原理与接口技术.2 李光飞、楼然苗 .单片机课程设计指导 .北京:北京航空航天大学出版 社.3 蔡朝洋 . 单片机控制实习与专题制作 .北京:北京航空航天大学出版社.4 严天峰 单片机应用系统设计与仿真调试 北京:北京航空航天大学出 版社 .

23、 2005年8月.7. 附录 图11 原理图 图12 实物图 图13 pcb图 图14 3d图设计源程序:buff equ 30hsth0 equ 31hstl0 equ 32htemp equ 33h org 00h ljmp start org 0bh ljmp int_t0 org 001bh ljmp tim1start: mov tmod,#01h ;设置t0工作方式 setb et0 setb ea ;启动t0main: mov p1,#0ffh ;p1全置1 clr p1.4 ;开始扫描第一行 mov a,p1 anl a,#0fh ;屏蔽高四位 xrl a,#0fh ;低位 有

24、”0”则有键按下,否则无 jz kkey1 ; 判断有无键按下,有则继续,没有则转移到kkey1 lcall dely10ms ;调用延时程序 mov a,p1 ;重新开始判断有无键按下 anl a,#0fh xrl a,#0fh jz kkey1 mov a,p1 anl a,#0fh ;求键值 cjne a,#0eh,ckk1 ;相等说明该行第一列有键按下,不等则转移 mov buff,#0 ;该键值为0 ljmp ndk1 ;跳到ndk1执行相应的功能程序ckk1: cjne a,#0dh,kk2;相等说明该行第二列有键按下,不等则转移 mov buff,#1;该键值为1 ljmp nd

25、k1;跳到ndk1执行相应的功能程序kk2: cjne a,#0bh,kk3;相等说明该行第三列有键按下,不等则转移 mov buff,#2;该键值为2 ljmp ndk1;跳到ndk1执行相应的功能程序kk3: cjne a,#07h,kk4;相等说明该行第四列有键按下,不等则转移 mov buff,#3;该键值为2 ljmp ndk1;跳到ndk1执行相应的功能程序kk4: nopndk1: mov a,buff mov dptr,#table movc a,a+dptr mov p0,a mov a,buff mov b,#2 mul ab mov temp,a mov dptr,#ta

26、ble1 movc a,a+dptr mov sth0,a mov th0,a inc temp mov a,temp movc a,a+dptr mov stl0,a mov tl0,a setb tr0ndk1a: mov a,p1 anl a,#0fh xrl a,#0fh jnz ndk1a clr tr0kkey1: mov p1,#0ffh ;开始扫描第二行 clr p1.5 mov a,p1 anl a,#0fh xrl a,#0fh jz kkey2 lcall dely10ms mov a,p1 anl a,#0fh xrl a,#0fh jz kkey2 mov a,p1

27、anl a,#0fh cjne a,#0eh,kk5 mov buff,#4 ljmp ndk2kk5: cjne a,#0dh,kk6 mov buff,#5 ljmp ndk2kk6: cjne a,#0bh,kk7 mov buff,#6 ljmp ndk2kk7: cjne a,#07h,kk8 mov buff,#7 ljmp ndk2kk8: nopndk2: mov a,buff mov dptr,#table movc a,a+dptr mov p0,a mov a,buff mov b,#2 mul ab mov temp,a mov dptr,#table1 movc a,

28、a+dptr mov sth0,a mov th0,a inc temp mov a,temp movc a,a+dptr mov stl0,a mov tl0,a setb tr0ndk2a: mov a,p1 anl a,#0fh xrl a,#0fh jnz ndk2a clr tr0kkey2: mov p1,#0ffh ;开始扫描第三行 clr p1.6 mov a,p1 anl a,#0fh xrl a,#0fh jz kkey3 lcall dely10ms mov a,p1 anl a,#0fh xrl a,#0fh jz kkey3 mov a,p1 anl a,#0fh c

29、jne a,#0eh,kk9 mov buff,#8 ljmp ndk3kk9: cjne a,#0dh,kk10 mov buff,#9 ljmp ndk3kk10: cjne a,#0bh,kk11 mov buff,#10 ljmp ndk3kk11: cjne a,#07h,kk12 mov buff,#11 ljmp ndk3kk12: nopndk3: mov a,buff mov dptr,#table movc a,a+dptr mov p0,a mov a,buff mov b,#2 mul ab mov temp,a mov dptr,#table1 movc a,a+dp

30、tr mov sth0,a mov th0,a inc temp mov a,temp movc a,a+dptr mov stl0,a mov tl0,a setb tr0ndk3a: mov a,p1 anl a,#0fh xrl a,#0fh jnz ndk3a clr tr0kkey3: mov p1,#0ffh;开始扫描第四行 clr p1.7 mov a,p1 anl a,#0fh xrl a,#0fh jz kkey4 lcall dely10ms mov a,p1 anl a,#0fh xrl a,#0fh jz kkey4 mov a,p1 anl a,#0fh cjne a

31、,#0eh,kk13 mov buff,#12 ljmp ndk4kk13: cjne a,#0dh,kk14 mov buff,#13 ljmp ndk4kk14: cjne a,#0bh,kk15 mov buff,#14 ljmp ndk4kk15: cjne a,#07h,kk16 mov buff,#15 ljmp ndk4kk16: nopndk4: mov a,buff mov dptr,#table movc a,a+dptr mov p0,a mov a,buff mov b,#2 mul ab mov temp,a mov dptr,#table1 movc a,a+dpt

32、r mov sth0,a mov th0,a inc temp mov a,temp movc a,a+dptr mov stl0,a mov tl0,a setb tr0ndk4a: mov a,p1 anl a,#0fh xrl a,#0fh jnz ndk4a clr tr0kkey4: mov a,#0ffhmov p2,a mov a,p2jb acc.0, kkey5lcall dely10msmov a,p2jb acc.0, kkey5mov buff,#16ljmp start22start22: mov a,buffcjne a,#16,kkey5ljmp start2kk

33、ey5: 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位(节拍码) mov r5,a ;将节拍码存入r5 mov a,r2 ;将取到的简谱码再载入a swap a ;高低4位交换 anl a,#0fh ;取低4位(音符

34、码) 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 ;取到的高位字节存入(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的值暂存于堆栈 pu

温馨提示

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

评论

0/150

提交评论