;P0.7小喇叭---生日快乐。
ORG 0000H
AJMP MAIN
ORG 000BH
JMP TIM0
ORG 0030H
;主程序
MAIN:MOV TMOD,#01H ;设定时方式
MOV IE,#82H ;开中断
START0:MOV 30H,#00H ;
NEXT:MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;查表取音调和节拍
MOV R2,A
JZ END0 ;为零,不进行处理.
ANL A,#0FH
MOV R5,A ;将节拍存入R5
MOV A,R2
SWAP A
ANL A,#0FH
JNZ SING ;根据音调决定是否演奏.
CLR TR0
JMP D1
SING:DEC A
MOV 22H,A;将音调存入22H.
RL A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;根据音调决定定时器初值.
MOV TH0,A ;放入TH0
MOV 21H,A
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A ;放入TL0
MOV 20H,A
SETB TR0 ;启动定时
D1:CALL DELAY
INC 30H
JMP NEXT
END0:CLR TR0
JMP START0
;定时器中断服务程序
TIM0:PUSH ACC
PUSH PSW
MOV TL0,20H ;重赋初值.
MOV TH0,21H
CPL P0.7
POP PSW
POP ACC
RETI
DELAY:MOV R7,#02H ;延时子程序
D2:MOV R4,#187
D3:MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
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,0B4H,0A4h,04H,82H,01H,81H,94H,84H,0C4H,0B4H,04H ;1
DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H,0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H ;2
DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H,82H,01H,81H,94H,84H,0C4H,0B4H,04H ;3
DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H,0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00;4
END