⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music2.asm

📁 单片机音乐编程
💻 ASM
字号:
				   ORG 0000H

                   AJMP        MAIN

                   ORG 000BH

                   MOV         TL0,R2

         MOV         TH0,R3     

         CPL           P3.6

                   RETI

                   ORG 001BH

                   DJNZ        R4,GOON ;中断次数不够,继续。

                   MOV         IE,#80H              ;持续时间到,该音符停止。

                   SJMP         RE01

GOON:      MOV         TL1,40H             

                   MOV         TH1,41H   

RE01:         RETI

                   ORG 0100H

MAIN:      MOV         R5,#02H             ;乐曲循环演奏次数

LOOP:       MOV         TMOD,#11H

                   MOV         IP,#02H

                   MOV         41H,#4CH ; T1初值放在41H,40H单元

                   MOV         40H,#0B0H        ;值越大,演奏越快

                   SETB         EA    

                   CLR           A

                   MOV         R1,A          ;R1作为音符指针

                   MOV         DPTR,#0300H;乐曲数据表的表头

L1:             MOVC      A,@A+DPTR

                   INC           R1                        ;指向音符的拍数字节

                   MOV         R6,A          ;音级字节暂存入R6

                   JZ              L3

                   ACALL     TONE                 

                   MOV         TH0,R3

                   MOV         TL0,R2

                   SETB         TR0

                   SETB         ET0

                   MOV         A,R1

                   MOVC      A,@A+DPTR

                   INC           R1

                   CJNE         R1,#00H,L2

                   MOV         DPTR,#0400H;表指针溢出,更改表头

L2:             ACALL     LONG                 ;

                   MOV         A,R1

                   AJMP        L1              ;

L3:             MOV         A,R1

                   MOVC      A,@A+DPTR

                   MOV         R7,A

                   INC           R1

                   CJNE         R1,#00H,L4

                   MOV         DPTR,#0400H

L4:             ACALL     LONG                 ;

                   MOV         A,R1

                   CJNE         R7,#0FH,L1

END0:       MOV         IE,#00H

                   MOV         TCON,#00H

                   MOV         TMOD,#00H

                   DJNZ        R5,LOOP

                   AJMP        $

                   ORG 0160H

TONE:       MOV         A,R6          ;取出音级字节

                   RL             A                         ;乘2,定时常数为双字节

                   MOV         42H,A                 ;暂存入42H单元

                   ADD          A,#05H               ;距离数表有7个字节,使查表正确

                   MOVC      A,@A+PC ;取出TH0

                   MOV         R3,A

         MOV         A,42H                 

                   INC           A

                   MOVC      A,@A+PC ;取出TL0

                   MOV         R2,A          ;

                   RET  

TAB1:        DB    0F8H,8EH,0F8H,0F9H,0F9H,5EH        

                   DB    0F9H,0BEH,0FAH,18H,0FAH,6DH      

                   DB    0FAH,0BEH,0FBH,09H,0FBH,51H      

                   DB    0FBH,95H,0FBH,0D4H,0FCH,11H      

                   DB    0FCH,49H,0FCH,7FH,0FCH,0B2H      

                   DB    0FCH,0E1H,0FDH,0FH,0FDH,39H

                   DB    0FDH,61H,0FDH,87H,0FDH,0ABH

                   DB    0FDH,0CDH,0FDH,0EDH,0FEH,0BH

                   DB    0FEH,27H,0FEH,42H,0FEH,5BH

                   DB    0FEH,73H,0FEH,8AH,0FEH,9FH

                   DB    0FEH,0B3H,0FEH,0C6H,0FEH,0D8H

                   DB    0FEH,0E9H,0FEH,0F9H,0FFH,08H

                   DB    0FFH,16H,0FFH,24H,0FFH,30H

                   DB    0FFH,3CH,0FFH,47H,0FFH,52H

                   DB    0FFH,5CH,0FFH,66H,0FFH,6FH

                   DB    0FFH,77H,0FFH,7FH,0FFH,86H

                   ORG 0200H                 ;音长子程序

LONG:      ADD          A,#0FH               ;使查表正确

                   MOVC      A,@A+PC ;取出定时器T1应中断的次数

                   MOV         R4,A          ;T1应中断的次数存入R4中

                   MOV         TH1,41H

                   MOV         TL1,40H

                   SETB         TR1

                   SETB         ET1

                   CJNE         R4,#00H,$ 

                   RET                                       ;音长子程序结束

TAB2:        DB    01,02,04,06                  ;应中断的次数

                   DB    08,10,12,14

                   DB    16,20,24,28

                   DB    32,40,48,64

                   ORG 0300H                 ;乐曲字节数据表

TAB:          DB    00H,04H,00H,04H,08H,04H,0DH,08H,0DH,04H

                   DB    0DH,08H,11H,04H,0FH,08H,0DH,04H

                   DB    0FH,08H,11H,02H,0FH,02H,0DH,08H,0DH,04H

                   DB    11H,08H,14H,04H,16H,0DH,16H,04H

                   DB    14H,08H,11H,04H,11H,08H,0DH,04H

                   DB    0FH,08H,0DH,04H,0FH,08H,11H,02H,0FH,02H

                   DB    0DH,08H,0AH,04H,0AH,08H,08H,04H

                   DB    0DH,0CH,00H,04H,16H,04H,14H,08H,11H,04H

                   DB    11H,08H,0DH,04H,0FH,08H,0DH,04H

         DB    0FH,08H,16H,04H,14H,08H,11H,04H

         DB    11H,08H,14H,04H,16H,0DH,19H,04H

                   DB    14H,08H,11H,04H,11H,08H,0DH,04H

                   DB    0FH,08H,0DH,04H,0FH,08H,11H,02H,0FH,02H

                   DB    0DH,08H,0AH,04H,0AH,08H,08H,04H

                   DB    0DH,0CH,00H,04H,00H,04H

                   DB    00H,0FH                      ;结束标记

                   END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -