打造国内最大的IC交易平台
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
简易电子琴的设计
类别:电子综合  
 
        

    

    

    一、设计题目:

    设计一简易电子琴,要求能够发出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