SPK EQU P3.7 ; 蜂鸣器所在端口
ORG 0000H
LJMP START
ORG 000BH
LJMP TIM0
ORG 0030H
START: MOV TMOD,#01H
MOV IE,#82H
MOV R2,#00H ;简谱码指针
NEXT:
MOV A,R2
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;取简谱码
JZ END0 ;是否取到结束码
MOV R7,A
ANL A,#0FH ;取出节拍码
MOV R3,A
MOV A,R7
SWAP A
ANL A,#0FH ;取出音符码
JNZ SONG
CLR TR0 ;休止符不发音
LJMP D1
;================= 歌曲播放子程序 === SONG: DEC A
RL A ;得到音频计时初始常数高8位地址 MOV R7,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV TH0,A
MOV 21H,A
MOV A,R7
INC A ;得到音频计时初始常数低8位地址 MOVC A,@A+DPTR
MOV TL0,A
MOV 20H,A
SETB TR0
D1: CALL DELAY
INC R2
SJMP NEXT
END0: CLR TR0 ;歌曲结束
LJMP START ;歌曲重复