俞海華 尹浙民 沈小玲 謝少偉
本文介紹一種用89C2051單片機設計的3位LED音樂隨機數據發生器,它在音樂播放的同時產生隨機數據,其關鍵技術為在單片機音樂發生同時實現LED動態數據顯示,可用于小型晚會抽獎及點出節目助興。以下就其硬件原理、軟件編寫作一介紹,有興趣者不妨一試。
硬件設計
圖1為3位LED隨機數據發生器硬件電路。圖中C3、R1為上電復位電路,R2、K構成按鍵電路,并由P3.0檢測按鍵狀態。由于89C2051的P1口能吸收20mA灌入電流并可直接驅動LED顯示器,因此,圖中由P1.0~P1.6提供三位LED七段段線,分別對應a~g,并通過7個200Ω電阻上拉接+5V電源,當P1.0~P1.6口線輸出高電平時,由+5V電源提供LED驅動電流,當P1.0~P1.6口線輸入低電平時,+5V電源通過200Ω電阻,向P1.0~P1.6灌電流,并使LED段線處于低電平狀態。同樣,當89C2051的P3口作為一般口線時,P3口同樣能吸收20mA灌電流,因此直接采用P3.5、P3.4、P3.3控制LED1、LED2、LED3的位線,實現了用89C2051口線直接驅動LED動態顯示的可能。P3.7是音樂信號輸出口線,同樣采用灌電流的方式通過9013電流放大驅動8Ω喇叭以實現音樂播放。

軟件設計
本隨機數據發生器的工作過程如下:開機后,處于待機狀態,當K按下并釋放后,音樂響起并循環播放,同時,3位LED快速循環顯示0~9數字,隨機數據寄存器從1到最高值(最大可到999)加1循環。一旦K再次按下并釋放后,音樂停播,同時隨機數據寄存器循環加1并顯示,逐漸減慢并停止在某一值,但由于K再次按下是隨機的,因此這一值也為隨機值。當K第三次按下時將再次處于待機狀態,否則一直顯示隨機值。隨機數據發生器的程序即是按上述過程編寫的,其程序流程如圖2所示,主要由音樂發生、三位LED動態顯示及隨機數據處理三個部分組成,圖中R2為中斷次數寄存器,R4為樂曲長度寄存器,30H為隨機數據寄存器。

單片機音樂發聲原理是在一口線上產生音頻范圍內的方波信號,并經放大驅動喇叭便可發出某一頻率的音調,控制音調播放時間使其按節拍變化,便可編程演奏一首樂曲。方波信號的頻率由定時器控制產生,采用16位定時方式。附表列出C調音階與頻率及初值的對應關系。將初值制表在程序中,將音符作為偏移量查該表即可得音符對應的初值。
節拍長度由定時器T1控制,定時時間可取總節拍長度的1/4或1/8,通過控制定時器的中斷次數,即可滿足1/8、1/4、1/2、1、2拍等不同節拍的定時要求。將樂譜轉換成代碼,如音符、音長,組成一個字節,如下處理便可播放音樂:
1.將音符代碼裝入8位字節高4位,節拍代碼裝入低4位,組成一個字節,將整段音樂換成一定長度的代碼并在程序中制表。
2.在程序執行時先查代碼表,取出音符代碼,查頻率初值表將初值置入T0定時器,取節拍代碼,置入T1口定時中斷次數寄存器,啟動T0、T1即可發音。
3.啟動后T1每中斷一次,中斷次數寄存器減1,在主程序中加以判斷,一旦為零,結束該音節播放,取下一個音節代碼再按上述步驟處理,每一音節播放完畢,樂曲即音節長度寄存器減1并判零,為零即樂曲結束,可作停播或重播處理。
在T1中斷次數寄存器判零等待期間,進行隨機數據寄存器循環加1、LED1~LED3 0~9循環加1顯示及判鍵處理,必須注意的是處理時間不得超過T1定時時間,否則將影響節拍長度控制。而在此間若K鍵按下,則音樂停播,進行隨機數據循環加1顯示并逐漸減慢固定顯示在某一值,其流程圖如圖3所示。

圖中30H為隨機數據寄存器,33H為減慢顯示速度控制寄存器,32H為暫儲寄存器。
程序通過增加顯示同一隨機數據次數來減慢顯示速度,當顯示次數與設定值相等時停止加1,并固定顯示隨機數據寄存器的內容,此值即為產生的隨機數據。
程序中設有處理LED1~LED3分別顯示0~9的顯示子程序、顯示隨機數據寄存器內容顯示子程序及T1、T2中斷服務等程序,不再詳述。

若隨機數據在0~255范圍,則只需一個8位隨機數據寄存器,如流程中的30H,若需顯示0~999,則需二個8位寄存器。另外在音樂停播時,必須將音樂輸出口線P3.7置高電平,否將造成9013及喇叭長期導通而發熱,這在程序調試時也得注意。
由于89C2051的工作電壓范圍較寬,可用3節5號電池提供4.5V 電壓供電。