|  | 功能齐全的单片机音乐程序 文章长度[ ] 加入时间[2007/7/14 ] 更新 时间[2025/10/30 11:06:27 ] 级别[0 ] [评论 ] [收藏 ]单片机最小系统,两位LED数码管由串口输出接两个164驱动,Lout,Rout为左右声道输出,
 SET,  ALT0, ALT1为三个按键,也可自己在开始的I/O定义改成你想用的I/O口;12M晶振
 若用89C51则只可装下约14首歌曲,用89C52则可装下近40曲
 
 
 源程序
 ;   Electronic Music
 ;   Version 4.50
 ;   Copyright (c) XAJ 2001
 ;============================
 LOUT  BIT P1.0 ;左声道输出
 ROUT  BIT P1.2 ;右声道输出
 SET   BIT P3.3 ;SET按键
 ALT0  BIT P3.6 ;ALT0按键
 ALT1  BIT P3.7 ;ALT1按键
 
 ;REPNUM   EQU 09H重复段编号
 STATU    EQU 0AH;状态寄存器
 LDYDSR   EQU 0BH;左低音度数
 RDYDSR   EQU 0CH;右低音度数
 LDYAR    EQU 0DH;左低音协助
 RDYAR    EQU 0EH;右低音协助
 JPCLK    EQU 0FH;节拍时钟
 GENCLK   EQU 10H;通用时钟
 SNSDCLK  EQU 11H;搜、存显示时钟
 GEN16T0  EQU 12H;通用16位时钟
 GEN16T1  EQU 13H;
 SETST0   EQU 14H;设置状态
 SETST1   EQU 15H;  定时时钟
 DISNUM0  EQU 16H;显示数值
 DISNUM1  EQU 17H;寄存器(2位)
 CSN      EQU 18H;当前曲曲号
 REP0L    EQU 19H;0号重复段地址
 REP0H    EQU 1AH;
 REP1L    EQU 1BH;1号重复段地址
 REP1H    EQU 1CH;
 REP2L    EQU 1DH;2号重复段地址
 REP2H    EQU 1EH
 REP3L    EQU 1FH;3号重复段地址
 REP3H    EQU 23H;
 COSPEEDN EQU 24H;
 SPENR    EQU 25H;
 
 LOCF     BIT 00H;左声道开关标志
 ROCF     BIT 01H;右声道开关标志
 SECHSTOF BIT 02H;搜索、存储标志
 NEXTSF   BIT 03H;下一曲标志
 CSBESTOF BIT 04H;当前曲锁存/释放
 CUYFD    BIT 05H;当前音符显示
 KSETF    BIT 06H;SET键按下标志
 KALT0F   BIT 07H;ALT0键按下标志
 KALT1F   BIT 08H;ALT1键按下标志
 SPEEDF   BIT 09H;速度增/减标志
 TONEF    BIT 0AH;音调增/减标志
 YPBIT    BIT 0BH;音频逻辑输出
 KBDISF   BIT 0CH;键盘显示标志
 REP0F    BIT 0DH;0号重复段控制
 REP1F    BIT 0EH;1号重复段控制
 REP2F    BIT 0FH;2号重复段控制
 REP3F    BIT 10H;3号重复段控制
 
 SBOTM    EQU 25H;堆栈区(栈底)
 BUFF0    EQU 43H;锁存曲数
 BUFF     EQU 44H;锁存曲缓冲区
 ;============================
 
 ;=========BEGIN==============
 ORG   0000H
 LJMP  MAIN
 ;---------T0INT--------------
 ORG   000BH
 LJMP  T0INT
 
 ;---------T1INT--------------
 ORG   001BH
 LJMP  T1INT
 ;1.音频发生器
 ;---------YPFSQ(01)----------
 ORG   0030H
 T0INT:    MOV TL0,R4
 MOV TH0,R5
 PUSH PSW
 PUSH ACC
 PUSH 01H
 JB  LOCF,ROPER
 MOV R1,#00H
 MOV A,LDYAR
 T0LLOP:   RRC A
 MOV YPBIT,C
 XCH A,R1
 CJNE A,LDYDSR,T0LNEXT
 MOV C,YPBIT
 MOV LOUT,C
 INC LDYAR
 ;      INC P0
 SJMP ROPER
 T0LNEXT:  XCH A,R1
 INC R1
 SJMP T0LLOP
 ROPER:    JB  ROCF,T0RETI
 MOV R1,#00H
 MOV A,RDYAR
 T0RLOP:   RRC A
 MOV YPBIT,C
 XCH A,R1
 CJNE A,RDYDSR,T0RNEXT
 MOV C,YPBIT
 MOV ROUT,C
 INC RDYAR
 ;      INC P2
 SJMP T0RETI
 T0RNEXT:  XCH A,R1
 INC R1
 SJMP T0RLOP
 T0RETI:   POP 01H
 POP ACC
 POP PSW
 RETI
 ;2.通用时钟
 ;---------CLOCK(02)----------
 T1INT:    MOV TL1,#0F0H
 MOV TH1,#0D8H
 PUSH PSW
 PUSH ACC
 INC JPCLK
 INC GENCLK
 INC SNSDCLK
 MOV A,SNSDCLK
 CJNE A,#0FFH,T1NEXT
 CLR SECHSTOF
 T1NEXT:   INC GEN16T0
 MOV A,GEN16T0
 CJNE A,#100,T1NEXT0
 MOV GEN16T0,#00H
 INC GEN16T1
 T1NEXT0:  INC SETST0
 MOV A,SETST0
 CJNE A,#100,T1RETI
 MOV SETST0,#00H
 INC SETST1
 MOV A,SETST1
 CJNE A,#20,T1RETI
 MOV SETST1,#00H
 MOV STATU,#00H
 T1RETI:   POP ACC
 POP PSW
 RETI
 ;3.显示子程序
 ;---------DISPLAY(03)--------
 DISPLAY:  PUSH ACC
 PUSH DPL
 PUSH DPH
 MOV DPTR,#T_FIGCODE
 MOV A,DISNUM0
 MOVC A,@A+DPTR
 MOV SBUF,A
 JNB TI,$
 CLR TI
 MOV A,DISNUM1
 MOVC A,@A+DPTR
 MOV SBUF,A
 JNB TI,$
 CLR TI
 POP DPH
 POP DPL
 POP ACC
 RET
 T_FIGCODE:
 DB 088H,0EBH,04CH,049H
 ; 0    1    2    3
 DB 02BH,019H,018H,0CBH
 ;  4    5    6    7
 DB 008H,009H,00AH,038H
 ;  8    9    A    B
 DB 09CH,068H,01CH,01EH
 ;  C    D    E    F
 DB 080H,0E3H,044H,041H
 ;  0.   1.   2.   3.
 DB 023H,011H,010H,0C3H
 ;  4.   5.   6.   7.
 DB 000H,001H,002H,030H
 ;  8.   9.   A.   B.
 DB 094H,060H,014H,016H
 ;  C.   D.   E.   F.
 DB 0FFH,02FH,098H,07FH
 ; 熄灭  #    G    -
 DB 07CH,078H,0BCH,00AH
 ;  c    o    L    R
 DB 029H
 ;  Y
 ;4.主程序MAIN
 ;---------MAIN(04)-----------
 MAIN:     MOV R0,#01H
 CLR A
 CLRAM:    MOV @R0,A
 INC R0
 CJNE R0,#80H,CLRAM
 MOV R0,A
 MOV SP,#SBOTM
 MOV 08H,#BUFF
 ;MOV 09H,#BUFF
 MOV SCON,#00H
 MOV TMOD,#11H
 MOV TL1,#0F0H
 MOV TH1,#0D8H
 SETB EA
 SETB ET0
 SETB ET1
 SETB TR1
 
 START:    MOV DPTR,#T_SONGS
 RYF:      LCALL RYFSUP
 MOV A,R7
 JZ  START
 CJNE R7,#0FFH,SYF
 JBC NEXTSF,NEXTSCL
 MOV A,STATU
 JNZ GONSBQ
 MOV A,BUFF0
 JNZ MPSQCL
 LCALL PAQSCL
 SJMP MQNFD
 MPSQCL:   LCALL PSQSCL
 MQNFD:    LCALL QNFDSUP
 MOVPJRYF: INC DPTR
 INC DPTR
 SJMP RYF
 NEXTSCL:  LCALL CSBESTOJG
 JB  CSBESTOF,CALLPSCL
 LCALL PAQSCL
 SJMP MOVPJRYF
 CALLPSCL: LCALL PSQSCL
 SJMP MOVPJRYF
 GONSBQ:   LCALL CSDPTR
 INC DPTR
 INC DPTR
 SJMP MOVPJRYF
 SYF:    CJNE R6,#0FFH,CALLPLAY
 LCALL REPCLSUP
 SJMP MOVPJRYF
 CALLPLAY: LCALL YFDSUP
 LCALL PLAY
 SJMP MOVPJRYF
 ;5.读音符子程序
 ;---------RYFSUP(05)--------
 RYFSUP:   CLR A
 MOVC A,@A+DPTR
 MOV R6,A
 MOV A,#01H
 MOVC A,@A+DPTR
 MOV R7,A
 RET
 ;6.统唱曲首处理
 ;---------PAQSCL(06)--------
 PAQSCL:   MOV CSN,R6
 INC DPTR
 INC DPTR
 LCALL RYFSUP
 MOV 02H,R6
 MOV 03H,R7
 RET
 ;7.存唱曲首处理
 ;---------PSQSCL(07)--------
 PSQSCL:   PUSH PSW
 SETB RS0
 CLR RS1
 PSQC7E:   CJNE R0,#7EH,PSQNEXT
 PSQNEXT:  JC  PSQNEXT1
 MOV R0,#BUFF
 SJMP PSQC7E
 PSQNEXT1: MOV A,@R0
 JNZ PSQNEXT2
 INC R0
 INC R0
 INC R0
 SJMP PSQC7E
 PSQNEXT2: MOV CSN,@R0
 INC R0
 MOV 02H,@R0
 INC R0
 MOV 03H,@R0
 INC R0
 POP PSW
 LCALL CSDPTR
 INC DPTR
 INC DPTR
 RET
 ;8.曲号闪显子程序
 ;---------QNFDSUP(08)-------
 QNFDSUP:  PUSH ACC
 MOV GEN16T0,#00H
 MOV GEN16T1,#00H
 QNGON:    LCALL CSNSDISN
 LCALL DISPLAY
 MOV GENCLK,#00H
 QNWAIT:   MOV A,GENCLK
 CJNE A,#35,QNWAIT
 MOV DISNUM0,#20H
 MOV DISNUM1,#20H
 LCALL DISPLAY
 MOV GENCLK,#00H
 QNWAIT1:  MOV A,GENCLK
 CJNE A,#15,QNWAIT1
 MOV A,GEN16T1
 CJNE A,#02,QNGON
 POP ACC
 RET
 ;9.曲号送显示寄存器
 ;---------CSNSDISN(09)------
 CSNSDISN: MOV A,CSN
 ANL A,#0FH
 LCALL CSBESTOJG
 JNB CSBESTOF,NADP
 ADD A,#10H
 NADP:     MOV DISNUM0,A
 MOV A,CSN
 SWAP A
 ANL A,#0FH
 MOV DISNUM1,A
 RET
 ;10.当前曲是否被存储判断
 ;---------CSBESTOJG(10)-----
 CSBESTOJG:PUSH ACC
 PUSH PSW
 MOV A,BUFF0
 JZ  CLRCSTOF
 MOV R0,#BUFF
 CSBCMPCSN:MOV A,@R0
 CJNE A,CSN,CSBGSCAN
 SETB CSBESTOF
 SJMP CSBRET
 CSBGSCAN: INC R0
 INC R0
 INC R0
 CJNE R0,#7EH,CSBNEXT
 CSBNEXT:  JC  CSBCMPCSN
 CLRCSTOF: CLR CSBESTOF
 MOV R0,#BUFF
 CSBCMP0:  MOV A,@R0
 JZ  CSBRET
 INC R0
 INC R0
 INC R0
 CJNE R0,#7EH,CSBNEXT1
 CSBNEXT1: JC  CSBCMP0
 CSBRET:   POP PSW
 POP ACC
 RET
 ;11.找当前曲首址
 ;---------CSDPTR(11)--------
 CSDPTR:   MOV DPTR,#T_SONGS
 CSDSCAN:  LCALL RYFSUP
 CJNE R7,#0FFH,CSDNEXT
 MOV A,R6
 CJNE A,CSN,CSDNEXT
 SJMP CSDRET
 CSDNEXT:  INC DPTR
 INC DPTR
 SJMP CSDSCAN
 CSDRET:   RET
 ;12.重复段处理子程序
 ;---------REPCLSUP(12)------
 REPCLSUP: MOV A,R7
 ANL A,#0FH
 CJNE A,#02H,CMPA3
 MOV A,R7
 SWAP A
 ANL A,#0FH
 JNZ H4CMP1
 JNB REP0F,REPRET0
 CLR REP0F
 MOV DPL,REP0L
 MOV DPH,REP0H
 REPRET0:  RET
 H4CMP1:   CJNE A,#01H,H4CMP2
 JNB REP1F,REPRET
 CLR REP1F
 MOV DPL,REP1L
 MOV DPH,REP1H
 RET
 H4CMP2:   CJNE A,#02H,H4CMP3
 JNB REP2F,REPRET
 CLR REP2F
 MOV DPL,REP2L
 MOV DPH,REP2H
 RET
 H4CMP3:   CJNE A,#03H,REPRET
 JNB REP3F,REPRET
 CLR REP3F
 MOV DPL,REP3L
 MOV DPH,REP3H
 RET
 CMPA3:    CJNE A,#03H,REPRET
 MOV A,R7
 SWAP A
 ANL A,#0FH
 JNZ H4VS1
 SETB REP0F
 MOV REP0L,DPL
 MOV REP0H,DPH
 SJMP SREPHAD
 H4VS1:    CJNE A,#01H,H4VS2
 SETB REP1F
 MOV REP1L,DPL
 MOV REP1H,DPH
 SJMP SREPHAD
 H4VS2:    CJNE A,#02H,H4VS3
 SETB REP2F
 MOV REP2L,DPL
 MOV REP2H,DPH
 SJMP SREPHAD
 H4VS3:    CJNE A,#03H,REPRET
 SETB REP3F
 MOV REP3L,DPL
 MOV REP3H,DPH
 SREPHAD:  MOV 09H,A
 LCALL CSDPTR
 REPGON:   INC DPTR
 INC DPTR
 LCALL RYFSUP
 CJNE R6,#0FFH,REPGON
 MOV A,R7
 SWAP A
 ANL A,#0FH
 CJNE A,09H,REPGON
 REPRET:   RET
 ;13.音符显示子程序
 ;---------YFDSUP(13)--------
 YFDSUP:   MOV A,STATU
 JNZ YFDRET
 JB  SECHSTOF,YFDRET
 JNB CUYFD,YFSLED
 XZFCLD:   MOV DISNUM0,#20H
 MOV DISNUM1,#20H
 SJMP YFDSPLAY
 YFSLED:   MOV A,R6
 JZ  XZFCLD
 ANL A,#0FH
 PUSH DPL
 PUSH DPH
 MOV DPTR,#T_YFDCOD
 MOVC A,@A+DPTR
 MOV DISNUM0,A
 POP DPH
 POP DPL
 MOV A,R6
 SWAP A
 ANL A,#0FH
 MOV DISNUM1,A
 YFDSPLAY: LCALL DISPLAY
 YFDRET:   RET
 T_YFDCOD: DB 20H  ;--
 DB 01H  ; 1
 DB 02H  ; 2
 DB 03H  ; 3
 DB 04H  ; 4
 DB 05H  ; 5
 DB 06H  ; 6
 DB 07H  ; 7
 DB 11H  ;#1
 DB 12H  ;#2
 DB 14H  ;#4
 DB 15H  ;#5
 DB 16H  ;#6
 ;14.唱音符子程序
 ;---------PLAY(14)----------
 PLAY:     MOV A,R6
 JZ  PCOSPECL
 PUSH DPL
 PUSH DPH
 MOV DPTR,#T_SD
 ANL A,#0FH
 MOVC A,@A+DPTR
 XCH A,R6
 SWAP A
 ANL A,#0FH
 MOV B,#12
 MUL AB
 ADD A,R6
 ADD A,R2
 RL  A
 MOV R6,A
 MOV DPTR,#T_RAN
 MOVC A,@A+DPTR
 MOV TH0,A
 MOV R5,A
 MOV A,R6
 INC A
 MOVC A,@A+DPTR
 MOV TL0,A
 MOV R4,A
 POP DPH
 POP DPL
 SETB TR0
 PCOSPECL: LCALL COSPECL
 PJPWAIT:  MOV JPCLK,#00H
 PDELAY:   LCALL KCXCL
 JB  NEXTSF,PRET
 MOV A,JPCLK
 CJNE A,01H,PNEXT
 PNEXT:    JC  PDELAY
 DJNZ R7,PJPWAIT
 PRET:     CLR TR0
 RET
 ;---------TABSD-------------
 T_SD:     DB  01h  ;useless
 DB  01H
 DB  03H
 DB  05H
 DB  06H
 DB  08H
 DB  0AH
 DB  0CH
 DB  02H
 DB  04H
 DB  07H
 DB  09H
 DB  0bH
 ;---------TABRAN------------
 T_RAN:    DW 0F111H  ;useless
 dw 0f111h  ; area 0
 dw 0f1e8h
 dw 0f2b2h
 dw 0f373h
 dw 0f426h
 dw 0f4eeh
 dw 0f571h
 dw 0f609h
 dw 0f699h
 dw 0f71fh
 dw 0f79fh
 dw 0f817h
 dw 0f889h  ; area 1
 dw 0f8f4h
 dw 0f95ah
 dw 0f9b9h
 dw 0fa13h
 dw 0fa68h
 dw 0fab9h
 dw 0fb04h
 dw 0fb4ch
 dw 0fb90h
 dw 0fbcfh
 dw 0fc0ch
 dw 0fc45h    ;area 2
 dw 0fc7ah
 dw 0fcadh
 dw 0fcdch
 dw 0fd0ah
 dw 0fd34h
 dw 0fd5ch
 dw 0fd82h
 dw 0fda6h
 dw 0fdc8h
 dw 0fde8h
 dw 0fe06h
 dw 0fe22h  ;  area 3
 dw 0fe3dh
 dw 0fe56h
 dw 0fe6eh
 dw 0fe85h
 dw 0fe9ah
 dw 0feaeh
 dw 0fec1h
 dw 0fed3h
 dw 0fee3h
 dw 0fef4h
 dw 0ff02h
 dw 0ff11h    ;area 4
 dw 0ff1fh
 dw 0ff2bh
 dw 0ff37h
 dw 0ff42h
 dw 0ff4dh
 dw 0ff57h
 dw 0ff60h
 dw 0ff6ah
 dw 0ff72h
 dw 0ff7ah
 dw 0ff81h
 dw 0ff89h    ;    5
 ;15.共速处理
 ;---------COSPECL(15)-------
 COSPECL:  MOV R1,03H
 MOV A,COSPEEDN
 JZ  COSPRET
 PUSH COSPEEDN
 MOV A,R1
 COSPEGON: MOV B,#08H
 MUL AB
 CLR C
 SUBB A,R1
 JNC COSPNEXT
 DEC B
 COSPNEXT: MOV R6,#03H
 DIV8:     CLR C
 XCH A,B
 RRC A
 XCH A,B
 RRC A
 DJNZ R6,DIV8
 MOV R1,A
 DJNZ COSPEEDN,COSPEGON
 POP COSPEEDN
 MOV A,R1
 JNZ COSPRET
 MOV R1,#01H
 COSPRET:  RET
 ;16.键盘查询处理
 ;---------KCXCL(16)---------
 KCXCL:    LCALL KSET
 LCALL KALT0
 LCALL KALT1
 JNB KSETF,KNEXT0
 LCALL KSETCL
 KSETSTC:  MOV SETST0,#00H
 MOV SETST1,#00H
 SETB KBDISF
 SJMP KDIS
 KNEXT0:   JNB KALT0F,KNEXT1
 LCALL KALT0CL
 SJMP KSETSTC
 KNEXT1:   JNB KALT1F,KDIS
 LCALL KALT1CL
 SJMP KSETSTC
 KDIS:     MOV A,STATU
 JNZ KSSNSD
 JNB SECHSTOF,KRET
 KSSNSD:   JNB KBDISF,KRET
 CLR KBDISF
 LCALL DISPLAY
 KRET:     RET
 ;17.KSET键是否按下查询
 ;---------KSET(17)----------
 KSET:     SETB SET
 JB  SET,CSETRET
 MOV GENCLK,#00H
 SETLOP:   MOV A,GENCLK
 CJNE A,#02,SETLOP
 SETB SET
 JB  SET,CSETRET
 CLR TR0
 SETWAIT:  SETB SET
 JNB SET,SETWAIT
 MOV GENCLK,#00H
 SETLOP1:  MOV A,GENCLK
 CJNE A,#02,SETLOP1
 SETB TR0
 SETB KSETF
 RET
 CSETRET:  CLR KSETF
 RET
 ;18.KALT0键是否按下查询
 ;---------KALT0(18)---------
 KALT0:    SETB ALT0
 JB  ALT0,CALT0RET
 MOV GENCLK,#00H
 ALT0LOP:  MOV A,GENCLK
 CJNE A,#02,ALT0LOP
 SETB ALT0
 JB  ALT0,CALT0RET
 CLR TR0
 ALT0WAIT: SETB ALT0
 JNB ALT0,ALT0WAIT
 MOV GENCLK,#00H
 ALT0LOP1: MOV A,GENCLK
 CJNE A,#02,ALT0LOP1
 SETB TR0
 SETB KALT0F
 RET
 CALT0RET: CLR KALT0F
 RET
 ;19.KALT1键是否按下查询
 ;---------KALT1(19)---------
 KALT1:    SETB ALT1
 JB  ALT1,CALT1RET
 MOV GENCLK,#00H
 ALT1LOP:  MOV A,GENCLK
 CJNE A,#02,ALT1LOP
 SETB ALT1
 JB  ALT1,CALT1RET
 CLR TR0
 ALT1WAIT: SETB ALT1
 JNB ALT1,ALT1WAIT
 MOV GENCLK,#00H
 ALT1LOP1: MOV A,GENCLK
 CJNE A,#02,ALT1LOP1
 SETB TR0
 SETB KALT1F
 RET
 CALT1RET: CLR KALT1F
 RET
 ;20.SET键处理
 ;---------KSETCL(20)--------
 KSETCL:   INC STATU
 MOV A,STATU
 CJNE A,#07H,STATUDIS
 MOV STATU,#00H
 STATUDIS: MOV DISNUM0,#23H
 MOV DISNUM1,STATU
 RET
 ;21.KALT0键处理
 ;---------KALT0CL(21)-------
 KALT0CL:  MOV A,STATU
 JNZ CASEB1
 KA0S0GO:  INC DPTR
 INC DPTR
 LCALL RYFSUP
 MOV A,R7
 JNZ EQUFF
 MOV DPTR,#T_SONGS
 SJMP KA0NEXT
 EQUFF:    INC A
 JNZ KA0S0GO
 KA0NEXT:  LCALL RYFSUP
 MOV CSN,R6
 LCALL CSNSDISN
 MOV A,DPL
 CLR C
 SUBB A,#02H
 JNC KA0NEXT1
 DEC DPH
 KA0NEXT1: MOV DPL,A
 CLR REP0F
 CLR REP1F
 CLR REP2F
 CLR REP3F
 SETB NEXTSF
 SETB SECHSTOF
 RET
 CASEB1:   CJNE A,#01H,CASEB2
 INC LDYDSR
 MOV A,LDYDSR
 CJNE A,#04H,LDYDSL4
 MOV LDYDSR,#00H
 LDYDSL4:  MOV DISNUM0,LDYDSR
 MOV DISNUM1,#26H
 RET
 
 HCOSPEEDN EQU 12H
 CASEB2:   CJNE A,#02H,CASEB3
 MOV A,COSPEEDN
 CJNE A,#HCOSPEEDN,KA0NEXT4
 KA0NEXT4: JNC KA0NEXT5
 INC COSPEEDN
 KA0NEXT5: MOV SPENR,COSPEEDN
 LCALL SPENSDISN
 RET
 CASEB3:   CJNE A,#03H,CASEB4
 CLR SPEEDF
 LCALL SPEEDCL
 RET
 CASEB4:   CJNE A,#04H,CASEB5
 CLR TONEF
 LCALL TONECL
 RET
 CASEB5:   CJNE A,#05H,CASEB6
 CPL LOCF
 JNB LOCF,KA0NEXT2
 MOV DISNUM0,#24H
 SJMP KA0NEXT3
 KA0NEXT2: MOV DISNUM0,#25H
 KA0NEXT3: MOV DISNUM1,#26H
 RET
 CASEB6:   CJNE A,#06H,KA0RET
 CPL CUYFD
 JNB CUYFD,KA0NEXT6
 MOV DISNUM0,#24H
 SJMP KA0NEXT7
 KA0NEXT6: MOV DISNUM0,#25H
 KA0NEXT7: MOV DISNUM1,#28H
 KA0RET:   RET
 ;22.速度数送显示寄存器
 ;---------SPENSDISN(22)----
 SPENSDISN:MOV A,SPENR
 ANL A,#0FH
 MOV DISNUM0,A
 MOV A,SPENR
 SWAP A
 ANL A,#0FH
 MOV DISNUM1,A
 RET
 ;23.速度处理
 ;---------SPEEDCL(23)------
 HSPEED  EQU 02H;
 LSPEED  EQU 50H;
 SPEEDCL:  JB  SPEEDF,DNSPEED
 CJNE R3,#HSPEED,SCLNEXT
 SCLNEXT:  JC  SCLNEXT1
 DEC R3
 SJMP SCLNEXT1
 DNSPEED:
 CJNE R3,#LSPEED,SCLNEXT2
 SCLNEXT2: JNC SCLNEXT1
 INC R3
 SCLNEXT1: LCALL CSBESTOJG
 JNB CSBESTOF,SCLNEXT3
 INC R0
 INC R0
 MOV @R0,03H
 SCLNEXT3: LCALL COSPECL
 MOV SPENR,R1
 LCALL SPENSDISN
 RET
 ;24.音调处理
 ;---------TONECL(24)---------
 ;LTONE  EQU 00  ;C
 HTONE  EQU 11  ;B
 TONECL:   JB  TONEF,DNTONE
 CJNE R2,#HTONE,TCLNEXT0
 TCLNEXT0: JNC TCLNEXT
 INC R2
 SJMP TCLNEXT
 DNTONE:   MOV A,R2
 JZ  TCLNEXT
 DEC R2
 TCLNEXT:  LCALL CSBESTOJG
 JNB CSBESTOF,TCLNEXT1
 INC R0
 MOV @R0,02H
 TCLNEXT1: PUSH DPL
 PUSH DPH
 MOV DPTR,#T_TONDISC
 MOV A,ROV A,R2
 RL A
 MOVC A,@A+DPTR
 MOV DISNUM1,A
 MOV A,R2
 RL A
 INC A
 MOVC A,@A+DPTR
 MOV DISNUM0,A
 POP DPH
 POP DPL
 RET
 T_TONDISC:DW 200CH ; C
 DW 210CH ;#C
 DW 200DH ; D
 DW 210DH ;#D
 DW 200EH ; E
 DW 200FH ; F
 DW 210FH ;#F
 DW 2022H ; G
 DW 2122H ;#G
 DW 200AH ; A
 DW 210AH ;#A
 DW 200BH ; B
 ;25.KALT1键处理
 ;---------KALT1CL(25)--------
 KALT1CL:  MOV A,STATU
 JNZ CASE1
 LCALL CSBESTOJG
 JNB CSBESTOF,KA1NEXT
 MOV @R0,#00H
 DEC BUFF0
 SJMP KA1NEXT2
 KA1NEXT: CJNE R0,#7EH,KA1NEXT1
 KA1NEXT1: JNC KA1NEXT2
 MOV @R0,CSN
 INC R0
 MOV @R0,02H
 INC R0
 MOV @R0,03H
 INC BUFF0
 KA1NEXT2: LCALL CSNSDISN
 SETB SECHSTOF
 RET
 CASE1:    CJNE A,#01H,CASE2
 INC RDYDSR
 MOV A,RDYDSR
 CJNE A,#04H,RDYDSL4
 MOV RDYDSR,#00H
 RDYDSL4:  MOV DISNUM0,RDYDSR
 MOV DISNUM1,#27H
 RET
 CASE2:    CJNE A,#02H,CASE3
 MOV A,COSPEEDN
 JZ  KA1NEXT5
 DEC COSPEEDN
 KA1NEXT5: MOV SPENR,COSPEEDN
 LCALL SPENSDISN
 RET
 CASE3:    CJNE A,#03H,CASE4
 SETB SPEEDF
 LCALL SPEEDCL
 RET
 CASE4:    CJNE A,#04H,CASE5
 SETB TONEF
 LCALL TONECL
 RET
 CASE5:    CJNE A,#05H,CASE6
 CPL ROCF
 JNB ROCF,KA1NEXT3
 MOV DISNUM0,#24H
 SJMP KA1NEXT4
 KA1NEXT3: MOV DISNUM0,#25H
 KA1NEXT4: MOV DISNUM1,#27H
 RET
 CASE6:    CJNE A,#06H,KA1RET
 MOV DISNUM0,#23H
 MOV DISNUM1,#06H
 KA1RET:   RET
 ;========= 乐曲表============
 ;---------SONGS--------------
 T_SONGS:       乐曲表表首
 dw 01ffh,;song1:xiao la ba...
 dw  0b05h,
 dw  2504h,
 dw  2604h,
 dw  2506h,
 dw  0002h,
 dw  2504h,
 dw  2604h,
 dw  2506h,
 dw  0002h,
 dw  2504h,
 dw  2604h,
 dw  2504h,
 dw  2304h,
 dw  2204h,
 dw  2104h,
 dw  2206h,
 
 DW 16FFH;SONG16:Liang Zhi Lao Hu
 DW  0715H
 DW  0FF21H  ;REP21
 DW  0FF01H  ;REP01
 DW  2102H
 DW  2202H
 DW  2302H
 DW  2102H
 DW  0FF02H  ;REP02
 DW  0FF03H  ;REP03
 DW  2302H
 DW  2402H
 DW  2504H
 DW  2302H
 DW  2402H
 DW  2504H
 DW  0FF11H  ;REP11
 DW  2501H
 DW  2601H
 DW  2501H
 DW  2401H
 DW  2302H
 DW  2102H
 DW  0FF12H  ;REP12
 DW  0FF13H  ;REP13
 DW  2202H
 DW  1502H
 DW  2104H
 DW  2202H
 DW  1502H
 DW  2104H
 DW  0FF22H  ;REP22
 DW  0FF23H  ;REP23
 
 DW  0000H  ;乐曲表表尾
 END
 ;=========END================
 注:设计者手头有近40首曲子的音乐数据(花了大量时间对简谱进行手工转换!),而每块
 AT89C51的4KROM种除指令外剩下空间只可放14首左右。
 这里给出第一曲和第16曲《两只老虎》作一示例。
 
 
 
 
 (文章推荐人:电池)
 
 2           RL A           MOVC A,@A+DPTR           MOV DISNUM1,A           MOV A,R2           RL A           INC A           MOVC A,@A+DPTR           MOV DISNUM0,A           POP DPH           POP DPL           RET T_TONDISC:DW 200CH ; C           DW 210CH ;#C           DW 200DH ; D           DW 210DH ;#D           DW 200EH ; E           DW 200FH ; F           DW 210FH ;#F           DW 2022H ; G           DW 2122H ;#G           DW 200AH ; A           DW 210AH ;#A           DW 200BH ; B ;25.KALT1键处理 ;---------KALT1CL(25)-------- KALT1CL:  MOV A,STATU           JNZ CASE1           LCALL CSBESTOJG           JNB CSBESTOF,KA1NEXT           MOV @R0,#00H           DEC BUFF0           SJMP KA1NEXT2 KA1NEXT: CJNE R0,#7EH,KA1NEXT1 KA1NEXT1: JNC KA1NEXT2           MOV @R0,CSN           INC R0           MOV @R0,02H           INC R0           MOV @R0,03H           INC BUFF0 KA1NEXT2: LCALL CSNSDISN           SETB SECHSTOF           RET CASE1:    CJNE A,#01H,CASE2           INC RDYDSR           MOV A,RDYDSR           CJNE A,#04H,RDYDSL4           MOV RDYDSR,#00H RDYDSL4:  MOV DISNUM0,RDYDSR           MOV DISNUM1,#27H           RET CASE2:    CJNE A,#02H,CASE3           MOV A,COSPEEDN           JZ  KA1NEXT5           DEC COSPEEDN KA1NEXT5: MOV SPENR,COSPEEDN           LCALL SPENSDISN           RET CASE3:    CJNE A,#03H,CASE4           SETB SPEEDF           LCALL SPEEDCL           RET CASE4:    CJNE A,#04H,CASE5           SETB TONEF           LCALL TONECL           RET CASE5:    CJNE A,#05H,CASE6           CPL ROCF           JNB ROCF,KA1NEXT3           MOV DISNUM0,#24H           SJMP KA1NEXT4 KA1NEXT3: MOV DISNUM0,#25H KA1NEXT4: MOV DISNUM1,#27H           RET CASE6:    CJNE A,#06H,KA1RET           MOV DISNUM0,#23H           MOV DISNUM1,#06H KA1RET:   RET ;========= 乐曲表============ ;---------SONGS-------------- T_SONGS:       乐曲表表首 dw 01ffh,;song1:xiao la ba...      dw  0b05h,      dw  2504h,      dw  2604h,      dw  2506h,      dw  0002h,      dw  2504h,      dw  2604h,      dw  2506h,      dw  0002h,      dw  2504h,      dw  2604h,      dw  2504h,      dw  2304h,      dw  2204h,      dw  2104h,      dw  2206h, DW 16FFH;SONG16:Liang Zhi Lao Hu      DW  0715H      DW  0FF21H  ;REP21      DW  0FF01H  ;REP01      DW  2102H      DW  2202H      DW  2302H      DW  2102H      DW  0FF02H  ;REP02      DW  0FF03H  ;REP03      DW  2302H      DW  2402H      DW  2504H      DW  2302H      DW  2402H      DW  2504H      DW  0FF11H  ;REP11      DW  2501H      DW  2601H      DW  2501H      DW  2401H      DW  2302H      DW  2102H      DW  0FF12H  ;REP12      DW  0FF13H  ;REP13      DW  2202H      DW  1502H      DW  2104H      DW  2202H      DW  1502H      DW  2104H      DW  0FF22H  ;REP22      DW  0FF23H  ;REP23      DW  0000H  ;乐曲表表尾           END ;=========END================ 注:设计者手头有近40首曲子的音乐数据(花了大量时间对简谱进行手工转换!),而每块 AT89C51的4KROM种除指令外剩下空间只可放14首左右。     这里给出第一曲和第16曲《两只老虎》作一示例。 (文章推荐人:电池) 1、本站不保证以上观点正确, 就算是本站原创作品,本站也不保证内容正确。  2、如果您拥有本文版权,并且不想在本站转载,请书面通知本站立即删除并且向您公开道歉! |