利用單片機(或單板機)奏樂大概是無線電愛好者感興趣的問題之一。本文從單片機的基本發(fā)間實驗出發(fā),談談音樂程序的設計原理,并給出具體實例,以供參考。 單片機的基本發(fā)音實驗
我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單處機某個口線的“高”電平或低電平,則在該口線上就能產生一定頻率的矩形波,接上喇叭就能發(fā)出一定頻率的聲音,若再利用延時程序控制“高”“低”電平的持續(xù)時間,就能改變輸出頻率,從而改變音調。 例如,要產生200HZ的音頻信號,按圖1接入喇叭(若屬臨時實驗,也可將喇叭直接接在P1口線上),實驗程序為: 其中子程序DEL為延時子程序,當R3為1時,延時時間約為20us,R3中存放延時常數(shù),對200HZ音頻,其周期為1/200秒,即5ms。這樣,當P1.4的高電平或低電平的持續(xù)時間為2.5ms,即R3的時間常數(shù)取2500/20=125(7DH)時,就能發(fā)出200HZ的音調。將上述程序鍵入學習機,并不斷修改R3的常數(shù)可以感到音調的變化。 樂曲中,每一音符對應著確定的頻率,表1給出C調時各音符頻率及其相應的時間常數(shù)。 讀者可以根據表1所提供的常數(shù),將其16進制代碼送入R3,反復練習體會。根據表1可以奏出音符。僅這還不夠,要準確奏出一首曲子,必須準確地控制樂曲節(jié)奏,即一音符的持續(xù)時間。 音符的節(jié)拍我們可以用定時器T0來控制,送入不同的初值,就可以產生不同的定時時間。便如某歌曲的節(jié)奏為每分鐘94拍,即一拍為0.64秒。其它節(jié)拍與時間的對應關系見表2。 但時,由于T0的最大定時時間只能為131毫秒,因此不可能直接用改變T0的時間初值來實現(xiàn)不同節(jié)拍。我們可以用T0來產生10毫秒的時間基準,然后設置一個中斷計數(shù)器,通過判別中斷計數(shù)器的值來控制節(jié)拍時間的長短。表2中也給出了各種節(jié)拍所對應的時間常數(shù)。例如對1/4拍音符,定時時間為0.16秒,相應的時間常數(shù)為16(即10H);對3拍音符,定時時間為1.92秒,相應時間長數(shù)為192(即C0H)。 我們將每一音符的時間常數(shù)和其相應的節(jié)拍常數(shù)作為一組,按順序將樂曲中的所有常數(shù)排列成一個表,然后由查表程序依次取出,產生音符并控制節(jié)奏,就可以實現(xiàn)演奏效果。 12下一頁 GO |