一、设计题目: 设计一简易电子琴,要求能够发出1、2、3、4、5、6、7等七个音符。 使用元件:AT89C51、LM324,喇叭,按键等 二、设计目的 (1)能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。 (2)熟悉8051单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。 (3)为实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件。 (4)对软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。 三、系统硬件图 
流程图: 

原理: (一)音乐产生原理及硬件设计 由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。 本次设计中单片机晶振为12MHZ,那么定时器的计数周期为1MHZ,假如选择工作方式1,那T值便为T=216--5﹡105/相应的频率,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0相关的计数值如下表所示: 
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据: TABLEDW64580,64684,64777,64820,64898,64968,65030 源程序: 方案一:产生按键音符 ORG0000H LJMPMAIN ORG000BH LJMPBREAK MAIN:MOVTMOD,#01H;设置定时器0的工作方式 SETBEA SETBET0;设置定时器0中断 SETBTR0;启动定时器0 WAIT1:LCALLKEY;调用KEY子程序,判断有键按下否?第几个键? CLREA;屏蔽中断 CJNER3,#00H,WAIT1;如果R3=0,表示有键按下 MOVA,22H;将22H里存放的按键号送给A RLA;因为查表里都是字,所以得乘2查得数据 MOVDPTR,#TABLE;指向表头 MOVCA,@A+DPTR;查表 MOVTH0,A;将数据高位送TH0 MOV21H,A;将高位备份 MOVA,22H;将22H里存放的按键号送给A RLA;因为查表里都是字,所以得乘2查得数据 INCA;取低位数据 MOVCA,@A+DPTR MOVTL0,A MOV20H,A WAIT2:LCALLKEY SETBEA CJNER3,#00H,WAIT1 JMPWAIT2 KEY:MOVR3,#00H;KEY子程序,判断有键按下否?第几个键? MOVR1,#0FFH MOVR0,#00H MOVA,R1 MOVP2,A MOVA,P2 CLRC CPLC;利用标志位CY来判断是哪个键按下 MOVR2,#08H WAIT3:RLCA;移位判断 JNCSTORE INCR0 DJNZR2,WAIT3 STORE:MOV22H,R0;将按键号存22H,R3=0有键按下 MOVR3,#00H RET BREAK:PUSHACC;中断产生方波,从P1.0口输出 PUSHPSW MOVTL0,20H MOVTH0,21H CPLP1.0 POPPSW POPACC RETI TABLE:DW65030,64968,64898,64820,64777,64684,64580;7,6,5,4,3,2,1 END 方案二:产生按键音符 ORG0000H SJMPSTART ORG000BH AJMPINT_0 ORG0030H START:MOVP1,#00H SETBEA SETBET0;计数器0 MOVTMOD,#02H MOVTH1,#09CH MOVTL1,#09CH;定时器初植 CLRTR0;定时器不允许 SCAN:;键盘扫描 MOVA,P2;判断键盘按下,跳到SCAN_1,若未按,继续扫描 CJNEA,#0FFH,SCAN_1 NOP SJMPSCAN SCAN_1:ACALLDELAY;是不是真的要按下?如果是,则跳转SU_KEY查询是哪个按下? MOVA,P2 CJNEA,#0FFH,SU_KEY NOP SJMPSCAN SU_KEY:JNBP2.1,MU_1;判断是哪个键按下? JNBP2.2,MU_2 JNBP2.3,MU_3 JNBP2.4,MU_4 JNBP2.5,MU_5 JNBP2.6,MU_6 JNBP2.7,MU_7 SJMPSCAN ;R1信号周期 MU_1:MOVR1,#19;如果第一个按键按下,则R1=19,同时程序转NEXT SJMPNEXT MU_2:MOVR1,#17 SJMPNEXT MU_3:MOVR1,#15 SJMPNEXT MU_4:MOVR1,#14 SJMPNEXT MU_5:MOVR1,#13 SJMPNEXT MU_6:MOVR1,#11 SJMPNEXT MU_7:MOVR1,#10 SJMPNEXT NEXT:MOVA,R1 MOVR0,A SETBTR0;启动定时器0 NEXT_1:MOVA,P2;没键按下继续执行,有键按下,返回读引脚 CJNEA,#0FFH,NEXT_1 ACALLDELAY MOVA,P2;真的没键按下? CJNEA,#0FFH,NEXT_1 CLRTR0;不响 AJMPSCAN;扫描键盘去 INT_0:;中断程序 DJNZR0,RE;R0不等于0时,返回 CPLP1.0 MOVA,R1 MOVR0,A RE:RETI DELAY:MOVR7,#100;延长时间等待,键盘消抖 D1:MOVR6,#10 D2:DJNZR6,D2 DJNZR7,D1 RET END 生日快乐歌:(扩展功能部分程序) ORG0000H JMPMAIN ORG000BH JMPTT0 MAIN:MOVTMOD,#01H;设置定时器0工作方式 MOVIE,#82H;设置中断 MAIN0:MOV30H,#00H NEXT:MOVA,30H MOVDPTR,#TABLE;查表 MOVCA,@A+DPTR MOVR2,A JZSTOP ANLA,0FH MOVR5,A MOVA,R2 SWAPA ANLA,#0FH JNZSING CLRTR0 JMPW1 SING:DECA MOV22H,A RLA MOVDPTR,#TABLE1;查表 MOVCA,@A+DPTR MOVTH0,A MOV21H,A MOVA,22H RLA INCA MOVCA,@A+DPTR MOVTL0,A MOV20H,A SETBTR0 W1:CALLDELAY INC30H JMPNEXT STOP:CLRTR0 JMPMAIN0 TT0:PUSHACC;中断服务程序 PUSHPSW MOVTL0,20H MOVTH0,21H CPLP1.0 POPPSW POPACC RETI DELAY:MOVR7,#2;延时187ms W2:MOVR4,#187 W3:MOVR3,#248 DJNZR3,$ DJNZR4,W3 DJNZR7,W2 DJNZR5,DELAY RET TABLE1:DW64260,64400,64524,64580;音符计数植 DW64684,64777,64820,64898 DW64968,65030,65058,65110 DW65157,65178,65217 TABLE:DB82H,01H,81H,94H,84H;节拍表 DB0B4H,0A4H,04H DB82H,01H,81H,94H,84H DB0C4H,0B4H,04H DB82H,01H,81H,0F4H,0D4H DB0B4H,0A4H,94H DB0E2H,01H,0E [1] [2] 下一页
|