• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    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

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 陈巴尔虎旗| 孟津县| 浠水县| 青岛市| 于田县| 新竹县| 阿拉善右旗| 抚宁县| 周口市| 兰坪| 邯郸县| 海口市| 南宁市| 兴文县| 巴马| 布拖县| 独山县| 福鼎市| 曲松县| 黄冈市| 沙雅县| 长汀县| 金川县| 高青县| 奉节县| 河南省| 沙田区| 宜宾县| 竹溪县| 梧州市| 宿迁市| 天镇县| 布尔津县| 兴隆县| 萨迦县| 德化县| 肇庆市| 宜兴市| 巨野县| 弥渡县| 高雄市|