新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機電子琴電路圖及源程序代碼

        單片機電子琴電路圖及源程序代碼

        作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏

        實驗仿真圖

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

        源程序代碼:(彈奏部分代碼暫時去掉,見諒,需要的留言,轉(zhuǎn)載請注明出處,謝謝!)

        DUAN EQU 0c000H
        WEI EQU 0a000H
        LED0 EQU 8000H
        ORG 0000H ;復位地址
        LJMP MAIN ;跳轉(zhuǎn)到主程序
        ORG 0003H ;外部中斷0入口地址
        LJMP INT00 ;跳轉(zhuǎn)到外部中斷0服務程序
        ORG 000BH ;T0中斷入口
        LJMP TIM0 ;跳轉(zhuǎn)到T0中斷服務程序


        ORG 0030H ;主程序入口地址
        MAIN:

        MOV DPTR,#LED0
        MOV A,#00H
        MOVX @DPTR,A


        MOV TMOD,#01H ;寫入T0控制字, 16位定時方式
        SETB IT0 ;外部中斷為下降沿觸發(fā)
        MOV IE,#83H ;開中斷
        MOV 30H,#00H ;取簡譜碼指針
        MOV R6,#0FFH ;選擇音樂節(jié)奏燈循環(huán)次數(shù)
        CLR 23H ;功能選擇標志 00:鍵盤 01:音樂

        NEXT: CLR TR0
        JNB 23H,KEYPLAY ;若標志位是0則轉(zhuǎn)到鍵盤程序
        SETB P2.2
        MOV A,30H ;簡譜碼指針裝入A
        JNB P0.1,START1 ;否則查詢播放哪一首歌曲
        JNB P0.2,START2
        JNB P0.3,START3
        LJMP NEXT

        ;確定不同歌曲的基地址
        START1:

        MOV DPTR,#TABLE ;從TABLE處取簡譜碼
        MOV 60H,DPH
        MOV 61H,DPL
        MOV A,#00H
        LJMP NEXT1
        START2:

        MOV DPTR,#TABLE2 ;從TABLE2處取簡譜碼
        MOV 60H,DPH
        MOV 61H,DPL
        MOV A,#01H
        LJMP NEXT1
        START3:

        MOV DPTR,#TABLE3 ;從TABLE處取簡譜碼
        MOV 60H,DPH
        MOV 61H,DPL
        MOV A,#02H
        LJMP NEXT1

        ;鍵盤彈奏程序入口
        KEYPLAY: ;鍵盤程序入口
        SETB P2.1
        CLR P2.2
        JNB P0.4,LOWTONE ;查詢是高音還是其他的音
        JNB P0.5,MIDDLETONE
        JNB P0.6,HIGHTONE
        LJMP NEXT ;沒有選擇高中低音則重新查詢


        ;確定高中低音基地址
        LOWTONE:
        MOV DPTR,#LOWTABLE ;賦基地址值
        MOV 50H,DPH
        MOV 51H,DPL
        LJMP KEY ;跳轉(zhuǎn)到按鍵查詢程序

        MIDDLETONE:
        MOV DPTR,#MIDDLETABLE
        MOV 50H,DPH
        MOV 51H,DPL
        LJMP KEY

        HIGHTONE:
        MOV DPTR,#HIGHTABLE
        MOV 50H,DPH
        MOV 51H,DPL
        LJMP KEY


        ;歌曲播放程序
        NEXT1: MOV DPTR,#SEG7
        MOVC A,@A+DPTR
        MOV DPTR,#DUAN
        MOVX @DPTR,A
        MOV DPTR,#WEI
        MOV A,#000BH
        MOVX @DPTR,A
        MOV DPH,60H
        MOV DPL,61H
        MOV A,30H
        MOVC A,@A+DPTR
        MOV R2,A ;取得的簡譜碼暫存于R2
        JZ END0 ;是否取到結(jié)束碼00H
        ANL A,#0FH ;不是,則取節(jié)拍碼
        MOV R5,A ;節(jié)拍碼存于R5
        MOV A,R2 ;將簡譜碼裝入A
        SWAP A ;高、低4位交換
        ANL A,#0FH ;取音符碼
        JNZ SING ;取得的音符碼是否為0?
        CLR TR0 ;是則不發(fā)音
        lJMP D1 ;跳轉(zhuǎn)到D1

        SING: DEC A ;取得的音符碼減1(不含0)
        MOV 22H,A ;存入22H單元
        RL A ;乘2
        MOV DPTR,#TABLE1 ;到TABLE1中取相對的高位字節(jié)值
        MOVC A,@A+DPTR
        MOV TH0,A ;取得的高位字節(jié)裝入TH0和21H單元
        MOV 21H,A
        MOV A,22H ;再裝入取得的音符碼
        Rl A ;乘2
        INC A ;加1
        MOVC A,@A+DPTR ;到TABLE1中取相對的低位字節(jié)值
        MOV TL0,A ;取得的高位字節(jié)裝入TL0和20H單元
        MOV 20H,A
        SETB TR0 ;啟動T0
        D1: LCALL DELAY ;基本單位時間1/4拍,延時187毫秒
        INC 30H ;取簡譜碼指針加1
        LJMP NEXT ;取下一個碼
        END0: CLR TR0 ;停止T0
        CLR 30H ;清零簡樸指針
        LJMP NEXT ;重復循環(huán)


        上一頁 1 2 下一頁

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 揭东县| 长泰县| 南昌县| 博湖县| 保亭| 开平市| 北票市| 田阳县| 临夏市| 林州市| 英山县| 星座| 塔城市| 黔东| 三原县| 秦安县| 长宁县| 台江县| 安化县| 徐闻县| 和龙市| 崇礼县| 治多县| 洛阳市| 巨鹿县| 崇阳县| 华安县| 清原| 淄博市| 凌海市| 类乌齐县| 新邵县| 临夏县| 淮滨县| 托里县| 景宁| 宜兰市| 寿阳县| 颍上县| 靖安县| 菏泽市|