功能齐全的单片机音乐程序.docx
《功能齐全的单片机音乐程序.docx》由会员分享,可在线阅读,更多相关《功能齐全的单片机音乐程序.docx(37页珍藏版)》请在冰豆网上搜索。
功能齐全的单片机音乐程序
单片机最小系统,两位LED数码管由串口输出接两个164驱动,Lout,Rout为左右声道输出,
SET,ALT0,ALT1为三个按键,也可自己在开始的I/O定义改成你想用的I/O口;12M晶振
若用89C51则只可装下约14首歌曲,用89C52则可装下近40曲
源程序
;ElectronicMusic
;Version4.50
;Copyright(c)XAJ2001
;============================
LOUTBITP1.0;左声道输出
ROUTBITP1.2;右声道输出
SETBITP3.3;SET按键
ALT0BITP3.6;ALT0按键
ALT1BITP3.7;ALT1按键
;REPNUMEQU09H重复段编号
STATUEQU0AH;状态寄存器
LDYDSREQU0BH;左低音度数
RDYDSREQU0CH;右低音度数
LDYAREQU0DH;左低音协助
RDYAREQU0EH;右低音协助
JPCLKEQU0FH;节拍时钟
GENCLKEQU10H;通用时钟
SNSDCLKEQU11H;搜、存显示时钟
GEN16T0EQU12H;通用16位时钟
GEN16T1EQU13H;
SETST0EQU14H;设置状态
SETST1EQU15H;定时时钟
DISNUM0EQU16H;显示数值
DISNUM1EQU17H;寄存器(2位)
CSNEQU18H;当前曲曲号
REP0LEQU19H;0号重复段地址
REP0HEQU1AH;
REP1LEQU1BH;1号重复段地址
REP1HEQU1CH;
REP2LEQU1DH;2号重复段地址
REP2HEQU1EH
REP3LEQU1FH;3号重复段地址
REP3HEQU23H;
COSPEEDNEQU24H;
SPENREQU25H;
LOCFBIT00H;左声道开关标志
ROCFBIT01H;右声道开关标志
SECHSTOFBIT02H;搜索、存储标志
NEXTSFBIT03H;下一曲标志
CSBESTOFBIT04H;当前曲锁存/释放
CUYFDBIT05H;当前音符显示
KSETFBIT06H;SET键按下标志
KALT0FBIT07H;ALT0键按下标志
KALT1FBIT08H;ALT1键按下标志
SPEEDFBIT09H;速度增/减标志
TONEFBIT0AH;音调增/减标志
YPBITBIT0BH;音频逻辑输出
KBDISFBIT0CH;键盘显示标志
REP0FBIT0DH;0号重复段控制
REP1FBIT0EH;1号重复段控制
REP2FBIT0FH;2号重复段控制
REP3FBIT10H;3号重复段控制
SBOTMEQU25H;堆栈区(栈底)
BUFF0EQU43H;锁存曲数
BUFFEQU44H;锁存曲缓冲区
;============================
;=========BEGIN==============
ORG0000H
LJMPMAIN
;---------T0INT--------------
ORG000BH
LJMPT0INT
;---------T1INT--------------
ORG001BH
LJMPT1INT
;1.音频发生器
;---------YPFSQ(01)----------
ORG0030H
T0INT:
MOVTL0,R4
MOVTH0,R5
PUSHPSW
PUSHACC
PUSH01H
JBLOCF,ROPER
MOVR1,#00H
MOVA,LDYAR
T0LLOP:
RRCA
MOVYPBIT,C
XCHA,R1
CJNEA,LDYDSR,T0LNEXT
MOVC,YPBIT
MOVLOUT,C
INCLDYAR
;INCP0
SJMPROPER
T0LNEXT:
XCHA,R1
INCR1
SJMPT0LLOP
ROPER:
JBROCF,T0RETI
MOVR1,#00H
MOVA,RDYAR
T0RLOP:
RRCA
MOVYPBIT,C
XCHA,R1
CJNEA,RDYDSR,T0RNEXT
MOVC,YPBIT
MOVROUT,C
INCRDYAR
;INCP2
SJMPT0RETI
T0RNEXT:
XCHA,R1
INCR1
SJMPT0RLOP
T0RETI:
POP01H
POPACC
POPPSW
RETI
;2.通用时钟
;---------CLOCK(02)----------
T1INT:
MOVTL1,#0F0H
MOVTH1,#0D8H
PUSHPSW
PUSHACC
INCJPCLK
INCGENCLK
INCSNSDCLK
MOVA,SNSDCLK
CJNEA,#0FFH,T1NEXT
CLRSECHSTOF
T1NEXT:
INCGEN16T0
MOVA,GEN16T0
CJNEA,#100,T1NEXT0
MOVGEN16T0,#00H
INCGEN16T1
T1NEXT0:
INCSETST0
MOVA,SETST0
CJNEA,#100,T1RETI
MOVSETST0,#00H
INCSETST1
MOVA,SETST1
CJNEA,#20,T1RETI
MOVSETST1,#00H
MOVSTATU,#00H
T1RETI:
POPACC
POPPSW
RETI
;3.显示子程序
;---------DISPLAY(03)--------
DISPLAY:
PUSHACC
PUSHDPL
PUSHDPH
MOVDPTR,#T_FIGCODE
MOVA,DISNUM0
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
MOVA,DISNUM1
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
POPDPH
POPDPL
POPACC
RET
T_FIGCODE:
DB088H,0EBH,04CH,049H
;0123
DB02BH,019H,018H,0CBH
;4567
DB008H,009H,00AH,038H
;89AB
DB09CH,068H,01CH,01EH
;CDEF
DB080H,0E3H,044H,041H
;0.1.2.3.
DB023H,011H,010H,0C3H
;4.5.6.7.
DB000H,001H,002H,030H
;8.9.A.B.
DB094H,060H,014H,016H
;C.D.E.F.
DB0FFH,02FH,098H,07FH
;熄灭#G-
DB07CH,078H,0BCH,00AH
;coLR
DB029H
;Y
;4.主程序MAIN
;---------MAIN(04)-----------
MAIN:
MOVR0,#01H
CLRA
CLRAM:
MOV@R0,A
INCR0
CJNER0,#80H,CLRAM
MOVR0,A
MOVSP,#SBOTM
MOV08H,#BUFF
;MOV09H,#BUFF
MOVSCON,#00H
MOVTMOD,#11H
MOVTL1,#0F0H
MOVTH1,#0D8H
SETBEA
SETBET0
SETBET1
SETBTR1
START:
MOVDPTR,#T_SONGS
RYF:
LCALLRYFSUP
MOVA,R7
JZSTART
CJNER7,#0FFH,SYF
JBCNEXTSF,NEXTSCL
MOVA,STATU
JNZGONSBQ
MOVA,BUFF0
JNZMPSQCL
LCALLPAQSCL
SJMPMQNFD
MPSQCL:
LCALLPSQSCL
MQNFD:
LCALLQNFDSUP
MOVPJRYF:
INCDPTR
INCDPTR
SJMPRYF
NEXTSCL:
LCALLCSBESTOJG
JBCSBESTOF,CALLPSCL
LCALLPAQSCL
SJMPMOVPJRYF
CALLPSCL:
LCALLPSQSCL
SJMPMOVPJRYF
GONSBQ:
LCALLCSDPTR
INCDPTR
INCDPTR
SJMPMOVPJRYF
SYF:
CJNER6,#0FFH,CALLPLAY
LCALLREPCLSUP
SJMPMOVPJRYF
CALLPLAY:
LCALLYFDSUP
LCALLPLAY
SJMPMOVPJRYF
;5.读音符子程序
;---------RYFSUP(05)--------
RYFSUP:
CLRA
MOVCA,@A+DPTR
MOVR6,A
MOVA,#01H
MOVCA,@A+DPTR
MOVR7,A
RET
;6.统唱曲首处理
;---------PAQSCL(06)--------
PAQSCL:
MOVCSN,R6
INCDPTR
INCDPTR
LCALLRYFSUP
MOV02H,R6
MOV03H,R7
RET
;7.存唱曲首处理
;---------PSQSCL(07)--------
PSQSCL:
PUSHPSW
SETBRS0
CLRRS1
PSQC7E:
CJNER0,#7EH,PSQNEXT
PSQNEXT:
JCPSQNEXT1
MOVR0,#BUFF
SJMPPSQC7E
PSQNEXT1:
MOVA,@R0
JNZPSQNEXT2
INCR0
INCR0
INCR0
SJMPPSQC7E
PSQNEXT2:
MOVCSN,@R0
INCR0
MOV02H,@R0
INCR0
MOV03H,@R0
INCR0
POPPSW
LCALLCSDPTR
INCDPTR
INCDPTR
RET
;8.曲号闪显子程序
;---------QNFDSUP(08)-------
QNFDSUP:
PUSHACC
MOVGEN16T0,#00H
MOVGEN16T1,#00H
QNGON:
LCALLCSNSDISN
LCALLDISPLAY
MOVGENCLK,#00H
QNWAIT:
MOVA,GENCLK
CJNEA,#35,QNWAIT
MOVDISNUM0,#20H
MOVDISNUM1,#20H
LCALLDISPLAY
MOVGENCLK,#00H
QNWAIT1:
MOVA,GENCLK
CJNEA,#15,QNWAIT1
MOVA,GEN16T1
CJNEA,#02,QNGON
POPACC
RET
;9.曲号送显示寄存器
;---------CSNSDISN(09)------
CSNSDISN:
MOVA,CSN
ANLA,#0FH
LCALLCSBESTOJG
JNBCSBESTOF,NADP
ADDA,#10H
NADP:
MOVDISNUM0,A
MOVA,CSN
SWAPA
ANLA,#0FH
MOVDISNUM1,A
RET
;10.当前曲是否被存储判断
;---------CSBESTOJG(10)-----
CSBESTOJG:
PUSHACC
PUSHPSW
MOVA,BUFF0
JZCLRCSTOF
MOVR0,#BUFF
CSBCMPCSN:
MOVA,@R0
CJNEA,CSN,CSBGSCAN
SETBCSBESTOF
SJMPCSBRET
CSBGSCAN:
INCR0
INCR0
INCR0
CJNER0,#7EH,CSBNEXT
CSBNEXT:
JCCSBCMPCSN
CLRCSTOF:
CLRCSBESTOF
MOVR0,#BUFF
CSBCMP0:
MOVA,@R0
JZCSBRET
INCR0
INCR0
INCR0
CJNER0,#7EH,CSBNEXT1
CSBNEXT1:
JCCSBCMP0
CSBRET:
POPPSW
POPACC
RET
;11.找当前曲首址
;---------CSDPTR(11)--------
CSDPTR:
MOVDPTR,#T_SONGS
CSDSCAN:
LCALLRYFSUP
CJNER7,#0FFH,CSDNEXT
MOVA,R6
CJNEA,CSN,CSDNEXT
SJMPCSDRET
CSDNEXT:
INCDPTR
INCDPTR
SJMPCSDSCAN
CSDRET:
RET
;12.重复段处理子程序
;---------REPCLSUP(12)------
REPCLSUP:
MOVA,R7
ANLA,#0FH
CJNEA,#02H,CMPA3
MOVA,R7
SWAPA
ANLA,#0FH
JNZH4CMP1
JNBREP0F,REPRET0
CLRREP0F
MOVDPL,REP0L
MOVDPH,REP0H
REPRET0:
RET
H4CMP1:
CJNEA,#01H,H4CMP2
JNBREP1F,REPRET
CLRREP1F
MOVDPL,REP1L
MOVDPH,REP1H
RET
H4CMP2:
CJNEA,#02H,H4CMP3
JNBREP2F,REPRET
CLRREP2F
MOVDPL,REP2L
MOVDPH,REP2H
RET
H4CMP3:
CJNEA,#03H,REPRET
JNBREP3F,REPRET
CLRREP3F
MOVDPL,REP3L
MOVDPH,REP3H
RET
CMPA3:
CJNEA,#03H,REPRET
MOVA,R7
SWAPA
ANLA,#0FH
JNZH4VS1
SETBREP0F
MOVREP0L,DPL
MOVREP0H,DPH
SJMPSREPHAD
H4VS1:
CJNEA,#01H,H4VS2
SETBREP1F
MOVREP1L,DPL
MOVREP1H,DPH
SJMPSREPHAD
H4VS2:
CJNEA,#02H,H4VS3
SETBREP2F
MOVREP2L,DPL
MOVREP2H,DPH
SJMPSREPHAD
H4VS3:
CJNEA,#03H,REPRET
SETBREP3F
MOVREP3L,DPL
MOVREP3H,DPH
SREPHAD:
MOV09H,A
LCALLCSDPTR
REPGON:
INCDPTR
INCDPTR
LCALLRYFSUP
CJNER6,#0FFH,REPGON
MOVA,R7
SWAPA
ANLA,#0FH
CJNEA,09H,REPGON
REPRET:
RET
;13.音符显示子程序
;---------YFDSUP(13)--------
YFDSUP:
MOVA,STATU
JNZYFDRET
JBSECHSTOF,YFDRET
JNBCUYFD,YFSLED
XZFCLD:
MOVDISNUM0,#20H
MOVDISNUM1,#20H
SJMPYFDSPLAY
YFSLED:
MOVA,R6
JZXZFCLD
ANLA,#0FH
PUSHDPL
PUSHDPH
MOVDPTR,#T_YFDCOD
MOVCA,@A+DPTR
MOVDISNUM0,A
POPDPH
POPDPL
MOVA,R6
SWAPA
ANLA,#0FH
MOVDISNUM1,A
YFDSPLAY:
LCALLDISPLAY
YFDRET:
RET
T_YFDCOD:
DB20H;--
DB01H;1
DB02H;2
DB03H;3
DB04H;4
DB05H;5
DB06H;6
DB07H;7
DB11H;#1
DB12H;#2
DB14H;#4
DB15H;#5
DB16H;#6
;14.唱音符子程序
;---------PLAY(14)----------
PLAY:
MOVA,R6
JZPCOSPECL
PUSHDPL
PUSHDPH
MOVDPTR,#T_SD
ANLA,#0FH
MOVCA,@A+DPTR
XCHA,R6
SWAPA
ANLA,#0FH
MOVB,#12
MULAB
ADDA,R6
ADDA,R2
RLA
MOVR6,A
MOVDPTR,#T_RAN
MOVCA,@A+DPTR
MOVTH0,A
MOVR5,A
MOVA,R6
INCA
MOVCA,@A+DPTR
MOVTL0,A
MOVR4,A
POPDPH
POPDPL
SETBTR0
PCOSPECL:
LCALLCOSPECL
PJPWAIT:
MOVJPCLK,#00H
PDELAY:
LCALLKCXCL
JBNEXTSF,PRET
MOVA,JPCLK
CJNEA,01H,PNEXT
PNEXT:
JCPDELAY
DJNZR7,PJPWAIT
PRET:
CLRTR0
RET
;---------TABSD-------------
T_SD:
DB01h;useless
DB01H
DB03H
DB05H
DB06H
DB08H
DB0AH
DB0CH
DB02H
DB04H
DB07H
DB09H
DB0bH
;---------TABRAN------------
T_RAN:
DW0F111H;useless
dw0f111h;area0
dw0f1e8h
dw0f2b2h
dw0f373h
dw0f426h
dw0f4eeh
dw0f571h
dw0f609h
dw0f699h
dw0f71fh
dw0f79fh
dw0f817h
dw0f889h;area1
dw0f8f4h
dw0f95ah
dw0f9b9h
dw0fa13h
dw0fa68h
dw0fab9h
dw0fb04h
dw0fb4ch
dw0fb90h
dw0fbcfh
dw0fc0ch
dw0fc45h;area2
dw0fc7ah
dw0fcadh
dw0fcdch
dw0fd0ah
dw0fd34h
dw0fd5ch
dw0fd82h
dw0fda6h
dw0fdc8h
dw0fde8h
dw0fe06h
dw0fe22h;area3
dw0fe3dh
dw0fe56h
dw0fe6eh
dw0fe85h
dw0fe9ah
dw0feaeh
dw0fec1h
dw0fed3h
dw0fee3h
dw0fef4h
dw0ff02h
dw0ff11h;area4
dw0ff1fh
dw0ff2bh
dw0ff37h
dw0ff42h
dw0ff4dh
dw0ff57h
dw0ff60h
dw0ff6ah
dw0ff72h
dw0ff7ah
dw0ff81h
dw0ff89h;5
;15.共速处理
;---------COSPECL(15)-------
COSPECL:
MOVR1,03H
MOVA,COSPEEDN
JZCOSPRET
PUSHCOSPEEDN
MOVA,R1
COSPEGON:
MOVB,#08H
MULAB
CLRC
SUBBA,R1
JNCCOSPNEXT
DECB
COSPNEXT:
MOVR6,#03H
DIV8:
CLRC
XCHA,B
RRCA
XCHA,B
RRCA
DJNZR6,DIV8
MOVR1,A
DJNZCOSPEEDN,COSPEGON
POPCOSPEEDN
MOVA,R1
JNZCOSPRET
MOVR1,#01H
COSPRET:
RET
;16.键盘查询处理
;---------KCXCL(16)---------
KCXCL:
LCALLKSET
LCALLKALT0
LCALLKALT1
JNBKSETF,KNEXT0
LCALLKSETCL
KSETSTC:
MOVSETST0,#00H
MOVSETST1,#00H
SETBKBDISF
SJMPKDIS
KNEXT0:
JNBKALT0F,KNEXT1
LCALLKALT0CL
SJMPKSETSTC
KNEXT1:
JNBKALT1F,KDIS
LCALLKALT1CL
SJMPKSETSTC
KDIS:
M