新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機設計的電子琴

        單片機設計的電子琴

        作者: 時間:2016-11-10 來源:網絡 收藏
        功能說明:

        電子琴小巧、聲音悅耳、便于攜帶、成本低、美觀大方,能演奏絕大部分音樂。本作品采用的16鍵設計方法,也可以擴展成21鍵的。另外還能在這個基礎上附加一些功能。

        本文引用地址:http://www.104case.com/article/201611/317331.htm

        1.由4×4組成的16個按鈕矩陣,設計成16個音。

        2.硬件原理圖:

        程序附錄:

        實物圖:

        原理圖:

        源代碼:

        ;************* 單片機--電子琴 *******************;
        ;*MCU: AT89C52 ;
        ;*MCU-crystal: 12M ;
        ;*Version: 01 ;
        ;*Last Updata: 2007-6-9 ;
        ;*Author: zhaojun ;
        ;*Description: ;
        ;P2口是電子琴按鍵輸入 ;
        ;P1.0為音頻輸出 ;
        ;***************WAVE-E6000/T*********************;
        ;******************************;
        ; 電子琴 ;
        ;******************************;
        ORG 0000H ;主程序起始地址
        JMP START ;跳至主程序
        ORG 000BH ;TIMER0中斷起始地址
        JMP TIM0 ;跳至TIMER0中斷起始地址
        START: MOV TMOD,#00000001B ;設TIMER0在MODE1
        MOV IE,#10000010B ;中斷使能
        SETB TR0 ;啟動TIMER0

        L1: CALL KEY ;調用KEY,判斷是否有鍵按下?
        CLR EA ;中斷屏蔽
        JB F0,L1 ;沒按則F0=1,有按則F0=0
        MOV A,22H ;有按則將取碼指針暫存地址載入A
        RL A ;乘2
        MOV DPTR,#TABLE ;
        MOVC A,@A+DPTR ;至TABLE取碼,取T的值
        MOV TH0,A ;取到的高位字節存入TH0
        MOV A,21H ;取到的高位字節存入(21H)
        MOV A,22H ;再載入取碼指針值
        RL A ;乘2
        INC A ;加1
        MOVC A,@A+DPTR ;至TABLE1取相對的低位字節計數值
        MOV TL0,A ;取到的低位字節存入TLO
        MOV 20H,A ;取到的低位字節存入(20H)
        L2: CALL KEY ;調用KEY判斷有按否?
        SETB EA ;中斷使能
        JB F0,L1 ;有按否?
        JMP L2 ;有則跳至L2

        KEY: SETB F0 ;設F0=1
        MOV R3,#0F7H ;掃描初值(P23=0)
        MOV R1,00H ;取碼指針初值
        L3: MOV A,R3 ;載入掃描指針
        MOV P2,A ;輸出至P2,開始掃描(P23~P20)一行為0
        MOV A,P2 ;讀入P2
        CLR C
        CPL C ;令C=1
        MOV R5,#04H ;檢測P27~P24
        L4: RLC A ;左移一位(P27~P24)
        JNC KEYIN ;檢測行C=0,表示被按
        INC R1 ;沒按則取碼值指針加1
        DJNZ R5,L4 ;4列檢測完畢了?
        MOV A,R3 ;載入掃描指針
        CLR C
        CPL C ;C=1
        RRC A ;掃描下一行,即下一行為0
        MOV R3,A ;存回R3掃描指針寄存器
        JC L3 ;C=0表示掃描完畢
        RET
        KEYIN: MOV 22H,R1 ;取碼指針存入22H地址
        CLR F0 ;令F0=0
        RET

        TIM0: PUSH ACC ;將A的值暫存于堆棧
        PUSH PSW ;將PSW的值暫存于堆棧
        MOV TL0,20H ;重設計數值
        MOV TH0,21H
        CPL P1.0 ;將P1.0位反相
        POP PSW ;至堆棧取回PSW的值
        POP ACC ;至堆棧取回A的值
        RETI ;返回主程序

        TABLE: DW 64021,64103,64260,64400
        DW 64524,64580,64684,64777
        DW 64820,64898,64968,65030
        DW 65058,65110,65157,65178
        END



        關鍵詞: 單片機電子

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 策勒县| 兴和县| 徐水县| 娄烦县| 大港区| 南雄市| 滦南县| 平乐县| 华宁县| 西丰县| 宁明县| 札达县| 河源市| 博爱县| 郁南县| 富宁县| 侯马市| 铁岭市| 醴陵市| 宜宾县| 确山县| 根河市| 乡城县| 阿拉善左旗| 上杭县| 株洲市| 长泰县| 新兴县| 三明市| 怀仁县| 高陵县| 临江市| 磴口县| 霍山县| 科技| 什邡市| 伊金霍洛旗| 玉龙| 驻马店市| 安顺市| 渝中区|