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

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