?? dpjmusic.htm
字號:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft FrontPage 5.0">
<TITLE>單片機音樂程序的設計與實驗</TITLE>
<META NAME="Template" CONTENT="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot">
</HEAD>
<BODY LINK="#0000ff" VLINK="#800080">
<FONT FACE="宋體" LANG="ZH-CN" SIZE=2>
<B><P ALIGN="CENTER" style="line-height: 150%; margin-top: 0; margin-bottom: 0">單片機音樂程序的設計與實驗</P>
</B></FONT><FONT FACE="宋體" LANG="ZH-CN">
<P ALIGN="CENTER" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font size="2">周振安</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">利用單片機(或單板機)奏樂大概是無線電愛好者感興趣的問題之一。本文從單片機的基本發(fā)間實驗出發(fā),談談音樂程序的設計原理,并給出具體實例,以供參考。</font></P>
<OL>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0"><LI>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"><font size="2">單片機的基本發(fā)音實驗</LI></font></p>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"></P></OL>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單處機某個口線的“高”電平或低電平,則在該口線上就能產(chǎn)生一定頻率的矩形波,接上喇叭就能發(fā)出一定頻率的聲音,若再利用延時程序控制“高”“低”電平的持續(xù)時間,就能改變輸出頻率,從而改變音調(diào)。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font size="2">例如,要產(chǎn)生</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">200HZ</FONT><FONT FACE="宋體" LANG="ZH-CN">的音頻信號,按圖</FONT><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋體" LANG="ZH-CN">接入喇叭(若屬臨時實驗,也可將喇叭直接接在</FONT><FONT FACE="System" LANG="ZH-CN">P1</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">口線上),實驗程序為:</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">其中子程序</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">DEL</FONT><FONT FACE="宋體" LANG="ZH-CN">為延時子程序,當</FONT><FONT FACE="System" LANG="ZH-CN">R3</FONT><FONT FACE="宋體" LANG="ZH-CN">為</FONT><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋體" LANG="ZH-CN">時,延時時間約為</FONT><FONT FACE="System" LANG="ZH-CN">20us</FONT><FONT FACE="宋體" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">R3</FONT><FONT FACE="宋體" LANG="ZH-CN">中存放延時常數(shù),對</FONT><FONT FACE="System" LANG="ZH-CN">200HZ</FONT><FONT FACE="宋體" LANG="ZH-CN">音頻,其周期為</FONT><FONT FACE="System" LANG="ZH-CN">1/200</FONT><FONT FACE="宋體" LANG="ZH-CN">秒,即</FONT><FONT FACE="System" LANG="ZH-CN">5ms</FONT><FONT FACE="宋體" LANG="ZH-CN">。這樣,當</FONT><FONT FACE="System" LANG="ZH-CN">P1.4</FONT><FONT FACE="宋體" LANG="ZH-CN">的高電平或低電平的持續(xù)時間為</FONT><FONT FACE="System" LANG="ZH-CN">2.5ms</FONT><FONT FACE="宋體" LANG="ZH-CN">,即</FONT><FONT FACE="System" LANG="ZH-CN">R3</FONT><FONT FACE="宋體" LANG="ZH-CN">的時間常數(shù)取</FONT><FONT FACE="System" LANG="ZH-CN">2500/20=125(7DH)</FONT><FONT FACE="宋體" LANG="ZH-CN">時,就能發(fā)出</FONT><FONT FACE="System" LANG="ZH-CN">200HZ</FONT><FONT FACE="宋體" LANG="ZH-CN">的音調(diào)。將上述程序鍵入學習機,并不斷修改</FONT><FONT FACE="System" LANG="ZH-CN">R3</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">的常數(shù)可以感到音調(diào)的變化。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">樂曲中,每一音符對應著確定的頻率,表</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋體" LANG="ZH-CN">給出</FONT><FONT FACE="System" LANG="ZH-CN">C</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">調(diào)時各音符頻率及其相應的時間常數(shù)。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font size="2">讀者可以根據(jù)表</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋體" LANG="ZH-CN">所提供的常數(shù),將其</FONT><FONT FACE="System" LANG="ZH-CN">16</FONT><FONT FACE="宋體" LANG="ZH-CN">進制代碼送入</FONT><FONT FACE="System" LANG="ZH-CN">R3</FONT><FONT FACE="宋體" LANG="ZH-CN">,反復練習體會。根據(jù)表</FONT><FONT FACE="System" LANG="ZH-CN">1</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">可以奏出音符。僅這還不夠,要準確奏出一首曲子,必須準確地控制樂曲節(jié)奏,即一音符的持續(xù)時間。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">音符的節(jié)拍我們可以用定時器</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">T0</FONT><FONT FACE="宋體" LANG="ZH-CN">來控制,送入不同的初值,就可以產(chǎn)生不同的定時時間。便如某歌曲的節(jié)奏為每分鐘</FONT><FONT FACE="System" LANG="ZH-CN">94</FONT><FONT FACE="宋體" LANG="ZH-CN">拍,即一拍為</FONT><FONT FACE="System" LANG="ZH-CN">0.64</FONT><FONT FACE="宋體" LANG="ZH-CN">秒。其它節(jié)拍與時間的對應關(guān)系見表</FONT><FONT FACE="System" LANG="ZH-CN">2</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">但時,由于</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">T0</FONT><FONT FACE="宋體" LANG="ZH-CN">的最大定時時間只能為</FONT><FONT FACE="System" LANG="ZH-CN">131</FONT><FONT FACE="宋體" LANG="ZH-CN">毫秒,因此不可能直接用改變</FONT><FONT FACE="System" LANG="ZH-CN">T0</FONT><FONT FACE="宋體" LANG="ZH-CN">的時間初值來實現(xiàn)不同節(jié)拍。我們可以用</FONT><FONT FACE="System" LANG="ZH-CN">T0</FONT><FONT FACE="宋體" LANG="ZH-CN">來產(chǎn)生</FONT><FONT FACE="System" LANG="ZH-CN">10</FONT><FONT FACE="宋體" LANG="ZH-CN">毫秒的時間基準,然后設置一個中斷計數(shù)器,通過判別中斷計數(shù)器的值來控制節(jié)拍時間的長短。表</FONT><FONT FACE="System" LANG="ZH-CN">2</FONT><FONT FACE="宋體" LANG="ZH-CN">中也給出了各種節(jié)拍所對應的時間常數(shù)。例如對</FONT><FONT FACE="System" LANG="ZH-CN">1/4</FONT><FONT FACE="宋體" LANG="ZH-CN">拍音符,定時時間為</FONT><FONT FACE="System" LANG="ZH-CN">0.16</FONT><FONT FACE="宋體" LANG="ZH-CN">秒,相應的時間常數(shù)為</FONT><FONT FACE="System" LANG="ZH-CN">16</FONT><FONT FACE="宋體" LANG="ZH-CN">(即</FONT><FONT FACE="System" LANG="ZH-CN">10H</FONT><FONT FACE="宋體" LANG="ZH-CN">);對</FONT><FONT FACE="System" LANG="ZH-CN">3</FONT><FONT FACE="宋體" LANG="ZH-CN">拍音符,定時時間為</FONT><FONT FACE="System" LANG="ZH-CN">1.92</FONT><FONT FACE="宋體" LANG="ZH-CN">秒,相應時間長數(shù)為</FONT><FONT FACE="System" LANG="ZH-CN">192</FONT><FONT FACE="宋體" LANG="ZH-CN">(即</FONT><FONT FACE="System" LANG="ZH-CN">C0H</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">)。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">我們將每一音符的時間常數(shù)和其相應的節(jié)拍常數(shù)作為一組,按順序?qū)非械乃谐?shù)排列成一個表,然后由查表程序依次取出,產(chǎn)生音符并控制節(jié)奏,就可以實現(xiàn)演奏效果。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">此外,結(jié)束符和體止符可以分別用代碼</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">00H</FONT><FONT FACE="宋體" LANG="ZH-CN">和</FONT><FONT FACE="System" LANG="ZH-CN">FFH</FONT><FONT FACE="宋體" LANG="ZH-CN">來表示,若查表結(jié)果為</FONT><FONT FACE="System" LANG="ZH-CN">00H</FONT><FONT FACE="宋體" LANG="ZH-CN">,則表示曲子終了;若查表結(jié)果為</FONT><FONT FACE="System" LANG="ZH-CN">FFH</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">,則產(chǎn)生相應的停頓效果。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font size="2">為了產(chǎn)生手彈的節(jié)奏感,在某些音符(例如兩個相同音符)音插入一個時間單位的頻率略有不同的音符。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font size="2">程序框圖如圖</font></FONT><FONT FACE="System" LANG="ZH-CN" size="2">2</FONT><FONT FACE="宋體" LANG="ZH-CN"><font size="2">所示。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">	
<font size="2">下面給出程序序請單,可直接在</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">TD-III</FONT><FONT FACE="宋體" LANG="ZH-CN">型學習機上演奏,對其它不同型號的學習機,只需相應地改變一下地址即可。本程序演奏的是民歌“八月桂花遍地開”,</FONT><FONT FACE="System" LANG="ZH-CN">C</FONT><FONT FACE="宋體" LANG="ZH-CN">調(diào),節(jié)奏為</FONT><FONT FACE="System" LANG="ZH-CN">94</FONT><FONT FACE="宋體" LANG="ZH-CN">拍</FONT><FONT FACE="System" LANG="ZH-CN">/</FONT><FONT FACE="宋體" LANG="ZH-CN">分。讀者也可以自行找出一首歌,按表</FONT><FONT FACE="System" LANG="ZH-CN">1</FONT><FONT FACE="宋體" LANG="ZH-CN">和表</FONT><FONT FACE="System" LANG="ZH-CN">2</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">給定的常數(shù),將樂曲翻譯成碼表輸入機器,而程序不變。本實驗方法簡便,即使不懂音樂的人,將一首陌生的曲子翻譯成代碼也是易事,和著機器的演奏學唱一首歌曲,其趣味無窮。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font size="2">程序清單(略,請參看源程序的說明)。</font></P>
</FONT><FONT FACE="System" LANG="ZH-CN" size="2">
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0"><IMG SRC="Image1.gif" WIDTH=532 HEIGHT=607></P>
</FONT><FONT FACE="宋體" LANG="ZH-CN">
<P ALIGN="RIGHT" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font size="2">《無線電》</font></FONT><font size="2"><FONT FACE="System" LANG="ZH-CN">1992</FONT><FONT FACE="宋體" LANG="ZH-CN">年第</FONT><FONT FACE="System" LANG="ZH-CN">3</FONT></font><FONT FACE="宋體" LANG="ZH-CN"><font size="2">期。</font></P></FONT></BODY>
</HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -