简易电子琴的设计( 汇编)

简易电子琴的设计

一、             设计题目:

设计简易电子琴,要求能够发出1234567等七个音符。

使用元件:AT 89C51 LM324,喇叭,按键等

二、             设计目的

  1)能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。

2)熟悉8051单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。

3)为实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件。

4)对软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。

三、             系统硬件图

(一)   音乐产生原理及硬件设计

由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。本次设计中单片机晶振为12MHZ,那么定时器的计数周期为1MHZ,假如选择工作方式1,那T值便为T= 216--5105/相应的频率 ,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0相关的计数值如下表所示:

音符

频率(HZ

简谱码(T值)

1 DO

523

64580

2 RE

587

64684

3 M

659

64777

4 FA

698

64820

5 SO

784

64898

6 LA

880

64968

7 SI

988

65030

采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:

TABLE DW 64580646846477764820648986496865030

        源程序:

方案:产生按键音符

  ORG 0000H

        LJMP MAIN

        ORG 000BH

        LJMP BREAK

MAIN:  MOV TMOD,#01H       ;设置定时器0的工作方式

        SETB EA

       SETB ET0               ; 设置定时器0中断

       SETB TR0               ; 启动定时器0

WAIT1: LCALL KEY             ; 调用KEY子程序,判断有键按下否?第几个键?

       CLR EA                 ;屏蔽中断

       CJNE R3,#00H,WAIT1     ;如果R3=0,表示有键按下

       MOV A,22H              ;22H里存放的按键号送给A

       RL A                   ; 因为查表里都是字,所以得乘2查得数据

       MOV DPTR,#TABLE      ;指向表头

       MOVC A,@A+DPTR      ; 查表

       MOV TH0,A             ;将数据高位送TH0

       MOV 21H,A             ; 将高位备份

       MOV A,22H             ;22H里存放的按键号送给A

       RL A                   ;因为查表里都是字,所以得乘2查得数据

       INC A                  ;取低位数据

       MOVC A,@A+DPTR

       MOV TL0,A

       MOV 20H,A

WAIT2: LCALL KEY

       SETB EA

       CJNE R3,#00H,WAIT1

       JMP WAIT2

KEY:   MOV R3,#00H          ; KEY子程序,判断有键按下否?第几个键?

       MOV R1,#0FFH

       MOV R0,#00H

       MOV A,R1

       MOV P2,A

       MOV A,P2

       CLR C

       CPL C               ;利用标志位CY来判断是哪个键按下

       MOV R2,#08H

WAIT3: RLC A               ;移位判断

       JNC STORE

       INC R0      

       DJNZ R2,WAIT3

STORE: MOV 22H,R0        ; 按键号存22HR3=0有键按下

       MOV R3,#00H

       RET

BREAK: PUSH ACC          ;  中断产生方波,从P1.0口输出

       PUSH PSW

       MOV TL0,20H

       MOV TH0,21H

       CPL P1.0

       POP PSW

       POP ACC

       RETI

TABLE: DW 65030,64968,64898,64820,64777,64684,64580 ; 7654321

       END

方案二:产生按键音符

       ORG 0000H

       SJMP START

       ORG 000BH

       AJMP INT_0

       ORG 0030H

START: MOV P1,#00H

       SETB EA

       SETB ET0                       ;计数器0

       MOV TMOD,#02H

       MOV TH1,#09CH

       MOV TL1,#09CH                 ;定时器初植

       CLR TR0                        ;定时器不允许

SCAN:                                 ;键盘扫描

       MOV A,P2                   ;判断键盘按下,跳到SCAN_1,若未按,继续扫描

       CJNE A,#0FFH,SCAN_1

       NOP

       SJMP SCAN

SCAN_1:ACALL DELAY ;是不是真的要按下?如果是,则跳转SU_KEY查询是哪个按下?

       MOV A,P2

       CJNE A,#0FFH,SU_KEY

       NOP

       SJMP SCAN

SU_KEY:JNB P2.1,MU_1                  ;判断是哪个键按下?

       JNB P2.2,MU_2

       JNB P2.3,MU_3

       JNB P2.4,MU_4

       JNB P2.5,MU_5

       JNB P2.6,MU_6

       JNB P2.7,MU_7

       SJMP SCAN

                                     ;R1信号周期

MU_1:  MOV R1,#19                ;如果第一个按键按下,则R1=19,同时程序转NEXT

       SJMP NEXT

MU_2:  MOV R1,#17            

       SJMP NEXT

MU_3:  MOV R1,#15

       SJMP NEXT

MU_4:  MOV R1,#14

       SJMP NEXT

MU_5:  MOV R1,#13

       SJMP NEXT

MU_6:  MOV R1,#11

       SJMP NEXT

MU_7:  MOV R1,#10

       SJMP NEXT

NEXT:  MOV A,R1               

       MOV R0,A

       SETB TR0                       ;启动定时器0                        

NEXT_1:MOV A,P2                     ; 没键按下继续执行,有键按下,返回读引脚

       CJNE A,#0FFH,NEXT_1

       ACALL DELAY

       MOV A,P2                       ;真的没键按下

       CJNE A,#0FFH,NEXT_1

       CLR TR0                        ;不响

       AJMP SCAN                     ;扫描键盘去

INT_0:                                 ;中断程序

      DJNZ R0,RE                      ;R0不等于0时,返回

      CPL P1.0

      MOV A,R1

      MOV R0,A

RE:   RETI

DELAY:MOV R7,#100                    ;延长时间等待,键盘消抖

D1:   MOV R6,#10

D2:   DJNZ R6,D2

      DJNZ R7,D1

      RET

      END

生日快乐歌:(扩展功能部分程序)

      ORG 0000H

      JMP MAIN

      ORG 000BH

      JMP TT0

MAIN: MOV TMOD,#01H               ;设置定时器0工作方式

      MOV IE,#82H                    ;设置中断

MAIN0:MOV 30H,#00H

NEXT: MOV A,30H

      MOV DPTR,#TABLE              ;查表

      MOVC A,@A+DPTR

      MOV R2,A

      JZ STOP

      ANL A,0FH

      MOV R5,A

      MOV A,R2

      SWAP A

      ANL A,#0FH

      JNZ SING

      CLR TR0

      JMP W1

SING: DEC A

      MOV 22H,A

      RL A

      MOV DPTR,#TABLE1                   ;查表

      MOVC A,@A+DPTR

      MOV TH0,A

      MOV 21H,A

      MOV A,22H

      RL A

      INC A

      MOVC A,@A+DPTR

      MOV TL0,A

      MOV 20H,A

      SETB TR0

W1:   CALL DELAY

      INC 30H

      JMP NEXT

STOP: CLR TR0           

      JMP MAIN0

TT0:  PUSH ACC                            ;中断服务程序

      PUSH PSW

      MOV TL0,20H

      MOV TH0,21H

      CPL P1.0

      POP PSW

      POP ACC

      RETI

DELAY:MOV R7,#2                      ;延时187ms

 W2:  MOV R4,#187

 W3:  MOV R3,#248

      DJNZ R3,$

      DJNZ R4,W3

      DJNZ R7,W2

      DJNZ R5,DELAY

      RET

TABLE1:DW 64260,64400,64524,64580        ;音符计数植

       DW 64684,64777,64820,64898

       DW 64968,65030,65058,65110

DW 65157 , 65178, 65217

 TABLE:DB 82H,01H,81H,94H,84H           ;节拍表

       DB 0B4H, 0A4H,04H

       DB 82H,01H,81H,94H,84H

DB 0C4H ,0B4H,04H

       DB 82H,01H,81H, 0F4H,0D4H

       DB 0B4H, 0A4H,94H

       DB 0E2H,01H,0E1H,0D4H,0B4H

DB 0C4H ,0B4H,04H

       DB 82H,01H,81H,94H,84H

       DB 0B4H, 0A4H,04H

       DB 82H,01H,81H,94H,84H

DB 0C4H ,0B4H,04H

       DB 82H,01H,81H, 0F4H,0D4H

       DB 0B4H, 0A4H,94H

       DB 0E2H,01H,0E1H,0D4H,0B4H

       DB 0C4H ,0B4H,04H

       DB 00H

END

你可能感兴趣的:(c51,汇编,delay,工作,音乐,table,编程)