close

標題:

8051電子琴

發問:

aa.jpg

 

此文章來自奇摩知識+如有不便請留言告知

;********************************************; 主程式; 利用鍵盤做模擬電子琴;********************************************ORG0000H;==========鍵盤掃描第一列==========LOOP: MOV P3,#11101111B; ╗JNB P3.0,KEY0; ║JNB P3.1,KEY1; ║偵測KEY0~KEY3是否按下JNB P3.2,KEY2; ║JNB P3.3,KEY3; ╝;==========鍵盤掃描第二列==========MOV... 顯示更多 ;******************************************** ; 主程式 ; 利用鍵盤做模擬電子琴 ;******************************************** ORG0000H ;==========鍵盤掃描第一列========== LOOP: MOV P3,#11101111B; ╗ JNB P3.0,KEY0; ║ JNB P3.1,KEY1; ║偵測KEY0~KEY3是否按下 JNB P3.2,KEY2; ║ JNB P3.3,KEY3; ╝ ;==========鍵盤掃描第二列========== MOV P3,#11011111B; ╗ JNB P3.0,KEY4; ║ JNB P3.1,KEY5; ║偵測KEY4~KEY7是否按下 JNB P3.2,KEY6; ║ JNB P3.3,KEY7; ╝ AJMPLOOP;重複不斷掃描 ;===鍵盤相對應的程式,音階的設定=== KEY0: MOV R6,#189; ╗DO AJMP OUTPUT; ╝ KEY1: MOV R6,#169; ╗RE AJMP OUTPUT; ╝ KEY2: MOV R6,#150; ╗ME AJMP OUTPUT; ╝ KEY3: MOV R6,#142; ╗FA AJMP OUTPUT; ╝ KEY4: MOV R6,#126; ╗SO AJMP OUTPUT; ╝ KEY5: MOV R6,#112; ╗LA AJMP OUTPUT; ╝ KEY6: MOV R6,#100; ╗SI AJMP OUTPUT; ╝ KEY7: MOV R6,#94; ╗Hi_DO AJMP OUTPUT; ╝ ;=========令頻率輸出一週========= OUTPUT:SETBP1.6; ╗設定正半週延遲時間 ACALLDELAY; ╝ CLRP1.6; ╗設定負半週延遲時間 ACALLDELAY; ╝ AJMPLOOP;跳回鍵盤掃描 ;********************************************** ;副程式 ;依R6的值做延遲 ;********************************************** DELAY:MOVA,R6 D1:MOVR7,#5 DJNZR7,$ DJNZR6,D1 MOVR6,A RET END 我看不懂音階是如何算出來的誰能交我算拜託??? 例如: 程式的音階部份為啥 189 是DO

最佳解答:

程式的音階部份, 主要在 OUTPUT 副程式, 他應是一個頻率輸出的副程式. DO RE ME 就是設定頻率 , 你須知道那 OUTPUT 副程式, 的頻率是如何計算的 ! 頻率音階供你參考 : DO = 523.25Hz RE = 587.33Hz ME = 659.25Hz FA = 698.46Hz SO = 783.98Hz LA = 880.00Hz Si = 987.77Hz Hi_DO = 1046.5Hz 程式的音階部份為 189 就是設定 DO 頻率輸出為 523.25HZ 2010-04-23 20:19:48 補充: 我看一下 OUTPUT 是輸出 P1.6 正反向一次, 時間是用 DELAY 控制 ! 這方法較不準確, 如果用 TIMER 而直接輸出會比較準確 ! DELAY 的時間由 CPU 的震盪頻率及 DELAY 指令的次數, 推算出來 !

其他解答:BFC66BE0445C3814

arrow
arrow
    創作者介紹
    創作者 pxrnjl7 的頭像
    pxrnjl7

    百科全書

    pxrnjl7 發表在 痞客邦 留言(0) 人氣()