| 简易电子琴的设计 |
| 类别:电子综合 |
|                        一、设计题目:     设计一简易电子琴,要求能够发出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,0E1H,0D4H,0B4H     DB0C4H,0B4H,04H     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,0E1H,0D4H,0B4H     DB0C4H,0B4H,04H     DB00H     END           |
- 海尔空调制冷故障维..
- 2008-1-25
- 大尺寸TFT显示器..
- 2008-1-27
- 利用DC/DC转换..
- 2008-1-27
- 电动车铅酸蓄电池的..
- 2008-1-27
- 大型搅拌站自动配料..
- 2008-1-27
- 城市和工业污水处理..
- 2008-1-27
- 开关电源的数字控制..
- 2008-1-27
- 精密的智能电池使充..
- 2008-1-27
- 基于DSP控制的2..
- 2008-1-27
- 增强型运营商级多服..
- 2008-1-27
- 高效CCD数码相机..
- 2008-1-27
- Atheros 单..
- 2008-1-27
- Philips 推..
- 2008-1-27
- Fujitsu 数..
- 2008-1-27
- 如何给PCI卡选用..
- 2008-1-27
- A/D转换芯片的测..
- 2008-1-27
- 基于CTl技术的交..
- 2008-1-27
- MMIC和RFIC..
- 2008-1-27
- 利用皮弹服务器进行..
- 2008-1-27
- 白色发光二极管及其..
- 2008-1-27






