51单片机汇编语言音乐程序.docx
《51单片机汇编语言音乐程序.docx》由会员分享,可在线阅读,更多相关《51单片机汇编语言音乐程序.docx(17页珍藏版)》请在冰豆网上搜索。
51单片机汇编语言音乐程序
01两只老虎
NEXTBIT10H;定义标志位
ORG0000H
JMPMAIN
ORG000BH
JMPTONE
ORG001BH
JMPBEAT
ORG0100H
MAIN:
MOVTMOD,#11H
MOVTH0,R2
MOVTL0,R3
MOVTH1,#3CH
MOVTL1,#0B0H
MOVR4,#00H
MOVDPTR,#TAB
YD:
MOVA,R4;取音调数据
MOVCA,@A+DPTR
MOVR2,A
XRLA,#00H
JNZJP;直接取节拍
INCR4
CALLPD;判断指针是否溢出
MOVA,R4
MOVCA,@A+DPTR
MOVR3,A
XRLA,#0FFH
JZJP
MOVA,R2
XRLA,#0FFH
JNZMAIN
JP:
INCR4;取节拍数据
CALLPD
MOVA,R4
MOVCA,@A+DPTR
MOVR5,A
SETBEA
SETBET0
SETBET1
SETBTR0
SETBTR1
SETBNEXT
JBNEXT,$
INCR4
CALLPD
JMPYD
PD:
MOVA,R4
CJNEA,#00H,L1
INCDPH
L1:
RET
;音调产生子程序
TONE:
CPLP2.0
MOVTH0,R2
MOVTL0,R3
RETI
;节拍产生子程序
BEAT:
DJNZR5,L2
MOVTH1,#3CH
MOVTL1,#0B0H
L3:
RETI
L2:
CLRTR0
CLRTR1
CLRNEXT
JMPL3
;两只老虎音符表
TAB:
DB0FBH,0F9H,08H,0FCH,066H,08H,0FCH,0C7H,08H,0FBH,0F9H,08H
DB0FBH,0F9H,08H,0FCH,066H,08H,0FCH,0C7H,08H,0FBH,0F9H,08H
DB0FCH,0C7H,08H,0FCH,0F3H,08H,0FDH,4AH,10H,0FCH,0C7H,08H
DB0FCH,0F3H,08H,0FDH,4AH,08H,0FDH,4AH,04H,0FDH,95H,04H
DB0FDH,4AH,04H,0FCH,0F3H,04H,0FCH,0C7H,08H,0FBH,0F9H,08H
DB0FDH,4AH,04H,0FDH,95H,04H,0FDH,4AH,04H,0FCH,0F3H,04H
DB0FCH,0C7H,08H,0FBH,0F9H,08H,0FCH,66H,08H,0FAH,93H,08H
DB0FBH,0F9H,08H,00H,08H,0FCH,66H,04H,0FAH,93H,08H
DB0FBH,0F9H,08H,00H,10H,0FFH,0FFH
END
02祝你平安
ORG0000H
LJMPSTART
ORG000BH
INC20H;中断服务,中断计数器加1
MOVTH0,#0D8H
MOVTL0,#0EFH;12M晶振,形成10毫秒中断
RETI
START:
MOVSP,#50H
MOVTH0,#0D8H
MOVTL0,#0EFH
MOVTMOD,#01H
MOVIE,#82H
MUSIC0:
NOP
MOVDPTR,#DAT;表头地址送DPTR
MOV20H,#00H;中断计数器清0
MOVB,#00H;表序号清0
MUSIC1:
NOP
CLRA
MOVCA,@A+DPTR;查表取代码
JZEND0;是00H,则结束
CJNEA,#0FFH,MUSIC5
LJMPMUSIC3
MUSIC5:
NOP
MOVR6,A
INCDPTR
MOVA,B
MOVCA,@A+DPTR;取节拍代码送R7
MOVR7,A
SETBTR0;启动计数
MUSIC2:
NOP
CPLP3.3
MOVA,R6
MOVR3,A
LCALLDEL
MOVA,R7
CJNEA,20H,MUSIC2;中断计数器(20H)=R7否?
;不等,则继续循环
MOV20H,#00H;等于,则取下一代码
INCDPTR
;INCB
LJMPMUSIC1
MUSIC3:
NOP
CLRTR0;休止100毫秒
MOVR2,#0DH
MUSIC4:
NOP
MOVR3,#0FFH
LCALLDEL
DJNZR2,MUSIC4
INCDPTR
LJMPMUSIC1
END0:
NOP
MOVR2,#64H;歌曲结束,延时1秒后继续
MUSIC6:
MOVR3,#00H
LCALLDEL
DJNZR2,MUSIC6
LJMPMUSIC0
DEL:
NOP
DEL3:
MOVR4,#02H
DEL4:
NOP
DJNZR4,DEL4
NOP
DJNZR3,DEL3
RET
NOP
DAT:
db26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db20h,10h,2bh,10h,26h,30h,30h,80h,00H
END
03生日歌
ORG0000H
JMPSTART
ORG000BH
JMPTIM0
ORG0030H
START:
MOVTMOD,#01H
MOVIE,#82H
START0:
MOV30H,#00H
NEXT:
MOVA,30H
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVR2,A
JZEND0
ANLA,#0FH
MOVR5,A
MOVA,R2
SWAPA
ANLA,#0FH
JNZSING
CLRTR0
JMPD1
SING:
DECA
MOV22H,A
RLA
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVTH0,A
MOV21H,A
MOVA,22H
RLA
INCA
MOVCA,@A+DPTR
MOVTL0,A
MOV20H,A
SETBTR0
D1:
CALLDELAY
INC30H
JMPNEXT
END0:
CLRTR0
JMPSTART0
TIM0:
PUSHACC
PUSHPSW
MOVTH0,21H
MOVTL0,20H
CPLP3.7
POPPSW
POPACC
RETI
DELAY:
MOVR7,#02
D2:
MOVR4,#187
D3:
MOVR3,#248
DJNZR3,$
DJNZR4,D3
DJNZR7,D2
DJNZR5,DELAY
RET
TABLE1:
DW64260,64400,64524,64580
DW64684,64777,64820,64898
DW64968,65030,65058,65110
DW65157,65178,65217
TABLE:
DB82H,01H,81H,94H,84H
DB0B4H,0A4H,04H
DB82H,01H,81H,94H,84H
DB0C4H,0B4H,04H
DB82H,01H,81H,0F4H,0D4H
DB0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H
DB0C4H,0B4H,04H
DB82H,01H,81H,94H,84H
DB0B4H,0A4H,04H
DB82H,01H,81H,94H,84H
DB0C4H,0B4H,04H
DB82H,01H,81H,0F4H,0D4H
DB0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H
DB0C4H,0B4H,04H
DB00H
END
04八月桂花香
ORG0000H
LJMPSTART
ORG000BH
INC20H;中断服务,中断计数器加1
MOVTH0,#0D8H
MOVTL0,#0EFH;12M晶振,形成10毫秒中断
RETI
START:
MOVSP,#50H
MOVTH0,#0D8H
MOVTL0,#0EFH
MOVTMOD,#01H
MOVIE,#82H
MUSIC0:
NOP
MOVDPTR,#DAT;表头地址送DPTR
MOV20H,#00H;中断计数器清0
MUSIC1:
NOP
CLRA;A清零
MOVCA,@A+DPTR;查表取代码
JZEND0;是00H,则结束
CJNEA,#0FFH,MUSIC5;如果是休止符,往下执行
LJMPMUSIC3
MUSIC5:
NOP
MOVR6,A;R6=18H音符的频率
INCDPTR;DPTR加一
MOVA,#0
MOVCA,@A+DPTR;取节拍代码送R7
MOVR7,A;R7=30H音符发音的时间
SETBTR0;启动计数
MUSIC2:
NOP
CPLP2.3;P2.3是音乐输出引脚
MOVA,R6
MOVR3,A;籖3=R6=18H
LCALLDEL
MOVA,R7
CJNEA,20H,MUSIC2;中断计数器(20H)=R7否?
;不等,则继续循环
MOV20H,#00H;等于,则取下一代码
INCDPTR
LJMPMUSIC1
MUSIC3:
NOP;休止100毫秒
CLRTR0
MOVR2,#0DH;R2=13
MUSIC4:
NOP
MOVR3,#0FFH;R3=255
LCALLDEL
DJNZR2,MUSIC4
INCDPTR
LJMPMUSIC1
END0:
NOP
MOVR2,#0FFH;歌曲结束,延时1秒后继续
MUSIC6:
MOVR3,#00H
LCALLDEL
DJNZR2,MUSIC6
LJMPMUSIC0
DEL:
NOP
DEL3:
MOVR4,#02H
DEL4:
NOP
DJNZR4,DEL4
NOP
DJNZR3,DEL3
RET
NOP
DAT:
DB18H,30H,1CH,10H
DB20H,40H,1CH,10H
DB18H,10H,20H,10H
DB1CH,10H,18H,40H
DB1CH,20H,20H,20H
DB1CH,20H,18H,20H
DB20H,80H,0FFH,20H
DB30H,1CH,10H,18H
DB20H,15H,20H,1CH
DB20H,20H,20H,26H
DB40H,20H,20H,2BH
DB20H,26H,20H,20H
DB20H,30H,80H,0FFH
DB20H,20H,1CH,10H
DB18H,10H,20H,20H
DB26H,20H,2BH,20H
DB30H,20H,2BH,40H
DB20H,20H,1CH,10H
DB18H,10H,20H,20H
DB26H,20H,2BH,20H
DB30H,20H,2BH,40H
DB20H,30H,1CH,10H
DB18H,20H,15H,20H
DB1CH,20H,20H,20H
DB26H,40H,20H,20H
DB2BH,20H,26H,20H
DB20H,20H,30H,80H
DB20H,30H,1CH,10H
DB20H,10H,1CH,10H
DB20H,20H,26H,20H
DB2BH,20H,30H,20H
DB2BH,40H,20H,15H
DB1FH,05H,20H,10H
DB1CH,10H,20H,20H
DB26H,20H,2BH,20H
DB30H,20H,2BH,40H
DB20H,30H,1CH,10H
DB18H,20H,15H,20H
DB1CH,20H,20H,20H
DB26H,40H,20H,20H
DB2BH,20H,26H,20H
DB20H,20H,30H,30H
DB20H,30H,1CH,10H
DB18H,40H,1CH,20H
DB20H,20H,26H,40H
DB13H,60H,18H,20H
DB15H,40H,13H,40H
DB18H,80H,00H
end
05兰花草
SPKEQUP3.3;蜂鸣器所在端口
ORG0000H
JMPSTART
START:
MOVR3,#00H
NEXT:
MOVA,R3
MOVDPTR,#TABLE
MOVCA,@A+DPTR
JZSTART
MOVR7,A
INCR3
MOVA,R3
MOVCA,@A+DPTR
MOVR2,A
ACALLSONG
INCR3
SJMPNEXT
;===============================================================================
;===歌曲播放子程序===
SONG:
MOVA,R2;取出节拍
RLA
JNZKEEP
MOVA,#01H
KEEP:
MOVR2,A
REPEAT:
ACALLEIGHTH
DJNZR2,REPEAT
RET
;===============================================================================
;===产生1/8拍延时子程序===
EIGHTH:
MOVA,R7;查表取出廷时参数,保存到R4
MOVDPTR,#DELAY_T
MOVCA,@A+DPTR
MOVR4,A
MOVA,R7;查表取出1/8拍周期数,保存到R5
MOVDPTR,#S_PARA
MOVCA,@A+DPTR
MOVR5,A
NEXTCYC:
ACALLSOUND
DJNZR5,NEXTCYC
RET
;===============================================================================
;===发声子程序===
SOUND:
SETBSPK
ACALLSDELAY
CLRSPK
ACALLSDELAY
RET
;===============================================================================
;===延时子程序===
SDELAY:
MOVA,R4;廷时值在R4内
MOVR0,A
XL2:
MOVR1,#03H
DL1:
NOP
DJNZR1,DL1
DJNZR0,XL2
RET
;===============================================================================
;===1/8拍周期表===
S_PARA:
DS1DH
DB15H,16H,00
DB19H,00H,1CH,00H,1FH,21H,00H,25H
DB00H,29H,2CH,00H,31H,34H,37H,00H
DB3EH,41H,00H,49H,00H,52H,57H,00H
DB62H
;===============================================================================
;===延时参数表===
DELAY_T:
DS1DH
DB7EH,77H,00H
DB6AH,00H,5EH,00H,54H,4FH,00H,46H
DB00H,3FH,3BH,00H,35H,32H,2FH,00H
DB2AH,27H,00H,23H,00H,1FH,1DH,0C0H
DB1AH
;===============================================================================
;===歌曲表===
TABLE:
DW2202H,2902H,2902H,2902H,2906H,2702H;我从山中来
DW2502H,2702H,2502H,2402H,2208H;带着兰花草
DW2E02H,2E02H,2E02H,2E02H,2E06H,2C02H;种在小园中
DW2902H,2C02H,2D02H,2A02H,2908H;祈祷花开早
DW2902H,2E02H,2E02H,2C02H,2906H,2702H;一日看三回
DW2502H,2702H,2502H,2402H,2206H,1D02H;看得花时过
DW1D02H,2502H,2502H,2402H,2206H,2902H;兰花却依然
DW2702H,2502H,2402H,2002H,2208H;苞也无一个
DW0000H;
END