单片机之汇编语言会唱歌
大小:0.1 MB 人气: 2017-09-06 需要积分:0
DATA2 EQU 31H ;
SP1 EQU P3.7 ;
;-----------------------------------------------------
ORG 0000H ;
LJMP START ;
ORG 000BH ;
INC DATA1 ;中断服务,中断计数器加1
MOV TH0,#0DBH ;
MOV TL0,#0FEH ;11.0592M晶振,形成10毫秒中断
RETI ;
;---------------------------------------------------
START:
CPL SP1 ;
MOV SP,#50H ;
MOV TH0,#0DBH ;
MOV TL0,#0FEH ;
MOV TMOD,#01H ;
MOV IE,#82H ;
VOICE0:
NOP ;
MOV DPTR,#TABLE ;表头地址送DPTR
MOV DATA1,#00H ;中断计数器清0
MOV DATA2,#00H ;表序号清0
VOICE1:
NOP ;
CLR A ;
MOVC A,@A+DPTR ;查表取代码
JZ EXIT_END ;是00H,则结束
CJNE A,#0FFH,VOICE5 ;
LJMP VOICE3 ;
VOICE5:
NOP ;
MOV R6,A ;
INC DPTR ;
MOV A,DATA2 ;
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A ;
SETB TR0 ;启动计数
VOICE2:
NOP ;
CPL P3.7 ;
MOV A,R6 ;
MOV R3,A ;
LCALL DELAY ;
MOV A,R7 ;
CJNE A,DATA1,VOICE2 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV DATA1,#00H ;等于,则取下一代码
INC DPTR ;
LJMP VOICE1 ;
VOICE3:
NOP ;
CLR TR0 ;休止100毫秒
MOV R2,#0DH ;
VOICE4:
NOP ;
MOV R3,#0FFH ;
LCALL DELAY ;
DJNZ R2,VOICE4 ;
INC DPTR ;
LJMP VOICE1 ;
;--------------------------------------------------
EXIT_END:
NOP
MOV R2,#64H ;歌曲结束,延时1秒后继续
VOICE6:
MOV R3,#00H ;
LCALL DELAY ;
DJNZ R2,VOICE6 ;
LJMP VOICE0 ;
;--------------------------------------------------
DELAY:
NOP ;
DEL3:
MOV R4,#02H ;
DEL4:
NOP ;
DJNZ R4,DEL4 ;
NOP ;
DJNZ R3,DEL3 ;
RET ;
;-------------------------------------------------
TABLE:
DB 18H, 30H, 1CH , 10H
DB 20H, 40H, 1CH , 10H
DB 18H, 10H, 20H , 10H
DB 1CH, 10H, 18H , 40H
DB 1CH, 20H, 20H , 20H
DB 1CH, 20H, 18H , 20H
DB 20H, 80H, 0FFH, 20H
DB 30H, 1CH, 10H , 18H
DB 20H, 15H, 20H , 1CH
DB 20H, 20H, 20H , 26H
DB 40H, 20H, 20H , 2BH
DB 20H, 26H, 20H , 20H
DB 20H, 30H, 80H , 0FFH
DB 20H, 20H, 1CH , 10H
DB 18H, 10H, 20H , 20H
DB 26H, 20H, 2BH , 20H
DB 30H, 20H, 2BH , 40H
DB 20H, 20H, 1CH , 10H
DB 18H, 10H, 20H , 20H
DB 26H, 20H, 2BH , 20H
DB 30H, 20H, 2BH , 40H
DB 20H, 30H, 1CH , 10H
DB 18H, 20H, 15H , 20H
DB 1CH, 20H, 20H , 20H
DB 26H, 40H, 20H , 20H
DB 2BH, 20H, 26H , 20H
DB 20H, 20H, 30H , 80H
DB 20H, 30H, 1CH , 10H
DB 20H, 10H, 1CH , 10H
DB 20H, 20H, 26H , 20H
DB 2BH, 20H, 30H , 20H
DB 2BH, 40H, 20H , 15H
DB 1FH, 05H, 20H , 10H
DB 1CH, 10H, 20H , 20H
DB 26H, 20H, 2BH , 20H
DB 30H, 20H, 2BH , 40H
DB 20H, 30H, 1CH , 10H
DB 18H, 20H , 15H , 20H
DB 1CH, 20H , 20H , 20H
DB 26H, 40H, 20H , 20H
DB 2BH, 20H, 26H , 20H
DB 20H, 20H, 30H , 30H
DB 20H, 30H, 1CH , 10H
DB 18H, 40H, 1CH , 20H
DB 20H, 20H, 26H , 40H
DB 13H, 60H, 18H , 20H
DB 15H, 40H, 13H , 40H
DB 18H, 80H, 00H
END
2、单片机播放歌曲《兰花草》
*******************************************************SPK EQU P3.7 ; 蜂鸣器所在端口
ORG 0000H
JMP START
START:
MOV R3,#00H
NEXT:
MOV A,R3
MOV DPTR,#TABLE
MOVC A,@A+DPTR
JZ START
MOV R7,A
INC R3
MOV A,R3
MOVC A,@A+DPTR
MOV R2,A
ACALL SONG
INC R3
SJMP NEXT
;===============================================================================
;=== 歌曲播放子程序 ===
SONG:
MOV A,R2 ; 取出节拍
RL A
JNZ KEEP
MOV A,#01H
KEEP:
MOV R2,A
REPEAT:
ACALL EIGHTH
DJNZ R2,REPEAT
RET
;===============================================================================
;=== 产生1/8拍延时子程序 ===
EIGHTH:
MOV A,R7 ; 查表取出廷时参数,保存到R4
MOV DPTR,#DELAY_T
MOVC A,@A+DPTR
MOV R4,A
MOV A,R7 ; 查表取出1/8拍周期数,保存到R5
MOV DPTR,#S_PARA
MOVC A,@A+DPTR
MOV R5,A
NEXTCYC:
ACALL SOUND
DJNZ R5,NEXTCYC
RET
;===============================================================================
;=== 发声子程序 ===
SOUND:
SETB SPK
ACALL SDELAY
CLR SPK
ACALL SDELAY
RET
;===============================================================================
;=== 延时子程序 ===
SDELAY:
MOV A,R4 ; 廷时值在R4内
MOV R0,A
XL2:
MOV R1,#03H
DL1:
NOP
DJNZ R1,DL1
DJNZ R0,XL2
RET
;===============================================================================
;=== 1/8拍周期表 ===
S_PARA:
DS 1DH
DB 15H,16H,00
DB 19H,00H,1CH,00H,1FH,21H,00H,25H
DB 00H,29H,2CH,00H,31H,34H,37H,00H
DB 3EH,41H,00H,49H,00H,52H,57H,00H
DB 62H
;===============================================================================
;=== 延时参数表 ===
DELAY_T:
DS 1DH
DB 7EH,77H,00H
DB 6AH,00H,5EH,00H,54H,4FH,00H,46H
DB 00H,3FH,3BH,00H,35H,32H,2FH,00H
DB 2AH,27H,00H,23H,00H,1FH,1DH,0C0H
DB 1AH
;===============================================================================
;=== 歌曲表 ===
TABLE:
DW 2202H,2902H,2902H,2902H,2906H,2702H ;我从山中来
DW 2502H,2702H,2502H,2402H,2208H ;带着兰花草
DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H ;种在小园中
DW 2902H,2C02H,2D02H,2A02H,2908H ;祈祷花开早
DW 2902H,2E02H,2E02H,2C02H,2906H,2702H ;一日看三回
DW 2502H,2702H,2502H,2402H,2206H,1D02H ;看得花时过
DW 1D02H,2502H,2502H,2402H,2206H,2902H ;兰花却依然
DW 2702H,2502H,2402H,2002H,2208H ;苞也无一个
DW 0000H ;
END
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%