📄 music.asm
字号:
;**************************************************************
;All rights Reserved
;voice.asm
;单片机发声程序,播放梁祝歌曲
;用定时器中断产生音调,用程序延时来产生节拍
;***************************************************************
SoundOut bit P1.0 ;定义输出引脚
ORG 0000H
LJMP START
ORG 001BH
AJMP TIME1 ;中断服务,中断计数器加1
ORG 20H
START: MOV TMOD,#10H ;用定时器1,方式1
MOV SP,#50H
SETB EA
SETB ET1
MOV DPTR,#TAB
;判断合适的数据,进行定时器初始值设置
LOOP: CLR A
MOVC A,@A+DPTR
MOV R1,A ;保存第一个值
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R0,A ;保存第二个值
ORL A,R1 ;看相邻两个值是否相等
JZ XZF ;若acc等于0则跳转
MOV A,R0
ANL A,R1 ;两个数是否都为ff是否为最后一个
CJNE A,#0FFH,NEXT
SJMP START
NEXT: MOV TH1,R1
MOV TL1,R0
SETB TR1
SJMP NEXT1
XZF: CLR TR1 ;关闭定时器
NEXT1: CLR A
INC DPTR
MOVC A,@A+DPTR
MOV R2,A
SETB TR1
LOOP1: LCALL D130 ;取节拍
DJNZ R2,LOOP1
INC DPTR
AJMP LOOP
D130: MOV R5,#160
D2: MOV R4,#200
D1: NOP
NOP
DJNZ R4,D1
DJNZ R5,D2
RET
;定时中断服务程序
TIME1: MOV TH1,R1
MOV TL1,R0
CPL SoundOut
RETI
TAB: DB 0FAH,15H,08H
DB 0FBH,05H,06H
DB 0FBH,8CH,02H
DB 0FCH,44H,04H
DB 0FCH,0ACH,02H
DB 0FBH,8CH,02H
DB 0FCH,44H,02H
DB 0FBH,05H,04H
DB 0FDH,82H,04H
DB 0FEH,22H,04H
DB 0FDH,0C8H,02H
DB 0FDH,82H,02H
DB 0FDH,09H,02H
DB 0FDH,82H,02H
DB 0FCH,0ACH,10H
DB 0FBH,8CH,01H
DB 0FCH,0ACH,06H
DB 0FDH,09H,02H
DB 0FCH,0CH,04H
DB 0FBH,08CH,04H
DB 0FBH,05H,04H
DB 0FCH,8CH,02H
DB 0FCH,44H,04H
DB 0FCH,0ACH,04H
DB 0FAH,15H,04H
DB 0FCH,44H,04H
DB 0FBH,8CH,02H
DB 0FBH,05H,02H
DB 0FBH,8CH,02H
DB 0FCH,44H,02H
DB 0FBH,05H,10H
DB 0FFH,0FFH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -