基于Proteus的單片機演奏系統的設計
2.3 電路實(shí)現
因為一首曲子不止一個(gè)音符,我們不可能對每一個(gè)音符的音階都去"手工"的提供時(shí)間常數,為了實(shí)現的簡(jiǎn)化,我們編制一個(gè)將每一音符的時(shí)間常數和其相應的節拍常數作為一組,按順序將樂(lè )曲中的所有常數排列成的表格,在程序里用查表指令依次查出每一個(gè)音符的頻率和對應節拍時(shí)間,產(chǎn)生音符并控制節奏,就可以實(shí)現演奏效果。
此外,結束符和體止符可以分別用代碼00H 和FFH 來(lái)表示,若查表結果為00H,則表示曲子終了;若查表結果為FFH,則產(chǎn)生相應的停頓效果。
為了產(chǎn)生手彈的節奏感,在某些音符(例兩個(gè)相同音符)音插入一個(gè)時(shí)間單位的頻率略有不同的音符。
程序框圖如下圖4. 本程序演奏的是民歌"八月桂花遍地開(kāi)",C 調,節奏為94 拍/min。
用Keil 對程序進(jìn)行編譯,見(jiàn)圖5,具體方法可文獻[5],編譯無(wú)誤后生成。hex 文件,然后雙擊Proteus環(huán)境下的原理圖中的AT89C51,找到這個(gè)。 hex 文件,然后點(diǎn)按鈕Play,這時(shí)單片機控制的蜂鳴器就可以開(kāi)始播放音樂(lè )了。
圖4 程序流程圖
圖5 在Keil 環(huán)境下對程序進(jìn)行編譯
3 結論
以上介紹的方法已通過(guò)測試,運行良好。 對初學(xué)單片機者有一定的啟示作用。 讀者也可以自行找出一首歌,將樂(lè )曲翻譯成碼表輸入單片機,而程序不變。 本實(shí)驗方法簡(jiǎn)便,即使不懂音樂(lè )的人,也可方便地將一首陌生的曲子翻譯成代碼。
評論