新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 簡易電子琴的設計

        簡易電子琴的設計

        作者: 時間:2012-07-05 來源:網絡 收藏
        本次設計中單片機晶振為12MHZ,那么定時器的計數周期為1MHZ,假如選擇工作方式1,那T值便為T= 216--5﹡105/相應的頻率 ,那么根據不同的頻率計算出應該賦給定時器的計數值,列出不同音符與單片機計數T0相關的計數值如下表所示:

        音符
        頻率(HZ)
        簡譜碼(T值)
        中 1 DO
        523
        64580
        中 2 RE
        587
        64684
        中 3 M
        659
        64777
        中 4 FA
        698
        64820
        中 5 SO
        784
        64898
        中 6 LA
        880
        64968
        中 7 SI
        988
        65030

        采用查表程序進行查表時,可以為這個音符建立一個表格,有助于單片機通過查表的方式來獲得相應的數據:
        TABLE DW 64580,64684,64777,64820,64898,64968,65030
        源程序:
        方案一:產生按鍵音符
        ORG 0000H
        LJMP MAIN
        ORG 000BH
        LJMP BREAK
        MAIN: MOV TMOD,#01H ;設置定時器0的工作方式
        SETB EA
        SETB ET0 ; 設置定時器0中斷
        SETB TR0 ; 啟動定時器0
        WAIT1: LCALL KEY ; 調用KEY子程序,判斷有鍵按下否?第幾個鍵?
        CLR EA ;屏蔽中斷
        CJNE R3,#00H,WAIT1 ;如果R3=0,表示有鍵按下
        MOV A,22H ;將22H里存放的按鍵號送給A
        RL A ; 因為查表里都是字,所以得乘2查得數據
        MOV DPTR,#TABLE ;指向表頭
        MOVC A,@A+DPTR ; 查表
        MOV TH0,A ;將數據高位送TH0
        MOV 21H,A ; 將高位備份
        MOV A,22H ;將22H里存放的按鍵號送給A
        RL A ;因為查表里都是字,所以得乘2查得數據
        INC A ;取低位數據
        MOVC A,@A+DPTR
        MOV TL0,A
        MOV 20H,A
        WAIT2: LCALL KEY
        SETB EA
        CJNE R3,#00H,WAIT1
        JMP WAIT2
        KEY: MOV R3,#00H ; KEY子程序,判斷有鍵按下否?第幾個鍵?
        MOV R1,#0FFH
        MOV R0,#00H
        MOV A,R1
        MOV P2,A
        MOV A,P2
        CLR C
        CPL C ;利用標志位CY來判斷是哪個鍵按下
        MOV R2,#08H
        WAIT3: RLC A ;移位判斷
        JNC STORE
        INC R0
        DJNZ R2,WAIT3
        STORE: MOV 22H,R0 ; 將按鍵號存22H,R3=0有鍵按下
        MOV R3,#00H
        RET
        BREAK: PUSH ACC ; 中斷產生方波,從P1.0口輸出
        PUSH PSW
        MOV TL0,20H
        MOV TH0,21H
        CPL P1.0
        POP PSW
        POP ACC
        RETI
        TABLE: DW 65030,64968,64898,64820,64777,64684,64580 ; 7,6,5,4,3,2,1
        END
        方案二:產生按鍵音符
        ORG 0000H
        SJMP START
        ORG 000BH
        AJMP INT_0
        ORG 0030H
        START: MOV P1,#00H
        SETB EA
        SETB ET0 ;計數器0
        MOV TMOD,#02H
        MOV TH1,#09CH
        MOV TL1,#09CH ;定時器初植
        CLR TR0 ;定時器不允許
        SCAN: ;鍵盤掃描
        MOV A,P2 ;判斷鍵盤按下,跳到SCAN_1,若未按,繼續掃描
        CJNE A,#0FFH,SCAN_1
        NOP
        SJMP SCAN
        SCAN_1:ACALL DELAY ;是不是真的要按下?如果是,則跳轉SU_KEY查詢是哪個按下?
        MOV A,P2
        CJNE A,#0FFH,SU_KEY
        NOP
        SJMP SCAN
        SU_KEY:JNB P2.1,MU_1 ;判斷是哪個鍵按下?
        JNB P2.2,MU_2
        JNB P2.3,MU_3
        JNB P2.4,MU_4
        JNB P2.5,MU_5
        JNB P2.6,MU_6
        JNB P2.7,MU_7
        SJMP SCAN
        ;R1信號周期
        MU_1: MOV R1,#19 ;如果第一個按鍵按下,則R1=19,同時程序轉NEXT
        SJMP NEXT
        MU_2: MOV R1,#17
        SJMP NEXT
        MU_3: MOV R1,#15
        SJMP NEXT
        MU_4: MOV R1,#14
        SJMP NEXT
        MU_5: MOV R1,#13
        SJMP NEXT
        MU_6: MOV R1,#11
        SJMP NEXT
        MU_7: MOV R1,#10
        SJMP NEXT
        NEXT: MOV A,R1
        MOV R0,A
        SETB TR0 ;啟動定時器0
        NEXT_1:MOV A,P2 ; 沒鍵按下繼續執行,有鍵按下,返回讀引腳
        CJNE A,#0FFH,NEXT_1
        ACALL DELAY
        MOV A,P2 ;真的沒鍵按下?
        CJNE A,#0FFH,NEXT_1
        CLR TR0 ;不響
        AJMP SCAN ;掃描鍵盤去

        關鍵詞: 電子琴 AT89C51 LM324

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 若羌县| 乌兰浩特市| 防城港市| 曲阜市| 黄骅市| 改则县| 抚松县| 黑龙江省| 陆川县| 许昌县| 广安市| 贵南县| 永登县| 江川县| 凤凰县| 沅江市| 杨浦区| 永济市| 托里县| 仙桃市| 襄汾县| 绥江县| 枣庄市| 珲春市| 花莲市| 临邑县| 南投县| 滁州市| 高平市| 永安市| 通江县| 沿河| 利辛县| 兴隆县| 铜陵市| 璧山县| 乐都县| 托里县| 高陵县| 宣威市| 兴义市|