張智超 遼寧錦州渤海大學工學院
基于單片機的可控數字音樂盒的設計
張智超 遼寧錦州渤海大學工學院
本文利用51單片機來設計可控數字音樂盒,系統硬件這部分的設計是運用單片機控制方面的知識,軟件方面的設計是利用Keil軟件進行設計,再用C語言編寫程序。整個系統中主要的功能部分有提供頻率的內部定時器需要的頻率,通過蜂鳴器來調節播放音樂的音調,通過延遲電路來實現音符持續時間。將樂譜用定時器常數表示可以播放出想要的音樂。
單片機 音樂盒 C語言
科技在發展,時代在進步。生活在新時代的我們更能感受到這種變化。人類的智慧在這個信息化的時代不斷提高,人們對生活的品質要求也隨之提高。因此,如何在如今這高速發展的社會找到能給人帶來樂趣的技術就顯得很有意義,而音樂就可以給人們帶來美的享受,更能陶冶人們的情操,因而音樂盒就有存在的必要。
同時,電子技術和音樂播放技術在不斷發展,機械音樂盒的缺陷很明顯,最大的問題就是其體積相對太大,不方便攜帶,聲音單調等原因滿足不了人們的需要,盡管會有人將其作為收藏,但并沒有多大的市場價值。而數字音樂盒卻能隨著單片機技術和音樂播放技術的發展不斷更新,因而擁有更好的發展前景。因此,本文設計的音樂盒就是基于51單片機的數字音樂盒。
2.1 總體設計框圖
設計的總體方案為:以AT89C51為控制芯片,外部連接有以下幾個電路模塊:①復位電路:負責重置操作,從當前狀態回到初始狀態;②晶振電路:為整個單片機系統提供一個穩定的時鐘脈沖;③發音電路:負責音樂的播放以及音量的調節功能,電源電路為單片機系統提供一個系統所需的電壓;④按鍵電路:將音樂播放通過按鍵進行控制,系統總體結構圖如圖1所示。

圖1 總體結構圖
2.2 時鐘電路
系統所需要的頻率是在外部找好系統所需的頻率后,將輸入的信號進行頻率的分割,使得系統的負荷變小,如果輸入的是12MHz的頻率,那么單片機里面就會只利用1MHz的頻率資源進行運行,這樣的話,系統就可以只利用一分頻率資源達到十二分資源的效果。而在芯片外面的外接電容也是有要求的。一般情況下,外接的兩個電容的大小都在30pF。這樣統一的標準對生產廠家來說就方便很多,可以利用流水線生產一種規格的產品,同理,與外界連接的晶體的振蕩頻率也是有所標準的,也就是系統里面運行頻率的12倍左右,即1.2~12MHz。因為系統和外接器件的頻率相對來說是成正比的,外接的器件頻率越高的話,那么系統頻率也會隨著外接頻率的增大而增大,而單片機系統的頻率變大的話,他執行命令的能力會隨之增強,從而使芯片的效率也變得更高,時鐘電路引腳如圖2所示:

圖2 時鐘電路引腳圖
2.3 復位電路
當在C51單片機的RST連接高電平的時候。并且在這個上面連續保持了超過2個周期的話,那么,系統就會對這種現象做出反應,在單片機內部,所有的一般指令都會清空,并且整個系統都會回到他最初的狀態,重新開始新的操作。
RST電路的實現一般存在2種途徑:一種是系統自身攜帶的程序,自行執行復位命令,不用我們來對其操作;還有一種就是我們對系統進行干預,手動對其進行控制,將整個系統調到初始開機狀態,再開始操作,執行新一輪的命令。通常情況下,第二種方式用的比較多,也更人性化,對整個系統的操控也更高效。

圖3 音頻放大器
自動復位是系統利用其固定的頻率所產生的脈沖,脈沖將對系統外部的電容形成電壓降,從而產生充放電的現象,而充放電就會導致其定時地置0置1,從而實現自動復位的功能。而一般情況之下,充放電的標準就是充電和放電中某一段的時間接連持續了超過1ms,那么系統就會產生反應,從而進行自行進入復位的操作。
2.4 音頻放大器
音頻功放電路是一種用于音頻放大器的功率放大器,主要負責提供無失真、高功率、高效率的輸出功率。
音頻放大電路主要有前置放大電路、均衡電路、功放電路這三部分。
前放器可以對外部信號起到將信號放大的效果。
均衡電路由多種濾波器組成,可以控制音調,濾除干擾。
功率放大電路:本質是運算放大器,有較大的電流輸出能力,可以輸出較大功率。
音頻放大器如圖3所示。
在本次設計中,我所用的C51單片機采用的T0工作在1模式。這種方式產生的頻率是經過處理的,輸出頻率是內部頻率的12倍。
舉個例子:外接的晶振頻率為f,那么定時器的預置初始值是:

3.1 音樂音符的播放
我們平時聽到的每一首歌都是由若干個音符構成,每個音符又是由頻率、節拍構成。頻率不同,節拍不同,得到的音符就不同,通過各種各樣的音符就可以得到我們想要的音樂了。在系統中,單片機可以通過時鐘電路得到一個固定的時鐘頻率,也可以通過調節脈沖得到我們所需要的各種頻率,而就是T0產生我們所需要的頻率,所以,我們要把T0的高八位和低八位與音符的頻率和節拍相關聯起來,就可以將音符用T0表示出來了。在音樂中,把握好節拍的長短至關重要,節拍和時間長度的對應關系如表1所示:

表1 節拍時間表
要得到音頻脈沖,就必須要有這段音頻的頻率,從而求出周期,而周期的一半就是輸出的機器周期。每個這么長時間就將P1.0調轉過來,計算時間過后又將其轉換回來,如此循環往復。就能夠達到我們預期的目標。
我們可以運用單片機系統中的方式1,那么我們使用的中斷就是T0,然后通過T0的高8位和低8位分別表示音符的音調和節拍數,我們就可以其周期數值,舉例:f為100Hz,它的周期T=1/100=10ms,則半周期為10/2=5ms,所以計數器只要記5ms,每計數5000次就可以把I/O轉換過來,從而計算出一個音符的頻率,則初值65535-5000 = 60535 = 0Xec77。
3.2 程序的實現
在實現該功能的過程中,運用T0、T1來完成了軟件設計過程中對中斷設計的部分。其中一個被我作為辨別音符的標志,還有一個被我用來設置一個音符持續時間的長短的標志。開始調用樂曲播放函數,然后判斷pause鍵是否按下(pause是低電平觸發),接著調用一個延時函數,這段延時函數的作用是銷抖,防止多次觸發低電平(因為我們按下按鍵時,并不一定就是只觸發了一次,可能因為些微的抖動就觸發多次)。下面就開始執行條件程序指令了,如果按下開始按鍵那么執行下面語句:如果這時系統中播放樂曲的序號顯示為0,那么就表示系統是才開始通上電源所以就會從目錄中的首曲音樂開始播放。如果顯示序號不為0,就執行else,那就是執行暫停操作,停止播放;下面的while語句是防止長按pause鍵導致執行的程序直接跳到后面去了,產生誤操作,while就是在pause鍵抬起之后才會跳出while循環操作,從而執行下面的命令。
在主函數內,如果播放的樂曲序號不是0,即不是系統剛剛開啟狀態,并且按下了“前一首”按鈕,那么就會執行以下程序。delayms(5);語句的作用就是銷抖。
播放樂曲的序號減去1,這時,如果歌曲序號小于1,那么就將其序號置為目錄數值,使音樂能夠循環地播放;如果歌曲序號大于目錄數值,那么就將樂曲的序號重新置為1,從頭開始播放。而且每當按下這個按鈕后,num就置為0,表示從每首音樂的首個音符開始播放。delayms(500);語句的作用就是使樂曲切換之間的延時設為0.5秒。
[1]王麗主編;張燕,王恒副主編.單片機原理及應用.國防工業出版社,2014.08
[2]麻友良主編,游彩霞副主編.教你認識汽車電子控制器.機械工業出版社,2014.01
[3]周偉,劉易,周建斌等編著.單片微機原理及應用.機械工業出版社,2014.05
[4]蘭建軍,倫向敏,關碩編著.單片機原理、應用與Proteus仿真.機械工業出版社,2014.02