📄 music.asm
字号:
TEMPLOW EQU 30H
TEMPHIGH EQU 31H
SOUNDPOINTER EQU 32H
;-----------------------------------------
S equ 65536
TEMP equ 12000000/12
T equ TEMP/2
;-----------------------------------------
DO equ 64580 ;S-T/523
RE equ 64684 ;S-T/587
MI equ 64777 ;S-T/659
FA equ 64820 ;S-T/698
SO equ 64898 ;S-T/784
LA equ 64968 ;S-T/880
TI_L equ 65030 ;S-T/988
;-----------------------------------------
DO_H equ 65058 ;S-T/1046
RE_H equ 65110 ;S-T/1174
MI_H equ 65157 ;S-T/1318
FA_H equ 65178 ;S-T/1397
SO_H equ 65217 ;S-T/1568
LA_H equ 65252 ;S-T/1760
TI_H equ 65283 ;S-T/1976
DO_HH equ 65297 ;S-T/2093
;=========================================
; 主程序
;=========================================
ORG 00H
JMP MAIN
ORG 0BH
JMP TIMER_INT
;=========================================
; 音乐演示子程序
;=========================================
MAIN:
JMP RESET
RESET:
SETB EA
SETB ET0
MOV TMOD,#00000001B ;TIMER0 MODE 1
MAINLOOP:
MOV SOUNDPOINTER,#1
SOUNDLOOP:
MOV A,SOUNDPOINTER
CALL GETSOUND
JZ SOUNDEND
PUSH ACC
ANL A,#0FH
JZ NOTONE
SETB TR0
DEC A
MOV R4,A ;根据SOUNDTABLE中数据的低四位选择音调频率
CALL GETTONE
NOTONE:
POP ACC
SWAP A
ANL A,#0FH
MOV B,#5
MUL AB
MOV R5,A
CALL DELAY ;根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
CLR TR0
INC SOUNDPOINTER
JMP SOUNDLOOP
SOUNDEND:
MOV R5,#20
CALL DELAY
JMP MAINLOOP
TIMER_INT:
PUSH ACC
MOV TL0,TEMPLOW
MOV TH0,TEMPHIGH
CPL P2.0
POP ACC
RETI
ENDSOUND EQU 00H
GETSOUND:
MOVC A,@A+PC
RET
;ORG 00DBH
/*
SOUNDTABLE:
DB 25H,28H
DB 2AH,4AH,29H,28H,48H,28H
DB 26H,46H,28H,45H,25H,28H
DB 2AH,4AH,29H,28H,48H,28H
DB 29H,49H,2AH,49H,40H
DB 2AH,4AH,2BH,4CH,40H
DB 3DH,1DH,2DH,2DH,4CH,40H
DB 2AH,4AH,2CH,48H,28H,2AH
DB 29H,46H,25H,48H,40H
DB ENDSOUND*/
SOUNDTABLE:
db 0x66,0x27,0x68,0x26,0x28,0x28,0x27,0x26,0x47,0x43
db 0x67,0x28,0x69,0x27,0x29,0x29,0x28,0x27,0x46,0x46
db 0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a,0x29,0x4a
db 0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,0x23,0x28,0x27
db 0x46,0x46,0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a
db 0x29,0x4a,0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,0x23
db 0x28,0x27,0x46,0x46
db ENDSOUND
;-----------------------------------
; 选择音调频率
;-----------------------------------
GETTONE:
MOV DPTR,#TONETABLE
MOV A,R4
RL A
MOVC A,@A+DPTR
MOV TH0,A
MOV TEMPHIGH,A
MOV A,R4
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A
MOV TEMPLOW,A
RET
TONETABLE:
DW DO ,RE ,MI ,FA ,SO ,LA ,TI_L
DW DO_H,RE_H,MI_H,FA_H,SO_H,LA_H,TI_H
DW DO_HH
;=========================================
; 延时子程序
;=========================================
DELAY:
DELAY1:
MOV R6,#100;50ms
DEL: MOV R7,#249
DJNZ R7,$
DJNZ R6,DEL
DJNZ R5,DELAY1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -