资源描述
基于单片机电子琴的设计 摘 要随着计算机在社会各领域的渗透,单片机的应用正在不断地走向深入,同时带动着工业、农业、商业、家电以及玩具的日新月异更新,极大地提高了电子电路及系统设计质量和效率。电子琴是现代电子科技与音乐结合的产物,在现代音乐扮演者重要的角色,单片机对于电子琴的设计具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中成为不可替代的一部分。本文主要是用AT89S51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控模块,在主控模块上设有16个按键和扬声器。其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。关键字:单片机;AT89S51;电子琴1.系统硬件电路设计 电子琴的控制电路由单片机AT89S51、工作知识LED、LED显示器、按键输入、喇叭接口等几部分组成。硬件电路结构框图如图1所示: 图1 电子琴硬件电路1.1 单片机AT89S51的简介AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4K的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Flash程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器于单片机芯片中,ATMEL公司的功能强大,低价位AT89S51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。主要性能参数:l 与MCS-51产品指令系统完全兼容l 4K字节在系统编程(ISP)Flash 闪速存储器l 1000次擦写周期l 4.0-5.5V的工作电压范围l 全静态工作模式:0HZ-33MHZl 三级程序加密锁l 128*8字节内部RAMl 32个可编程I/O口线l 2个16位定时/计数器l 6个中断源l 全双工串行UART通道l 低功耗空闲和掉电模式l 中断可从空闲模式唤醒系统l 看门狗(WDT)及双数据指针l 掉电标示和快速编程特性l 灵活的在系统编程(ISP-字节或页写模式)功能特性概述: AT89S51提供以下标准功能:4K字节闪速存储器,128字节内部RAM,32个I/O口线,看门狗(WDT),两个数据指针,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89S51可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中到内容,但振荡器停止工作并禁止其它所有工作部件直到下一个硬件复位。图2单片机AT89S51引脚图引脚功能说明:Vcc:电源电压GND:接地P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作为输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。Flash编程和程序校验期间,P1接收低8位地址。P2口:P2口是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输出口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVE DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX Ri指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。Flash编程或校验时,P2亦接收高位地址和其他控制信号。P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输出端口。作输入端时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下表所示:端口引脚第二功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2P3.3P3.4T0P3.5T1P3.6P3.71.2电子琴硬件仿真图 图3 仿真设计的硬件电路2.系统软件电路设计2.1整体程序简易流程图 图4程序流程图2.2弹奏程序流程图:图5弹奏程序流程图2.3自动播放歌曲程序流程图: 图6播放程序流程图2.4设计原程序: BUFF EOU 30H STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H ORG 00H LJMP START ERG OBH LJMP TNT_TO ORG 001BH LJMP TIM1START: MOV TMOD,#01H ;设置T0工作方式 SETB ETO SETB EA ;启动T0MAIN: MOV P1,#0FFH ;P1全置1 CLR P1.4 ;开始扫描第一行 MOV A,P1 ANL A,#0FH ;屏蔽高四位 XRL A,#0FH ;低位有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,#0CH,CKK1 ;相等说明该行第一列有键按下,不等则转移 MOV BUFF,#0 ;该键值为0 LJMP NDK1 ;跳到NDK1执行相应的功能程序CKK1: CJNEA,#0DH,KK2 ;相等说明该行第二列有键按下,不等则转移 MOV BUFF,#1 ;该键值为1 LJMP NDK1 ;跳到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,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV THO,A INC TEMP MOV A,TEMP MOVC A,A_DPTR MOV STL0,A MOV TL0,A SETB TRONDK1A: MOV A,P1 ANL A,#OFH 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 DELAY10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ KKEY2 MOV A,P1 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,BUFFMOV DPTR,#TABLEMOVC A,A+DPTRMOV A,BUFFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1MOVC A,A+DPTRMOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,A+DPTRMOV STL0,AMOV TL0,ASETB TR0NDK2A: MOV A,P1ANL A,#0FHXRL A,#0FHJNZ NDK2ACLR TR0KKEY2: MOV P1,#0FFH ;开始扫描第三行 CLR P1.6MOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY3LCALL DELAY10MSMOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY3MOV A,P1ANL A,#0FHCJNE A,#0EH,KK9MOV BUFF,#8LJMP NDK3KK9: CJNE A,#0DH,KK10 MOV BUFF,#9 LJMP NDK3KK10: CJNE A,#0BH,KK11 MOVBUFF,#10 LJMP NDK3KK11: CJNE A,#07H,KK12 MOV BUFF,#11 LJMP NDK3KK12: NOPNDK3: MOV A,BUFFMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,AMOV A,BUFFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1MOVC A,A+DPTRMOV STH0,AMOV TH0,AINC TEMPMOV A,A+DPTRMOV STL0,AMOV TL0,ASETB TR0 NDK3A: MOV PA,#0FFH ;开始扫描第四行CLR P1.7MOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY4LCALL DELAY10MSMOV A,P1ANL A,#0FHXRL A,#0FHJZ KKEY4MOV A,P1ANL A,#0FHCJNE A,#0EH,KK13MOV BUFF,#12LJMP NDK4KK13: CJNE A,#0DH,KK14MOV BUFF,#13LJMP NDK4KK14: CJNE A,#0BH,KK15 MOV BUFF,#14 LJMP NDK4KK15: CJNE A,#07H,KK16 MOV BUFF,#15 LJMP NDK4KK16: NOPNDK4: MOV A,BUFFMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,AMOV A,BUFFMOV B,#2MUL ABMOV TEMP,AMOV DPTR,#TABLE1MOVC A,A+DPTRMOV STH0,AMOV TH0,AINC TEMPMOV A,TEMPMOVC A,A+DPTRMOV STL0,AMOV TL0,ASETB TR0NDK4A: MOV A,P1 ANL A,#0FH XRL A,#0FH JNZ NDK4A CLR TR0KKEY4: MOV A,#0FFHMOV P2,AMOV A,P2JB ACC.0,KKEY5LCALL DELAY10MSMOV A,P2JB ACC.0,KKEY5MOV BUFF,#16LJMP START22START22: MOV A,BUFF CJNE A,#16,KKEY5 LJMP START22 KKEY5:LJMP MAIN START2:MOV TMOD,#10H ;设T1在M1 MOV IE,#88H ;中断使能START0: MOV 30H,#00 ;取简谱码指针NEXT:MOV A,30H ;简谱码指针装入AMOV DPTR,#TAB ;至TAB取简谱码MOVC A,A+DPTRMOV R2,A ;渠道的简谱码暂存于R2JZ END0 ;是否渠道00(结束码)ANL A,#0FH ;不是则取低4位MOV R5,A ;将节拍码存入R5MOV A,R2 ;将取到的简谱码再载入ASWAP A ;高低4位交换ANL A,#0FH ;取低4位(音符码)JNZ SING ;取到的音符码是否为0CLR TR1 ;开始,则不发音SJMP D1 SING: DEC AMOV 22H,ARL AMOV DPTR,#TAB1MOVC TH1,AMOV 21H,AMOV A,22HRL AINC AMOVC A,A+DPTRMOV TL1,AMOV 20H,ASETB TR1D1: LCALL DELAYINC 30HJMP NEXTEND0:CLR TR1LFMP MAINTIM1: PUSH ACCPUSH PSWMOV TL1,20HMOV TH1,21HCPL P3.0POP PSWPOP ACCRETIDELAY:MOV R7,#02D2:MOV R4,#187D3:MOV R3,#248DJNZ R3,$DJNZ R4,D3DJNZ R7,D2RETDELAY10MS: MOV R6,#10D10: MOV R7,#248DJNZ R7,$DJNZ R6,D10RETINT_T0: MOV TH0,STH0MOV TL0,STL0CPL P3.0RETITABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HTABLE1: DW 64021,64103,64260,64400 DW 64524,64580,64684,64777 DW 64820,64898,64968,65030 DW 65058,65110,65157,65178TAB1: DW 64260,64400,64521,64580 DW 64684,64777,64820,64898 DW 64968,65030,65058,65110 DW 65157,65178,65217TAB: ;乐曲名称梁祝DB 02H,82H,62H,52H,48H,02H,52H,32H,22H,18HDB 83H,91H,72H,62H,51H,61H,71H,61H,83H,61HDB 81H,51H,61H,71H,61H,51H,46H,82H,32H,52HDB 22H,42H,16H,21H,41H,18H,0E4H,13H,21H,43HDB 51H,21H,41H,12H,83H,81H,61H,81H,58H,53HDB 61H,31H,22H,13H,21H,42H,52H,0E2H,42H,21HDB 11H,91H,41H,18H,63H,81H,32H,52H,21H,41HDB 16H,0E4H,11H,21H,31H,51H,26H,11H,21H,43HDB 51H,82H,62H,52H,61H,51H,42H,21H,11H,0E4HDB 44H,21H,41H,21H,11H,0E1H,11H,21H,41H,18HDB 61H,81H,51H,61H,51H,41H,32H,21H,41H,18HDB 08H,0H,04H ;曲子最后静音5拍长时间DB 00H :乐曲结束END参考文献1 杨加国.单片机原理与应用及C51程序设计M.北京:清华大学出版社,2009.2 尹建华.微型计算机原理与接口技术M.北京:高等教育出版社,2008.3 任肖丽,王骥.基于STC89C51单片机的电子琴设计J.电子元器件应用,2010,(7).
展开阅读全文