1、音乐盒的设计1技术要求能够产生低中高三个音调的7个标准音阶DO,RE,M,FA,SO,LA,SI;并在按下相应的数字键的时候数码管显示相应数字;自选一首歌曲,查找到相关的乐谱,确定音阶和节拍,并编写相关的源程序是蜂鸣器能够播放出该歌曲。2设计方案及实现2.1 方案一任务要求:以89s51为核心,根据设计指标设计电路的框图,画出电路逻辑图和装配图,查阅资料,确定所需各元器件型号和参数,自拟调整测试方法,并调试电路使其达到设计指标要求。2.1.1方案设计根据任务要求,可以通过以下原理图(图2-1)来实现该音乐盒的设计。复位电路琴键 电路P0.0|P0.7P1.0时钟电路单片机80c51图2-1本方
2、案的琴键输入是通过独立式键盘来完成的,这样便于控制且直观,如上图设计原理所示我们可以画出比较直观的流程图如图 2-2所示。图2-2主流程图中断程序流程图NY等待中断,判断是否中断判断是否抖动Y居于上述流程图我们可以通过proteus软件画出该实验的原理图(图2-3):图2-32.1.2方案实现对于音乐盒而言发出悦耳的音乐是其最主要的功能,那么对于使用单片机来制作出来的音乐盒怎么实现音符的发声呢?通过查看资料我们知道音符的发音主要靠不同的音频脉冲。利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制引脚的输出音乐(本实验采用P1.0 做为输出引脚)。只要算出某一音频的周期(1/
3、频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O 脚上得到此频率的脉冲。具体做法如下所示(以中音DO为例):例如:中音1(DO)的音频=523HZ,周期T=1/523s=1912定时器/计数器0的定时时间为:T/2=1912/2 =956定时器956 的计数值=定时时间/机器周期=956 /1 =956(时钟频率=12MHZ)装入T0计数器初值为65536-956=64580将64580装入T0寄存器中,启动T0工作后,每计数956次时将产生溢出中断,进入中断服务时,每次对P1
4、.0引脚的输出值进行取反,就可得到中音DO(523HZ)的音符音频。将51单片机内部定时器工作在计数器模式1下,改变计数初值TH0,TL0以产生不同的频率。下表 2-1是C调各音符频率与计数初值T的对照表: 表2-1 C调各音符频率与计数初值T的对照表音符频率(Hz)/初值()音符频率(Hz)/初值()低1DO 262/63627 中1DO 523/64580高1DO 1042/65056 低2RE 294/63835中2RE 589/64687 高2RE 1245/65134低3M 330/64021 中3M 661/64780高3M 1318/65157 低4FA 350/64107中4F
5、A 700/64822 高4FA 1397/65178低5SO 393/64264 中5SO 786/64900高5SO 1568/65217 低6LA 441/64402中6LA 882/64969 高6LA 1760/65252低7SI 495/64526 中7SI 990/65031高7SI 1967/652822.1.2.1 详细参数本实验以Intel公司的80c51为核心,配合键盘系统,放大电路,时钟电路和数码管显示电路实现音乐的演奏。80C51:高性能的静态80C51 设计 由先进CMOS 工艺制造并带有非易失性Flash 程序存储器 全部支持12 时钟和6 时钟操作 P89C51
6、X2 和P89C52X2/54X2/58X2 分别包含128 字节和256 字节 RAM 32 条I/O 口线 3 个16 位定时/计数器 6 输入4 优先级嵌套中断结构 1 个串行I/O 口 可用于多机通信 I/O 扩展或全双工UART以及片内振荡器和时钟电路。此外,由于器件采用了静态设计,可提供很宽的操作频率范围,频率可降至0 。可实现两个由软件选择的节电模式,空闲模式和掉电模式,空闲模式冻结CPU但RAM 定时器,串口和中断系统仍然工作掉电模式保存RAM的内容 但是冻结振荡器 导致所有其它的片内功能停止工作。由于设计是静态的时钟可停止而不会丢失用户数据 运行可从时钟停止处恢复。键盘系统:
7、键盘系统的链接电路图如图2-31所示:图2-31当用手按下一个键时,往往按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也回会出现类似的情况。这就是抖动。抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms。很容易想到,抖动问题不解决就会引起对闭合键的识别。用软件方法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,这之后,在读入键盘码。具体编码如下所示MAI: CLR TR0 ;关闭上一次定时,进入下一次按键判断MOV TMOD, #01HMOV IE, #82HMOV A, P1MOV 30H, A ;保存键盘状态值LCALL D10MS
8、 ;延迟10ms消除抖动MOV A , P1 ;再读键盘状态CJNE A, 30H, MAI ;两次结果不同,是抖动引起 ,转MAI放大电路分析如图2-4所示:图2-4放大电路输出原理图此部分的放大电路简单容易实现。可以采用一个小功率PNP型硅管9012,利用“分压 偏置式工作点稳定直流通路”,达到了对静态工作点的稳定。分压电阻分别选择1K和5.5K。蜂鸣器一端接+5V电压,一端接晶体管的发射极。由P1.0输出预定的方波,加到晶体管进行放大,再输出到嗡宁器,很好的实现了频率、声音的转换。时钟电路如图2-5所示:此系统的时钟电路设计是采用内部方式,即是利用芯片内部的振荡电路。MCS-51内部有一
9、个用于构成振荡器的高增益反相放大器。电容值选择22F,所以此系统电路的晶体振荡器的值为6 MHz。图2-5 MSC-51片内振荡电路2.1.2.2 程序的编写源程序如下所示: NUMTIM EQU 20HGEWEI EQU 21HSHIWEI EQU 22HSCANLED EQU 23HORG 0000HLJMP MAIORG 000BHLJMP TIMORG 100H MAI: MOV R2,#3FHMOV P2,R2 ;让数码管显示0CLR TR0 ;关闭上一次定时,进入下一次按键判断 MOV TMOD, #01HMOV IE, #82HMOV A, P0 ;再读键盘MOV 30H, A
10、LCALL D10MS ;延迟10ms消除抖动 MOV A , P0 ;再读入键盘状态 CJNE A, 30H, MAI ;两次结果比较,不同是引起抖动 ,转向MAIJNB P0.0, N1JNB P0.1, N2JNB P0.2, N3JNB P0.3, N4JNB P0.4, N11JNB P0.5, N6JNB P0.6, N7JNB P0.7, N8N11: LJMP N5N6: LJMP LA ;JNB的跳转范围限定在256B,所以使用LJMP跳转 N7: LJMP HAHAN8: LJMP HEHEN1: MOV DPTR, #TAB ;设定音阶1的定时时间MOV A, #00HM
11、OVC A, A+DPTR MOV R1, AMOV A, #01HMOVC A, A+DPTRMOV R0, AMOV TH0, R1MOV TL0 ,R0SETB TR0MOV A,#06HMOV P2,ARE1: JB P0.0, MAI ;判断琴键1 是否释放AJMP RE1N2: MOV DPTR, #TAB ;设定音阶2的定时时间MOV A, #02HMOVC A, A+DPTRMOV R1, AMOV A, #03HMOVC A, A+DPTRMOV R0, AMOV TH0, R1MOV TL0, R0SETB TR0MOV A,#5BHMOV P2,ARE2: JB P0.1
12、,MAIAJMP RE2N3: MOV DPTR, #TAB ;设定音阶2的定时时间MOV A, #04HMOVC A, A+DPTRMOV R1, AMOV A, #05HMOVC A, A+DPTRMOV R0, AMOV TH0, R1MOV TL0, R0SETB TR0MOV A,#4FHMOV P2,ARE3: JB P0.2,N9AJMP RE3N9: LJMP MAIN4: MOV DPTR, #TAB MOV A, #06HMOVC A, A+DPTRMOV R1, AMOV A, #07HMOVC A, A+DPTRMOV R0, AMOV TH0, R1MOV TL0,
13、R0SETB TR0MOV A,#66HMOV P2,ARE4: JB P0.3, A1AJMP RE4A1: LJMP MAIN5: MOV DPTR, #TAB MOV A, #08HMOVC A, A+DPTRMOV R1, AMOV A, #09HMOVC A, A+DPTRMOV R0, AMOV TH0, R1MOV TL0, R0SETB TR0MOV A,#6DHMOV P2,ARE5: JB P0.4, A2AJMP RE5A2: LJMP MAILA: MOV DPTR, #TAB MOV A, #0AHMOVC A, A+DPTRMOV R1, AMOV A, #0BHM
14、OVC A, A+DPTRMOV R0, AMOV TH0, R1MOV TL0, R0SETB TR0MOV A,#7DHMOV P2,ARE6: JB P0.5, A3AJMP RE6A3: LJMP MAIHAHA: MOV DPTR, #TAB MOV A, #0CHMOVC A, A+DPTRMOV R1, AMOV A, #0DHMOVC A, A+DPTRMOV R0, AMOV TH0, R1MOV TL0, R0SETB TR0MOV A,#07HMOV P2,ARE7: JB P0.6,A4AJMP RE7A4: LJMP MAIHEHE: MOV TMOD,#000000
15、01B ;方式寄存器设置SETB EASETB ET0MOV NUMTIM,#01HSTART0: MOV 30H,#00H NEXT:MOV A,30HMOV DPTR,#TABLEMOVC A,A+DPTRMOV R2,AJZ END0ANL A,#0FHMOV R5,AMOV A,R2SWAP AANL A,#0FHJNZ SING CLR TR0 JMP D0SING: DEC A ;开始唱MOV 22H,ARL AMOV DPTR,#TABLE1MOVC A,A+DPTRMOV TH0,AMOV 21H,AMOV R1,AMOV A,22HRL AINC AMOVC A,A+DPTR
16、MOV TL0,AMOV 20H,AMOV R0,ASETB TR0MOV A,#7FHMOV P2,AD0:LCALL DELAYJB P0.7,END0INC 30HJMP NEXTEND0:CLR TR0JB P0.7,N10AJMP START0N10:LJMP MAITIM:PUSH ACCPUSH PSWMOV TL0,R0 ;重装定时器初值MOV TH0,R1CPL P1.0 POP PSWPOP ACCRETI ;中断返回DELAY: MOV R7,#02HD3: MOV R4,#187D4: MOV R3,#248DJNZ R3,$DJNZ R4,D4DJNZ R7,D3DJ
17、NZ R5,DELAYRETRE8: JB P0.7,A5AJMP RE8A5: LJMP MAID10MS:MOV R1, #100 D1: MOV R2, #98NOPD2: DJNZ R2, D2DJNZ R1, D1RETTAB: DB 0FEH, 25H,0FEH, 57H,0FEH, 84H, ,0FEH, 98H, 0FEH, 0C0H, 0FEH, 0E3H, 0FFH,02H, 0FCH, 0EH ;高音音符编码TABLE1:;计时器初始计数值DW 64898,64968,65030,65086,65135,65158,65199,64260,64400,64524,6458
18、0,64684,64777,64862TABLE: ; 所放歌曲编码DB 03H DB 04H,04H,0C2H,14H,12H,12H,12H,11H,11H,0C2H,0D1H,0E1H,14H,14H,02H,32H,12H,21H,31H,52H,51H,51H,54HDB 32H,31H,31H,12H,11H,31H,52H,51H,31H,24H,24H,24H,64H,54H,24H,34H,52H,34H,52H,32H,21H,31H,12H,11H,21H,34H,04HDB 52H,51H,0D1H,12H,12H,32H,31H,31H,52H,51H,51H,22H
19、,22H,22H,0D2H,0D1H,0D1H,24H,22H,0C2H,14H,12H,12H,34H,32H,32H,54H,54H,54H,54HDB 12H,11H,31H,52H,51H,51H,64H,54H,32H,31H,11H,52H,52H,52H,32H,02H,12H,02H,0C4H,14HDB 0A2H,0A1H,11H,52H,52H,52H,32H,02H,12H,02H,0C4H,14H,0C4H,14H,0C4H,14H,14H,04HDB 04H,04H,04H,04HDB 00HEND2.2 方案二2.2.1 方案设计基于方案一我们知道采用的是独立的键盘
20、做为音符的输入,方案二则采用矩阵键盘来进行输入,具体电路原理图如图2-6 所示。图2-6方案二原理图2.2.2 方案实现本方案的实现基本和方案一相同,唯一不同的地方就值本实验采用矩阵键盘作为音符输入来实现。由于矩阵键盘需独立的编码,矩阵键盘的功能如下1、识别键盘有无按键按下,若无键按下返回。2、如果有键按下,找出具体的按键值(顺序码)矩阵键盘键值查找程序键值存入30H单元KEY_SCAN: ;识别键盘有无键按下子程序MOV P1,#0F0H ;置列线为0,行线为1MOV A,P1 ;读P1 口ANL A,#0F0H ;取出高四位MOV B,A ;暂存到 BMOV P1,#0FH ;置列线为1,
21、行线为0MOV A,P1 ;读P1 口ANL A,#0FH ;取出低四位ORL A,B ;高四位与低四位逻辑或运算重新组合CJNE A,#0FFH,KEY_IN1 ;0FFH为无按键按下RETKEY_IN1: ;识别具体按键值子程序MOV B,A ;将按键的特征编码暂存于 BMOV DPTR,#KEYTABLEMOV R3,#0FFH KEY_IN2: INC R3 ;顺序码加1MOV A,R3MOVC A,A+DPTR ;查表CJNE A,B,KEY_IN3 ;比较,若相同则找到按键的特征编码。MOV A,R3 ;找到特征编码后,取顺序码MOV 30H,A ;存入30H 单元RETKEY_I
22、N3: CJNE A,#00H,KEY_IN2 ;末完,继续查RET ;00H为结束码; 特征编码与顺序编码的对应关系表KEY_TABLE: DB 0EEH,0EDH,0EBH,0E7H,0DEH ;0,1,2,3,4, 顺序码DB 0DDH,0DBH,0D7H,0BEH,0BDH ;5,6,7,8,9, 顺序码DB 0BBH,0B7H,07EH,07DH,07BH, 077H ;A,B,C,D,E,F 顺序码DB 00H ; 结束码END3调试及结论通过对程序的调试和修改能实现实验的要求,在按下相应的键时speaker能发出正确的音调,且数码管也能显示相应的数字。4心得体会5参考文献高锋,单片微型计算机原理与接口技术.科学出版社,2003年.李传军,单片机原理及应用(第一版)M.河南科学技术出版社,2006年.杨志忠.数字电子技术.高等教育出版社(第二版)M.2003年.张友德.单片微型机原理、应用与实验M.上海:复旦大学出版社,2000年.