📄 单片机唱歌.asm
字号:
ORG 0000H
LJMP START
ORG 001BH
LJMP TIME1
START: MOV TMOD,#10H ;T1工作在方式1
MOV IE,#88H ;中断使能
MAIN: MOV 40H,#00H ;设简谱码指针初始值
NEXT: MOV A,40H ;简谱码指针暂存累加器A
MOV DPTR,#TABLE ;取简谱码
MOVC A,@A+DPTR
CJNE A,#00H,PLAY ;取到的简谱码不是结束码,转
LJMP STOP ;是结束码,退出
PLAY: MOV R1,A ;R1暂存简谱码
ANL A,#0FH ;取节拍码
MOV R2,A ;节拍码暂存R2
MOV A,R1
ANL A,#0F0H ;取音符码
CJNE A,#00H,MUSIC ;音符码为不为0,调发音子程序
CLR TR1 ;音符码为0,不发音
LJMP DEL
MUSIC:SWAP A
DEC A
MOV 22H,A
ADD A,22H
MOV R3,A
MOV DPTR,#TABLE1 ;取相应计数值
MOVC A,@A+DPTR
MOV TH1,A ;暂存高位字节
MOV 21H,A
MOV A,R3
INC A
MOVC A,@A+DPTR ;取相应计数值的低位字节
MOV TL1,A ;暂存低位字节
MOV 20H,A
SETB TR1 ;启动定时器
DEL: LCALL DELAY
INC 40H ;指向下一个简谱码
LJMP NEXT
STOP: CLR TR1 ;停止定时器
LJMP MAIN
TIME1:PUSH ACC ;现场保护
PUSH PSW
CPL P1.7 ;P1.7反相输出,演奏音乐
MOV TL1,20H ;重设计数值
MOV TH1,21H
POP PSW
POP ACC
RETI
DELAY:MOV R7,#02H ;4/4曲调,延时125ms子程序
DELA1:MOV R6,#125
DELA2:MOV R5,#248
DJNZ R5,$
DJNZ R6,DELA2
DJNZ R7,DELA1
DJNZ R2,DELAY
RET
TABLE1:DW 64524,64580,64684,64777 ;简码值: ,1,2,3
DW 64820,64898,64968,65030,65058 ;简码值:4,5,6,7,
TABLE:;第1行曲子
DB 64H,42H,62H,98H
DB 74H,92H,72H,68H
DB 64H,22H,32H,44H,32H,22H
DB 3CH
;第2行曲子
DB 64H,42H,62H,94H,04H,82H
DB 74H,94H,68H
DB 64H,32H,42H,54H,04H,12H
DB 2CH
;第3行曲子
DB 74H,94H,98H
DB 84H,72H,82H,98H
DB 72H,82H,92H,72H,72H,62H,42H,22H
DB 3CH
;第4行曲子
DB 64H,42H,62H,94H,04H,82H
DB 74H,94H,68H
DB 64H,32H,42H,54H,04H,12H
DB 2CH
;结束码
DB 00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -