樂曲聲音算法
一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號
4.1音樂頻率的實現:
1.要產生音頻脈沖,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時間,然后利用計時器計時此半周期時間,每當計時到后就將輸出脈沖的I/O反相,然后重復計時此半周期時間再對I/O反相,如此就可在I/O腳上得到此頻率的脈沖.
2.利用8051的內部計時器讓其工作在計數模式MODE1下,改變計數值TH0及TL0以產生不同的頻率.
3.例如以6MHZ晶振為例:要產生頻率為523HZ,其周期T=1/523=1912us,其半周期為1912/2=956us,因此只要令計數器計時956us/1us=956.所以在每計數956次時將I/O反相,就可得到中音DO(523HZ).
計數脈沖值與頻率的關系公式如下:
N=Fi+2+Fr N:計數值
Fi:內部計時一次2us,以6MHZ晶振為例,故其頻率為500000HZ
Fr:要產生的頻率
4.其計數值的求法如下:
T=65536-N=65536-Fi/2/Fr
例如:求低音DO(261HZ),中音DO(523HZ),高音DO(1046HZ) 的計數值?
設K=65536 F=500000=Fi=0.5MHZ
T=65536-N=65536-Fi/2/Fr=65536-500000/2/Fr=65536-250000/Fr
低音DO的 T=65536-250000/262=64582
中音DO的 T=65536-250000/523=65058
高音DO的 T=65536-250000/1047=65297
5. C調各音符頻率與計數值T的對照表:
音符 頻率HZ 6MHZ 十六進制值 音符 頻率HZ 6MHZ 十六進制值
低1DO 262 64582 FC46 #4FA# 740 65198 FEAE
#1DO# 277 64634 FC7A 中5SO 784 65217 FEC1
低2RE 294 64686 FCAE #5SO# 831 65235 FED3
#2RE# 311 64732 FCDC 中6LA 880 65252 FEE4
低3M 330 64779 FD0B #6LA# 932 65268 FEF4
低4FA 349 64820 FD34 中7SI 988 65283 FF03
#4FA# 370 64860 FD5C 高1DO 1046 65297 FF11
低5SO 392 64898 FD82 #DO# 1109 65311 FF1F
#5SO# 415 64934 FDA6 高2RE 1175 65323 FF2B
低6LA 440 64968 FDC8 #2RE# 1245 65335 FF37
#6LA# 466 65000 FDE8 高3M 1318 65346 FF42
低7SI 494 65030 FE06 高4FA 1397 65357 FF4D
中1DO 523 65058 FE22 #4FA# 1480 65367 FF57
#1DO# 554 65085 FE3D 高5SO 1568 65377 FF61
中2RE 578 65103 FE4F #5S0# 1661 65385 FF69
#2RE# 622 65134 FE6E 高6LA 1760 65394 FF72
中3M 659 65157 FE85 #6LA# 1865 65402 FF7A
中4FA 698 65178 FE9A 高7SI 1976 65409 FF81
"#"表示半音,用于上升或下降半個音
4.2音樂節拍的實現:
每個音符使用1個字節,字節的高4位代表音符的高低,低4位代表音符的節拍,如果1拍節為0.4秒則1/4拍是0.1秒,只要設定延遲時間就可求得節拍的時間,再來我們假設1/4拍為1 DELY單位,則1拍應為4個DELY,以此類推,只要求得1/4拍的DELY單位時間,其余的節拍就是它的倍數.
1/4拍的延遲時間=0.187秒
DELAY:MOV R7,#02H
D2:MOV R4,#31H
D3:MOV R3,#0F1H
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY ;R5存節拍數
RET
各調值1/4節拍的時間設定 各調值1/8節拍的時間設定
曲調值 DELAY 6MHZ(H) 曲調值 DELAY 6MHZ(H)
調4/4 125亳秒 3E 調4/4 62亳秒 1F
3/4 187 5D 3/4 94 2F
2/4 250 7D 2/4 125 3E
建立音樂的步驟: 1.先找出樂曲的最低音,最高音范圍,然后確定音符表首地址.
2.如把音符表建在 0151H,適用簡譜范圍為 低音1 到 高音1. 3.簡譜碼(音符)為高4位,節拍碼(節拍數)為低4位,音符節拍碼放在程序的0300H處.本程序有關約定:根據不同曲調,可以建立不同簡譜音符表0151H- 為一簡譜音符表首地址適用簡譜范圍 低音1 到 高音10159H- 為一簡譜音符表首地址適用簡譜范圍 低音5 到 高音5 0300H- 為第一首歌曲首地址,字節高位為音符代碼,低位為節拍代碼組成簡譜曲碼. 003EH 為歌曲DPH高位首地址,0041H為歌曲DPL低位首地址002FH 為節拍速度代碼; 0073H 為音符表低位地址 ,高位地址為01H,不可改動0047H 內容為該首放音二次,01為放音1次. 008DH 改為00H,則反復放該首曲(調試時用).樂曲存放約定:曲碼中00H表示上首曲結束標記;接著為下首曲節拍速度值,再接著為該首曲音符表首地址,然后才是樂曲曲碼,全部樂曲結束標記為連續兩個單元是00H 00H各調值節拍時間代碼表(6MHZ晶振時)曲調值 節拍速度值4/4 3EH 3/4 5DH
因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可。現在以單片機12MHZ晶振為例,例出高中低音符與單片機計數T0相關的計數值如下表所示
0.png (27.92 KB, 下載次數: 7)
下載附件
2018-12-21 02:27 上傳
完整的Word格式文檔51黑下載地址:
基于單片機AT89C51的簡易電子琴系統畢業設計(論文).doc
(413.5 KB, 下載次數: 43)
2018-12-21 00:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|