<address id="tnvjh"></address>
    <form id="tnvjh"><listing id="tnvjh"><meter id="tnvjh"></meter></listing></form>

      <form id="tnvjh"></form>

      <address id="tnvjh"><th id="tnvjh"></th></address>

        專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        單片機音樂程序

        作者:佚名   來源:本站原創   點擊數:  更新時間:2007年06月25日   【字體:

        利用單片機(或單板機)奏樂大概是無線電愛好者感興趣的問題之一。本文從單片機的基本發間實驗出發,談談音樂程序的設計原理,并給出具體實例,以供參考。下面提供2個列子,大家根據 需要自行選擇

        單片機最小系統,兩位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,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曲《兩只老虎》作一示例。

         

        1.       單片機的基本發音實驗

        我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單處機某個口線的“高”電平或低電平,則在該口線上就能產生一定頻率的矩形波,接上喇叭就能發出一定頻率的聲音,若再利用延時程序控制“高”“低”電平的持續時間,就能改變輸出頻率,從而改變音調。

        例如,要產生200HZ的音頻信號,按圖1接入喇叭(若屬臨時實驗,也可將喇叭直接接在P1口線上),實驗程序為:

               其中子程序DEL為延時子程序,當R3為1時,延時時間約為20us,R3中存放延時常數,對200HZ音頻,其周期為1/200秒,即5ms。這樣,當P1.4的高電平或低電平的持續時間為2.5ms,即R3的時間常數取2500/20=125(7DH)時,就能發出200HZ的音調。將上述程序鍵入學習機,并不斷修改R3的常數可以感到音調的變化。

               樂曲中,每一音符對應著確定的頻率,表1給出C調時各音符頻率及其相應的時間常數。

        讀者可以根據表1所提供的常數,將其16進制代碼送入R3,反復練習體會。根據表1可以奏出音符。僅這還不夠,要準確奏出一首曲子,必須準確地控制樂曲節奏,即一音符的持續時間。

        音符的節拍我們可以用定時器T0來控制,送入不同的初值,就可以產生不同的定時時間。便如某歌曲的節奏為每分鐘94拍,即一拍為0.64秒。其它節拍與時間的對應關系見表2。

        但時,由于T0的最大定時時間只能為131毫秒,因此不可能直接用改變T0的時間初值來實現不同節拍。我們可以用T0來產生10毫秒的時間基準,然后設置一個中斷計數器,通過判別中斷計數器的值來控制節拍時間的長短。表2中也給出了各種節拍所對應的時間常數。例如對1/4拍音符,定時時間為0.16秒,相應的時間常數為16(即10H);對3拍音符,定時時間為1.92秒,相應時間長數為192(即C0H)。

        我們將每一音符的時間常數和其相應的節拍常數作為一組,按順序將樂曲中的所有常數排列成一個表,然后由查表程序依次取出,產生音符并控制節奏,就可以實現演奏效果。

        此外,結束符和體止符可以分別用代碼00H和FFH來表示,若查表結果為00H,則表示曲子終了;若查表結果為FFH,則產生相應的停頓效果。

        為了產生手彈的節奏感,在某些音符(例如兩個相同音符)音插入一個時間單位的頻率略有不同的音符。

        程序框圖如圖2所示。

        下面給出程序序請單,可直接在TD-III型學習機上演奏,對其它不同型號的學習機,只需相應地改變一下地址即可。本程序演奏的是民歌“八月桂花遍地開”,C調,節奏為94拍/分。讀者也可以自行找出一首歌,按表1和表2給定的常數,將樂曲翻譯成碼表輸入機器,而程序不變。本實驗方法簡便,即使不懂音樂的人,將一首陌生的曲子翻譯成代碼也是易事,和著機器的演奏學唱一首歌曲,其趣味無窮。

        程序清單(略,請參看源程序的說明)。

        《無線電》1992年第3期。

        下載兩個音樂文件的源代碼和HEX代碼。

        硬件連接說明:

        隨便找一個仿真機或者什么單片機實驗板,只要能工作的就行,將程序輸入,運行,然后找個音箱(你計算機旁邊應當就有一對吧)撥出插頭,插頭的前端接在P1。0上,后面部分找根線接單片機的地,就應當有聲了,然后怎么改進硬件連接就是你的事了。。。。

        關閉窗口
        和老头做爰很舒服,JK白丝裤袜开裆自慰喷水,在线天堂www在线...中文

          <address id="tnvjh"></address>
          <form id="tnvjh"><listing id="tnvjh"><meter id="tnvjh"></meter></listing></form>

            <form id="tnvjh"></form>

            <address id="tnvjh"><th id="tnvjh"></th></address>