1 選題的背景
本次課設是應用單片機原理和控制理論設計音樂演奏控制器的硬件電路,并利用C語言進行程序設計。通過控制單片機內部的定時器來產生不同頻率的方波,驅動喇叭發出不同的音調的音樂,在利用延遲來控制發音時間的長短。把樂譜轉化成相應的定時常數就可以從發音設備中演奏出悅耳的音樂。
2 設計說明
2.1設計要求- 利用I/O口產生一定頻率的方波,驅動蜂鳴器,發出不同的音調,從而演奏樂曲
- 設計按鈕實現歌曲順序播放或單曲循環;
- 存儲三首以上歌曲
2.2 附加功能(1)用數碼管顯示當前播放曲目;
(2) LED花樣彩燈隨播放音符變換;
(3)通過按鍵實現下一首歌的切換;
3 硬件設計
3.1 系統組成框圖
圖3-1系統組成框圖
本設計采用STC89C516RD+作為主控芯片,蜂鳴器作為輸出設備產生音樂,通過MOD鍵能實現播放模式的控制,數碼管(LED)能夠實時的顯示當前的歌曲號。其中P3.3外接按鍵,P0口用作數碼管輸出數據端口,P2口作LED輸出數據端口P1.1蜂鳴器端口。
3.2單元電路設計
3.2.1晶振電路放大器與作為反饋元件的片外石英晶體或者陶瓷諧振器一中有一個用于構成內部振蕩器高增益反相放大器,引腳XTAL1和XTAL2分別是該放大器的輸入端和起構成自然振蕩器。外接石英晶體及電容C1、C2接在放大器的反饋回路中構成并聯振蕩電路。對外接電容C1,C2雖然沒有什么嚴格的要求,但電容容量大小會輕微影響振蕩頻率的高低、振蕩器工作穩定性、起振的難易程序及溫度穩定性。振蕩器電路圖如下:
圖3-2-1晶振電路
3.2.2復位電路復位電路的基本功能是:系統上電時提供復位信號,直至系統電源穩定后,撤銷復位信號。為可靠起見,電源穩定后還要經一定的延時才撤銷復位信號,以防電源開關或電源插頭分-合過程中引起的抖動而影響復位。
圖 3-2-2 復位電路
3.2.3按鍵本設計,歌曲的切換采用復位開關,播放模式,復位電路采用二位開關。
3.2.4 數碼管電路利用P0口做數碼管輸出口,由于P0有的結構,做輸出時需上拉電阻。
圖3-2-4數碼管電路
3.2.5蜂鳴器電路蜂鳴器根據結構不同分為壓電式蜂鳴器和電磁式蜂鳴器;而兩種蜂鳴器又分為有源蜂鳴器和無源蜂鳴器,這里的源特指振蕩源;有源蜂鳴器直接加電就可以響起,無源蜂鳴器需要我們給提供振蕩源。理想的振蕩源為一定頻率的方波。由于系統采用了無源蜂鳴器,所以需要我們通過晶振產生一定頻率的方波信號,本次采用頻率為12MHZ的晶振來產生標準方波。
由于蜂鳴器的工作電流一般比較大,以致于單片機的I/O 口是無法直接驅動的,所以要利用放大電路來驅動,一般使用三極管來放大電流就可以了,如圖3-2-5所示。
圖3-2-5蜂鳴器電路
3.2.6 彩燈電路彩燈部分由P2口輸出,采用共陽接法,當單片P2口相應位輸出0對應LED點亮。

圖3-2-6彩燈電路
3.2.7整體電路
圖3-2-7整體電路
4 程序設計
4.1音調、節拍以及編碼的確定方法一般說來,單片機演奏音樂基本都是單音頻率,它不包含相應幅度的諧波頻率,也就是說不能像電子琴那樣能奏出多種音色的聲音。因此單片機奏樂只需弄清楚兩個概念即可,也就是“音調”和節拍表示一個音符唱多長的時間。
4.1.1 音調的確定不同音高的樂音是用C、D、E、F、G、A、B來表示,這7個字母就是音樂的音名,它們一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成簡譜的1、2、3、4、5、6、7,相當于漢字“多來米發梭拉西”的讀音,這是唱曲時樂音的發音,所以叫“音調”,即Tone。把C、D、E、F、G、A、B這一組音的距離分成12個等份,每一個等份叫一個“半音”。兩個音之間的距離有兩個“半音”,就叫“全音”。在鋼琴等鍵盤樂器上,C–D、D–E、F–G、G–A、A–B兩音之間隔著一個黑鍵,他們之間的距離就是全音;E–F、B–C兩音之間沒有黑鍵相隔,它們之間的距離就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它們的左上角加上﹟號或者b號的叫變化音。﹟叫升記號,表示把音在原來的基礎上升高半音,b叫降記音,表示在原來的基礎上降低半音。例如高音DO的頻率(1046Hz)剛好是中音DO的頻率(523Hz)的一倍,中音DO的頻率(523Hz)剛好是低音DO頻率(266 Hz)的一倍;同樣的,高音RE的頻率(1175Hz)剛好是中音RE的頻率(587Hz)的一倍,中音RE的頻率(587Hz)剛好是低音RE頻率(294 Hz)的一倍。
要產生音頻脈沖,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時間。利用定時器計時這半個周期時間,每當計時到后就將輸出脈沖的I/O反相,然后重復計時此半周期時間再對I/O反相,就可在I/O腳上得到此頻率的脈沖。利用AT89C51的內部定時器使其工作在計數器模式MODE1下,改變計數值TH0及TL0。此外結束符和休止符可以分別用代碼00H和FFH來表示,若查表結果為00H,則表示曲子終了;若查表結果為FFH,則產生相應的停頓效果。例如頻率為523Hz,其周期T=1/523=1912us,因此只要令計數器計時956us/1us=956,在每次技術956次時將I/O反相,就可得到中音DO(523Hz)。
4.1.2 節拍的確定若要構成音樂,光有音調是不夠的,還需要節拍,讓音樂具有旋律(固定的律動),而且可以調節各個音的快滿度。“節拍”,即Beat,簡單說就是打拍子,就像我們聽音樂不自主的隨之拍手或跺腳。若1拍實0.5s,則1/4 拍為0.125s。至于1拍多少s,并沒有嚴格規定,就像人的心跳一樣,大部分人的心跳是每分鐘72下,有些人快一點,有些人慢一點,只要聽的悅耳就好。音持續時間的長短即時值,一般用拍數表示。休止符表示暫停發音。
一首音樂是由許多不同的音符組成的,而每個音符對應著不同頻率,這樣就可以利用不同的頻率的組合,加以與拍數對應的延時,構成音樂。了解音樂的一些基礎知識,我們可知產生不同頻率的音頻脈沖即能產生音樂。對于單片機來說,產生不同頻率的脈沖是非常方便的,利用單片機的定時/計數器來產生這樣的方波頻率信號。因此,需要弄清楚音樂中的音符和對應的頻率,以及單片機定時計數的關系。
4.1.3 編碼do re mi fa so la si分別編碼為1~7,重音do編為8,重音re編為9,停頓編為0。播放長度以十六分音符為單位(在本程序中為165ms),一拍即四分音符等于4個十六分音符,編為4,其它的播放時間以此類推。音調作為編碼的高4位,而播放時間作為低4位,如此音調和節拍就構成了一個編碼。以0xff作為曲譜的結束標志。比如,音調do,發音長度為兩拍,即二分音符,將其編碼為0x18。
歌曲播放的設計。先將歌曲的簡譜進行編碼,儲存在一個數據類型為unsigned char 的數組中。程序從數組中取出一個數,然后分離出高4位得到音調,接著找出相應的值賦給定時器0,使之定時操作蜂鳴器,得出相應的音調;接著分離出該數的低4位,得到延時時間,接著調用軟件延時。
4.2 主程序流程圖圖4-2主程序流程圖
4.3音樂播放程序流程圖圖4-3 音樂播放程序流程圖
5 protel軟件仿真及PCB板
5.1 原理圖的繪制圖5-1原理圖
通過Protues仿真結果,這次課程設計的要求已全部滿足。
5.2 PCB圖圖5-2PCB圖
5.3 實物圖