畢業(yè)設(shè)計(論文)-基于單片機的電子音樂盒的設(shè)計.doc
創(chuàng)新制作設(shè)計報告題 目 基于單片機的電子音樂盒設(shè)計 姓 名 學(xué) 號 專業(yè)班級 09電子3班 所在學(xué)院 電子與通信工程學(xué)院 指導(dǎo)教師 二一一年 十二 月 三一日目 錄1設(shè)計目的和要求11.1 設(shè)計目的11.2 設(shè)計要求12. 音樂程序設(shè)計原理22.1音樂的基本知識說明22.2 音調(diào)22.3 節(jié)拍32.4 音調(diào)的產(chǎn)生32.5 延時函數(shù)32.6 定時中斷42.7 節(jié)拍的產(chǎn)生53硬件電路設(shè)計63.1總體方案設(shè)計63.2器件選擇63.2.1 單片機的選擇63.2.2 LCD1602簡介73.3 單元電路設(shè)計93.3.1晶振電路93.3.2復(fù)位電路93.3.3 鍵盤部分103.3.4 顯示電路113.3.5 LM386功放驅(qū)動部分123.4整體電路144.軟件設(shè)計164.1 主程序流程圖164.2主程序174.3音樂播放程序流程圖204.4音樂播放程序205、電路仿真調(diào)試235.1 原理圖的繪制235.2仿真結(jié)果24引言21世紀,電子技術(shù)獲得了飛速的發(fā)展,在其推動下,現(xiàn)代電子產(chǎn)品幾乎滲透了社會的各個領(lǐng)域,有力地推動了社會生產(chǎn)力的發(fā)展和社會信息化程度的提高,同時也使現(xiàn)代電子產(chǎn)品性能進一步提高,產(chǎn)品更新?lián)Q代的節(jié)奏也越來越快。目前,單片機正朝著高性能和多品種方向發(fā)展趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內(nèi)裝化等幾個方面發(fā)展。單片機應(yīng)用的重要意義還在于它從根本上改變了傳統(tǒng)的控制系統(tǒng)設(shè)計思想和設(shè)計方法。從前必須由模擬電路或數(shù)字電路實現(xiàn)的大部分功能,現(xiàn)在已能用單片機通過軟件方法來實現(xiàn)了。這種軟件代替硬件的控制技術(shù)也稱為微控制技術(shù),是傳統(tǒng)控制技術(shù)的一次革命。單片機滲透到我們生活的各個領(lǐng)域,幾乎很難找到哪個領(lǐng)域沒有單片機的蹤跡。導(dǎo)彈的導(dǎo)航裝置,飛機上各種儀表的控制,計算機的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統(tǒng),錄像機、攝像機、全自動洗衣機的控制,以及程控玩具、電子寵物等等,這些都離不開單片機。隨著科學(xué)技術(shù)的進步和社會的發(fā)展,人類所接觸的信息也在不斷增加并且日益復(fù)雜。面對浩如煙海的信息,人們已經(jīng)能夠利用計算機等工具高效準確地對之進行處理,但要想將處理完的信息及時,清晰地傳遞給別人,還必須通過尋求更加卓越的顯示技術(shù)來實現(xiàn)。單片機技術(shù)與液晶顯示技術(shù)的結(jié)合,使信息傳輸交流向著智能可視化方向迅速發(fā)展。隨著人類社會的發(fā)展,人們對視覺、聽覺方面的享受提出了越來越高的要求。小小的音樂盒可以給人們帶來美好的回憶,提高人們的精神文化享受。傳統(tǒng)音樂盒多是機械型的,體積笨重,發(fā)音單調(diào),不能實現(xiàn)批量生產(chǎn)。本文設(shè)計的音樂盒是以單片機為核心元件的電子式音樂盒,體積小,重量輕,能演奏和旋音樂,功能多,外觀效果多彩,使用方便,并具有一定的商業(yè)價值。1設(shè)計目的和要求1.1 設(shè)計目的(1) 通過設(shè)計,查閱相關(guān)資料,掌握如何利用單片機設(shè)計產(chǎn)品,同時了解與單片機有關(guān)的軟件模擬器的使用及取字模塊軟件的使用方法。(2) 通過本課程設(shè)計鞏固并擴展單片機課程的基本概念、基本理論、分析方法和實現(xiàn)方法。結(jié)合Proteus和Keil軟件等,學(xué)習(xí)單片機產(chǎn)品的設(shè)計方法,有效地將理論和實際緊密結(jié)合,培養(yǎng)創(chuàng)新思維和設(shè)計能力,增強軟件編程實現(xiàn)能力和解決實際問題的能力。(3) 學(xué)習(xí)Proteus軟件,掌握Proteus中各種芯片的功能以及模擬。由于Proteus提供了實驗室無法相比的大量的元器件庫,提供了修改電路設(shè)計的靈活性、提供了實驗室在數(shù)量、質(zhì)量上難以相比的虛擬儀器、儀表,因而也提供了培養(yǎng)實踐精神、創(chuàng)造精神的平臺。1.2 設(shè)計要求 具體的設(shè)計應(yīng)該滿足以下功能:硬件方面:(1) 利用I/O口產(chǎn)生一定頻率的方波,LM386功放驅(qū)動喇叭,發(fā)出不同的音調(diào),從而演樂曲(內(nèi)存四首樂曲) ,可以通過按鍵進行曲目的選擇;(2) 用LCD顯示歌曲序號和歌曲名字;(3) 可通過功能鍵進行選擇歌曲和暫停的操作。(4) CPU可以控制聲音的音節(jié)和長短;(5)音頻數(shù)據(jù)信息記錄需要大量非易失性數(shù)據(jù)存儲器實時快速地記錄數(shù)據(jù)。因此需要具有掉電保護功能的大容量存儲器;軟件方面:系統(tǒng)中外擴的各器件的初始化工作均在主程序中完成,其次,要設(shè)計如何調(diào)用顯示子程序以及樂曲播放程序。(1) 在實際的控制過程,常要求有實時時鐘,以實現(xiàn)定時或延時控制,所以需要此類中斷服務(wù)程序。(2) 由于按鍵為機械開關(guān)結(jié)構(gòu),機械觸點的彈性及電壓突跳等原因,往往在觸點閉合或斷開的瞬間會出現(xiàn)電壓抖動。為保證鍵識別的準確,在電壓信號抖動的情況下不能進行狀態(tài)的輸入。為此需要進行去抖動處理的中斷服務(wù)程序。(當然這種問題也可以通過硬件方案解決。)2 音樂程序的設(shè)計原理2.1 音樂的基本知識說明聲音是由物體振動產(chǎn)生,正在發(fā)聲的物體叫聲源。振動的頻率高,為高音;振動的頻率低,為低音。人耳比較容易辨識的聲音頻率范圍是20Hz到20,000Hz之間,一般音響電路是用正弦波信號驅(qū)動喇叭,從而產(chǎn)生悅耳的音樂;在數(shù)字電路里,則是用數(shù)字脈沖信號信號驅(qū)動喇叭,從而產(chǎn)生聲音。如果聲音的頻率相同,人類耳朵很難區(qū)分哪個是脈沖信號產(chǎn)生的聲音,哪個是正弦波信號產(chǎn)生的聲音。圖2.1.1 聲音的波形2.2 音調(diào)不同音高的樂音是用C、D、E、F、G、A、B來表示,這7個字母就是音樂的音名,它們一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成簡譜的1、2、3、4、5、6、7,相當于漢字“多來米發(fā)梭拉西”的讀音,這是唱曲時樂音的發(fā)音,所以叫“音調(diào)”,即Tone。把C、D、E、F、G、A、B這一組音的距離分成12個等份,每一個等份叫一個“半音”。兩個音之間的距離有兩個“半音”,就叫“全音”。在鋼琴等鍵盤樂器上,CD、DE、FG、GA、AB兩音之間隔著一個黑鍵,他們之間的距離就是全音;EF、BC兩音之間沒有黑鍵相隔,它們之間的距離就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它們的左上角加上號或者b號的叫變化音。叫升記號,表示把音在原來的基礎(chǔ)上升高半音,b叫降記音,表示在原來的基礎(chǔ)上降低半音。例如高音DO的頻率(1046Hz)剛好是中音DO的頻率(523Hz)的一倍,中音DO的頻率(523Hz)剛好是低音DO頻率(266 Hz)的一倍;同樣的,高音RE的頻率(1175Hz)剛好是中音RE的頻率(587Hz)的一倍,中音RE的頻率(587Hz)剛好是低音RE頻率(294 Hz)的一倍。2.3 節(jié)拍若要構(gòu)成音樂,光有音調(diào)是不夠的,還需要節(jié)拍,讓音樂具有旋律(固定的律動),而且可以調(diào)節(jié)各個音的快滿度?!肮?jié)拍”,即Beat,簡單說就是打拍子,就像我們聽音樂不自主的隨之拍手或跺腳。若1拍實0.5s,則1/4 拍為0.125s。至于1拍多少s,并沒有嚴格規(guī)定,就像人的心跳一樣,大部分人的心跳是每分鐘72下,有些人快一點,有些人慢一點,只要聽的悅耳就好。音持續(xù)時間的長短即時值,一般用拍數(shù)表示。休止符表示暫停發(fā)音。一首音樂是由許多不同的音符組成的,而每個音符對應(yīng)著不同頻率,這樣就可以利用不同的頻率的組合,加以與拍數(shù)對應(yīng)的延時,構(gòu)成音樂。了解音樂的一些基礎(chǔ)知識,我們可知產(chǎn)生不同頻率的音頻脈沖即能產(chǎn)生音樂。對于單片機來說,產(chǎn)生不同頻率的脈沖是非常方便的,利用單片機的定時/計數(shù)器來產(chǎn)生這樣的方波頻率信號。因此,需要弄清楚音樂中的音符和對應(yīng)的頻率,以及單片機定時計數(shù)的關(guān)系。2.4 音調(diào)的產(chǎn)生前面講到聲音只是某一范圍的頻率,也就所謂的音頻。因為揚聲器發(fā)生只需要半個周期即可,所以用單片機產(chǎn)生聲音只要送電半個周期的時間就可以實現(xiàn),我們用音調(diào)Do來舉例,音調(diào)Do周期波形如圖9。我們可以用延遲函數(shù)或者Timer定時中斷可以產(chǎn)生音調(diào)。計算音調(diào)Do的周期:Do頻率=262 HzT=1/f=1/262=3186s所以實際送電的時間只有3826/2=1908sDo f=3186s2.5 延遲函數(shù)對于12M Hz的8051系統(tǒng)而言,若要延遲1ms,可以用“delay1ms(1);”指令,若需要延遲5ms,則可使用“delay1ms(5);”.很明顯,這個函數(shù)的刻度為1ms,但是如果要求小于1ms,我們可以改變內(nèi)循環(huán)的數(shù)量決定延遲時間,因為內(nèi)循環(huán)的數(shù)量為120,可延遲1ms,該函數(shù)的最小刻度為1ms;將內(nèi)循環(huán)的數(shù)量改為12,可延遲0.1ms,該函數(shù)的最小刻度為0.1ms,即100s。如表1。表1內(nèi)循環(huán)數(shù)量最小延遲時間(ms)最小延遲時間(s)12011000600.550060.055030.0252510.00838.31ms延遲函數(shù)如下:void delay1ms(unsigned char x) unsigned char i,j; /聲明變量 for(i=0;ix;i+)/外循環(huán)for(j=0;j120;j+) /內(nèi)循環(huán)8s延遲函數(shù)如下:void delay8s(unsigned char x) unsigned char i,j; /聲明變量 for(i=0;ix;i+)/外循環(huán)for(j=0;j120;j+) /內(nèi)循環(huán)音樂的拍子種類,找出其中最短的拍子,例如整首音樂中,包含1/4拍、1/2拍、3/4拍、1拍、2拍,則以1/4拍為基準,然后寫一段1/4拍長度的延遲函數(shù),若要產(chǎn)生1/4拍的長度,則執(zhí)行該函數(shù)時,變量為1;若要產(chǎn)生1/2拍的長度,則執(zhí)行該函數(shù)時,變量為2;如要產(chǎn)生3/4拍的長度,則執(zhí)行該函數(shù)時,變量為3;若要產(chǎn)生1拍的長度,則執(zhí)行該函數(shù)時,變量為4,如要產(chǎn)生2拍的長度,則執(zhí)行該函數(shù)時,變量為8依次類推。2.6 定時中斷在Mode 1模式下,定時量最多可達65536,也就是65536s,足以產(chǎn)生低音Do所需的半周期1908。所以,若要產(chǎn)生低音Do的音頻,則只需要執(zhí)行1908定時量的timer中斷即可。每中斷一次,就改變連接喇叭的輸入/輸出的狀態(tài),就能發(fā)出低音Do的聲音。如要產(chǎn)生其他音階,只需要按表1-1的T字段設(shè)定定時量即可。如下程序一Mode 1來產(chǎn)生低音的Do:#includesbit speaker=P10; /聲明輸出端main()speaker=0; /喇叭初始值IE=0 x82; /啟用Timer0 TH0=(65536-1908)/256; /填入定時量的高八位 TL0=(65536-1908)%256; /填入定時量的低八位 TR0=1; /啟動Timer0 While(1); /停止 /主程序結(jié)束/=Timer0中斷子程序=void tone_int(void)interrupt 1 /Timer 0中斷之程序TH0=Do_H; /填入定時量的高八位 TH0=Do_L; /填入定時量的低八位 speaker=speaker; /喇叭反向輸出音樂中最短的拍子,例如在整首音樂中,最短的拍子為1/4拍,若1/4拍的時間為0.125s,則以1/4拍為基準,然后設(shè)定每0.125s產(chǎn)生一次中斷,其定時量為125000,假設(shè)采用Mode 1,定時量設(shè)為62500,只要執(zhí)行2次中斷,即可產(chǎn)生1/4拍的時間長度。同理,若要產(chǎn)生1/2拍的長度,則執(zhí)行4次中斷,若要產(chǎn)生3/4拍的長度,則執(zhí)行6次中斷依次類推。如表2。表2拍數(shù)中斷次數(shù)拍數(shù)中斷次數(shù)拍數(shù)中斷次數(shù)1/811/241又1/4101/423/461又1/2128/33182162.7 節(jié)拍的產(chǎn)生音階的頻率是固定的,而節(jié)拍有快有慢,拍子越短,節(jié)奏越快,拍子越長,節(jié)奏越慢。產(chǎn)生節(jié)拍的方法也是一種處理時間的方法。我們以生日快樂歌為例,它的前兩個音節(jié)1 1 2 14 3 ,第一個音是Do,發(fā)生這個音的時間長度是250ms;停頓一下,再發(fā)出第二個音Do,還是持續(xù)250ms;接下來發(fā)Re的音,時間長達500ms、改發(fā)出Do的音,時間長達500ms,第一小節(jié)結(jié)束。緊接著是第二小節(jié),首先發(fā)Fa的音,時間長達500ms;在發(fā)出Mi的音,時間長達1000ms,以下以此類推。節(jié)拍的產(chǎn)生我們同樣可以采用延遲函數(shù)或者Timer定時中斷兩種方式。3硬件電路設(shè)計3.1總體方案設(shè)計圖1 總體方案圖以AT89C51為核心,通過單片機的定時器產(chǎn)生一定長度的方波,方波脈沖驅(qū)動蜂鳴器發(fā)聲。要產(chǎn)生音頻脈沖,只需算出某一音頻的周期(1/音頻),然后取半周期的時間定時。利用定時器計時這個半周期時間,每當計時到后就將輸出脈沖的I/O反相,然后重復(fù)計時此半周期時間再對I/O口反相,就可在I/O腳上得到此頻率的脈沖。當鍵盤有鍵按下時,判斷鍵值,啟動計數(shù)器T0,產(chǎn)生一定頻率的脈沖,驅(qū)動揚聲器,放出樂曲。同時在LCD顯示歌曲序號和歌曲名稱。3.2器件選擇3.2.1 單片機的選擇單片機型號的選擇是根據(jù)控制系統(tǒng)的目標、功能、可靠性、性價比、精度和速度等來決定的。根據(jù)本課題的實際情況,單片機型號的選擇主要從以下兩點考慮;一是要有較強的抗干擾能力。二是要有較高的性價比。由于51系列在我國使用最廣,且該系列的資料和能夠兼容的外圍芯片也比較多,特別是ATMEL公司89C系列單片機,其典型產(chǎn)品AT89C51單片機,具有較高的性能價格比。故本系統(tǒng)采用ATMEL公司生產(chǎn)的AT89C51單片機作為電子音樂盒的核心部件,AT89C51是美國ATMEL公司生產(chǎn)的低電壓,高性能CMOS8位單片機,片內(nèi)含4k bytes的可反復(fù)擦寫的只讀程序存儲器(PEROM)和128 bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標準MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(CPU)和Flash存儲單元,功能強大AT89C51單片機可提供許多高性價比的應(yīng)用場合,可靈活應(yīng)用于各種控制領(lǐng)域。3.2.2 LCD1602簡介LCD液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區(qū)域進行控制,有電就有顯示,這樣即可以顯示出圖形。液晶顯示器具有厚度薄、適用于大規(guī)模集成電路直接驅(qū)動、易于實現(xiàn)全彩色顯示的特點,目前已經(jīng)被廣泛應(yīng)用在便攜式電腦、數(shù)字攝像機、PDA移動通信工具等眾多領(lǐng)域。字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號等點陣式LCD,目前常用161,162,202和402行等的模塊。LCD1602分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應(yīng)用中并無差別,兩者尺寸差別如下圖2所示:圖2 LCD尺寸圖1602LCD主要技術(shù)參數(shù):顯示容量:162個字符;芯片工作電壓:4.55.5V;工作電流:2.0mA(5.0V);模塊最佳工作電壓:5.0V;字符尺寸:2.954.35(WH)mm。引腳功能說明LCD1602采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表1所示。表1 引腳接口說明表編號符號引腳說明編號符號引腳說明1VSS電源地9D2數(shù)據(jù)2VDD電源正極10D3數(shù)據(jù)3VL液晶顯示偏壓11D4數(shù)據(jù)4RS數(shù)據(jù)/命令選擇12D5數(shù)據(jù)5R/W讀/寫選擇13D6數(shù)據(jù)6E使能信號14D7數(shù)據(jù)7D0數(shù)據(jù)15BLA背光源正極8D1數(shù)據(jù)16BLK背光源負極第1腳:VSS為地電源。第2腳:VDD接5V正電源。第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。第714腳:D0D7為8位雙向數(shù)據(jù)線。第15腳:背光源正極。第16腳:背光源負極。1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表2所示:表2 控制命令表序號指令RSR/WD7D6D5D4D3D2D1D01清顯示00000000012光標返回000000001*3置輸入模式00000001I/DS4顯示開/關(guān)控制0000001DCB5光標或字符移位000001S/CR/L*6置功能00001DLNF*7置字符發(fā)生存貯器地址0001字符發(fā)生存貯器地址8置數(shù)據(jù)存貯器地址001顯示數(shù)據(jù)存貯器地址9讀忙標志或地址01BF計數(shù)器地址10寫數(shù)到CGRAM或DDRAM)10要寫的數(shù)據(jù)內(nèi)容11從CGRAM或DDRAM讀數(shù)11讀出的數(shù)據(jù)內(nèi)容1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平)指令1:清顯示,指令碼01H,光標復(fù)位到地址00H位置。指令2:光標復(fù)位,光標返回到地址00H。指令3:光標和顯示模式設(shè)置 I/D:光標移動方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標的開與關(guān),高電平表示有光標,低電平表示無光標 B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。指令5:光標或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標。指令6:功能設(shè)置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F: 低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。指令7:字符發(fā)生器RAM地址設(shè)置。指令8:DDRAM地址設(shè)置。指令9:讀忙信號和光標地址 BF:為忙標志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。指令10:寫數(shù)據(jù)。指令11:讀數(shù)據(jù)。與HD44780相兼容的芯片時序表如下:表 3 芯片時序圖讀狀態(tài)輸入RS=L,R/W=H,E=H輸出D0D7=狀態(tài)字寫指令輸入RS=L,R/W=L,D0D7=指令碼,E=高脈沖輸出無讀數(shù)據(jù)輸入RS=H,R/W=H,E=H輸出D0D7=數(shù)據(jù)寫數(shù)據(jù)輸入RS=H,R/W=L,D0D7=數(shù)據(jù),E=高脈沖輸出無3.3 單元電路設(shè)計3.3.1晶振電路單片機需要一個時間基準來為各種操作提供秩序,此電路叫時鐘電路,采用不同的接線方式可以獲得不同時鐘電路,有內(nèi)部時鐘電路和外部時鐘電路,如圖4.3所示,外部時鐘電路會使電路復(fù)雜,故采用的是內(nèi)部時鐘電路。時鐘電路在單片機的外部通過XTAL1,XTAL2這兩個引腳跨接晶體振蕩器和微調(diào)電容,構(gòu)成穩(wěn)定的自激振蕩器.本系統(tǒng)采用的為12MHz的晶振,一個機器周期為1us,C1,C2為30uF。3.3.2復(fù)位電路復(fù)位電路的基本功能是:系統(tǒng)上電時提供復(fù)位信號,直至系統(tǒng)電源穩(wěn)定后,撤銷復(fù)位信號。為可靠起見,電源穩(wěn)定后還要經(jīng)一定的延時才撤銷復(fù)位信號,以防電源開關(guān)或電源插頭分-合過程中引起的抖動而影響復(fù)位。復(fù)位電路分為上電自動復(fù)位和按鍵手動復(fù)位,如圖3所示。RST引腳是復(fù)位信號的輸入端,復(fù)位信號是高電平有效.這次采用的是手動復(fù)位,復(fù)位通過電容C3,C4和電阻R1,R2來實現(xiàn),按鍵手動復(fù)位是圖中復(fù)位鍵來實現(xiàn)的。圖 3 晶振與復(fù)位電路3.3.3 鍵盤部分鍵盤是由一組按壓式或觸摸式開關(guān)構(gòu)成的陣列,是一種常用的輸入設(shè)備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。1.編碼鍵盤通過硬件電路產(chǎn)生被按按鍵的鍵碼,這種鍵盤所需程序簡單,但硬件電路復(fù)雜、價格昂貴通常不被單片機系統(tǒng)采用。2.非編碼鍵盤常用一些按鍵排列成行列矩陣,其硬件邏輯與按鍵編碼不存在嚴格的對應(yīng)關(guān)系,而要由所用的程序來決定。非編碼鍵盤的硬件接口簡單,但是要占用較多的CPU時間,通常采用可編程鍵盤管理芯片來克服這個缺點。本設(shè)計使用兩種按鍵,一種是按鍵式非編碼鍵盤和輕觸式非編碼開關(guān)。圖 4 鍵盤電路3.3.4 顯示電路LCD的8根數(shù)據(jù)線與P1口相連,RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。R/W為讀寫信號線,RS與P2.0相連,由P2.0控制LCD的寫指令或?qū)憯?shù)據(jù)操作。R/W與P2.1相連,由P2.1決定是讀操作還是寫操作。E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。E端與P2.2相連。圖5 LCD顯示電路3.3.5 LM386功放電路LM386是一種音頻集成功放,具有自身功耗低、電壓增益可調(diào)整、電源電壓范圍大、外接元件少和總諧波失真小等優(yōu)點,廣泛應(yīng)用于錄音機和收音機之中。一、 LM386內(nèi)部電路LM386內(nèi)部電路原理圖如圖所示。與通用型集成運放相類似,它是一個三級放大電路。第一級為差分放大電路,T1和T3、T2和T4分別構(gòu)成復(fù)合管,作為差分放大電路的放大管;T5和T6組成鏡像電流源作為T1和T2的有源負載;T3和T4信號從管的基極輸入,從T2管的集電極輸出,為雙端輸入單端輸出差分電路。使用鏡像電流源作為差分放大電路有源負載,可使單端輸出電路的增益近似等于雙端輸出電容的增益。第二級為共射放大電路,T7為放大管,恒流源作有源負載,以增大放大倍數(shù)。第三級中的T8和T9管復(fù)合成PNP型管,與NPN型管T10構(gòu)成準互補輸出級。二極管D1和D2為輸出級提供合適的偏置電壓,可以消除交越失真。引腳2為反相輸入端,引腳3為同相輸入端。電路由單電源供電,故為OTL電路。輸出端(引腳5)應(yīng)外接輸出電容后再接負載。電阻R7從輸出端連接到T2的發(fā)射極,形成反饋通路,并與R5和R6構(gòu)成反饋網(wǎng)絡(luò),從而引入了深度電壓串聯(lián)負反饋,使整個電路具有穩(wěn)定的電壓增益。二、 LM386的引腳圖LM386的外形和引腳的排列如右圖所示。引腳2為反相輸入端,3為同相輸入端;引腳5為輸出端;引腳6和4分別為電源和地;引腳1和8為電壓增益設(shè)定端;使用時在引腳7和地之間接旁路電容,通常取10F。 查LM386的datasheet,電源電壓4-12V或5-18V(LM386N-4);靜態(tài)消耗電流為4mA;電壓增益為20-200dB;在1、8腳開路時,帶寬為300KHz;輸入阻抗為50K;音頻功率0.5W。 盡管LM386的應(yīng)用非常簡單,但稍不注意,特別是器件上電、斷電瞬間,甚至工作穩(wěn)定后,一些操作(如插拔音頻插頭、旋音量調(diào)節(jié)鈕)都會帶來的瞬態(tài)沖擊,在輸出喇叭上會產(chǎn)生非常討厭的噪聲查LM386的datasheet,電源電壓4-12V或5-18V(LM386N-4);靜態(tài)消耗電流為4mA;電壓增益為20-200dB;在1、8腳開路時,帶寬為300KHz;輸入阻抗為50K;音頻功率0.5W。 盡管LM386的應(yīng)用非常簡單,但稍不注意,特別是器件上電、斷電瞬間,甚至工作穩(wěn)定后,一些操作(如插拔音頻插頭、旋音量調(diào)節(jié)鈕)都會帶來的瞬態(tài)沖擊,在輸出喇叭上會產(chǎn)生非常討厭的噪聲。1、通過接在1腳、8腳間的電容(1腳接電容+極)來改變增益,斷開時增益為20dB。因此用不到大的增益,電容就不要接了,不光省了成本,還會帶來好處-噪音減少,何樂而不為?2、PCB設(shè)計時,所有外圍元件盡可能靠近LM386;地線盡可能粗一些;輸入音頻信號通路盡可能平行走線,輸出亦如此。這是死理,不用多說了吧。3、選好調(diào)節(jié)音量的電位器。質(zhì)量太差的不要,否則受害的是耳朵;阻值不要太大,10K最合適,太大也會影響音質(zhì),轉(zhuǎn)那么多圈圈,不煩那!4、盡可能采用雙音頻輸入/輸出。好處是:“”、“”輸出端可以很好地抵消共模信號,故能有效抑制共模噪聲。5、第7腳(BYPASS)的旁路電容不可少!實際應(yīng)用時,BYPASS端必須外接一個電解電容到地,起濾除噪聲的作用。工作穩(wěn)定后,該管腳電壓值約等于電源電壓的一半。增大這個電容的容值,減緩直流基準電壓的上升、下降速度,有效抑制噪聲。在器件上電、掉電時的噪聲就是由該偏置電壓的瞬間跳變所致,這個電容可千萬別省?。?、減少輸出耦合電容。此電容的作用有二:隔直 + 耦合。隔斷直流電壓,直流電壓過大有可能會損壞喇叭線圈;耦合音頻的交流信號。它與揚聲器負載構(gòu)成了一階高通濾波器。減小該電容值,可使噪聲能量沖擊的幅度變小、寬度變窄;太低還會使截止頻率(fc1/(2*RL*Cout))提高。分別測試,發(fā)現(xiàn)10uF/4.7uF最為合適,這是我的經(jīng)驗值。7、電源的處理,也很關(guān)鍵。如果系統(tǒng)中有多組電源,太好了!由于電壓不同、負載不同以及并聯(lián)的去耦電容不同,每組電源的上升、下降時間必有差異。非??尚械姆椒ǎ簩⑸想?、掉電時間短的電源放到+12V處,選擇上升相對較慢的電源作為LM386的Vs,但不要低于4V,效果確實不錯!由于揚聲器的工作電流一般比較大,以致于單片機的I/O 口是無法直接驅(qū)動的,所以要利用LM386功率放大電路來驅(qū)動。圖6 蜂鳴器電路3.4整體電路154.軟件設(shè)計4.3 主程序流程圖圖 8 主程序流程圖4.4主程序main()uint i;k=8;init(); for(i=0;i15;i+) WriteData(tabi);/LCD寫數(shù)據(jù)函數(shù)寫第一行 mydelay(50); mydelay(1000); WriteCMD(0 x80+0 x40+2);/將指針設(shè)到第二行空兩字符 for(i=0;i6;i+) WriteData(tab1i); mydelay(50); InitialSound();/發(fā)音初始化程序while(1) Getch();/掃描鍵盤,獲得鍵值 if(k=0)/若鍵值為0 uint i; init(); for(i=0;i10;i+) WriteData(tab2i);/寫第一首歌序號 mydelay(50); mydelay(1000); WriteCMD(0 x80+0 x40);/轉(zhuǎn)到第二行 for(i=0;i9;i+) WriteData(tab3i);/寫歌名 mydelay(50); Play(Music_Girl,0,3,360);/播放第一首歌 Delay1ms(500);break; else if (k=1) /若鍵值為1uint i; init(); for(i=0;i11;i+) WriteData(tab4i); /寫第二首歌序號 mydelay(50); mydelay(1000); WriteCMD(0 x80+0 x40); /轉(zhuǎn)到第二行 for(i=0;i11;i+) WriteData(tab5i); /寫歌名 mydelay(50); Play(Music_Jingle,0,3,360); /播放第二首歌Delay1ms(500);break; else if (k=2) /若鍵值為2uint i; init(); for(i=0;i10;i+) WriteData(tab6i); /寫第三首歌序號 mydelay(50); mydelay(1000); /WriteCMD(0 x01); WriteCMD(0 x80+0 x40); /轉(zhuǎn)到第二行 for(i=0;i6;i+) WriteData(tab7i); /寫歌名 mydelay(50); Play(Music_Two,0,3,360); /播放第三首歌Delay1ms(500);break; else if (k=3) /若鍵值為3uint i; init(); for(i=0;i10;i+) WriteData(tab8i); /寫第四首歌序號 mydelay(50); mydelay(1000);WriteCMD(0 x80+0 x40); /轉(zhuǎn)到第二行 for(i=0;i6;i+) WriteData(tab9i); /寫歌名 mydelay(50); Play(Music_Four,0,3,360); /播放第三首歌Delay1ms(500);break;4.5音樂播放程序流程圖圖9 音樂播放程序流程圖4.6音樂播放程序void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)unsigned int NewFreTab12;/新的頻率表unsigned char i,j;unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i 11)j = j-12;NewFreTabi = FreTabj*2;elseNewFreTabi = FreTabj;if(Octachord = 1)NewFreTabi=2;else if(Octachord = 3)NewFreTabi=2;SoundLength = 0;while(SoundSoundLength != 0 x00)/計算歌曲長度SoundLength+=2;Point = 0;Tone = SoundPoint;Length = SoundPoint+1; / 讀出第一個音符和它時時值LDiv0 = 12000/Speed;/ 算出1分音符的長度(幾個10ms) LDiv4 = LDiv0/4; / 算出4分音符的長度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE; / 普通音最長間隔標準 TR0 = 0;TR1 = 1;while(Point = 2; /低音 if (SM=3) CurrentFre = 2; /高音Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);/計算計數(shù)器初值Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; /加12是對中斷延時的補償 SLen=LengthTabLength%10; /算出是幾分音符XG=Length/10%10; /算出音符類型(0普通1連音2頓音) FD=Length/100;LDiv=LDiv0/SLen; /算出連音音符演奏的長度(多少個10ms)if (FD=1) LDiv=LDiv+LDiv/2;if(XG!=1)if(XG=0) /算出普通音符的演奏長度 if (SLen0;i-) /發(fā)規(guī)定長度的音 while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;if(LDiv2!=0)TR0=0; BeepIO=0;for(i=LDiv2;i0;i-) /音符間的間隔while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;Point+=2; Tone=SoundPoint;Length=SoundPoint+1;BeepIO = 0;5、電路仿真調(diào)試5.1 原理圖的繪制仿真平臺為Proteus軟件,Proteus軟件是世界上著名的EDA工具(仿真軟件),能完成原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件,是目前最好的仿真單片機及外圍器件的工具。PROTEUS電路設(shè)計是在PROTEUS ISIS環(huán)境中繪制的,該編輯環(huán)境具有良好的人機交互界面,功能強大極易上手。首先通過桌面進入主程序,繪制原來圖的主要任務(wù)是從元件庫中選取繪制電路所需要的元件??梢酝ㄟ^點擊選擇器頂端左側(cè)的“P”或者通過命令打開,我們常用的是按鈕;在查找到并放置完所有需要的器件后,我們需要接著連接元件,即在PROTEUS ISIS的編輯窗口布線。PROTEUS ISIS中沒有布線模式,但用戶可以在任意時刻放置連線和編輯連線。在完成繪制所需的電路圖前,用戶需要放置并連接斷軸。在電路原理圖中放置兩種通用的端子,一種是接地端子一種是電源端子。當在PROTEUS ISIS編輯窗口放置元件時,每一元件都有唯一的元件標號及元件值與之對應(yīng)。原件號是PROTEUS ISIS的實時注釋功能自動標注的,這一功能可在菜單中設(shè)置選擇是否開啟。PROTEUS ISIS中也支持塊操作,當用戶需要對電路中的某一部分進行操作時,可以使用該功能。系統(tǒng)共支持塊移動、塊復(fù)制、塊旋轉(zhuǎn)、塊刪除等實用功能,充分利用這些功能可以極大的提高我們繪圖的效率。我們繪制完所有的元件后,最后進行統(tǒng)一標注,PROTEUS ISIS支持注釋功能,可以把我們所繪制的原理圖中的器件根據(jù)我們的需要添加上特殊的注釋,以表示特定的含義。根據(jù)設(shè)計電路繪制完后的電路圖如圖6.1所示。5.2仿真結(jié)果圖 10 仿真圖通過Protues仿真結(jié)果,這次課程設(shè)計的要求已全部滿足。參考文獻1閻石.數(shù)字電子技術(shù)基礎(chǔ)(第四版)M.高等教育出版社.1998.112張毅剛等.MCS-51單片機應(yīng)用設(shè)計.哈爾濱工業(yè)電子出版社,19963何立民.單片機應(yīng)用技術(shù)選編.北京航空航天大學(xué)出版社,20004張友德等.單片微型機原理應(yīng)用與實驗,復(fù)旦大學(xué)出版社,19965鄔寬明.單片機外圍器件實用手冊.北京航空航天大學(xué)出版社,1998附錄鍵盤掃描頭文件:#ifndef _key_H_#define _key_H_#define uchar unsigned charuchar k;void delay1(void) /延時程序 uchar i,j; for(i=20;i0;i-) for(j=248;j0;j-); void Getch ( ) uchar X,Y,Z;P1=0 xff;P1=0 xf3; /先對P0置數(shù) 行掃描if(P1!=0 xf3) /判斷是否有鍵按下delay1(); /延時,軟件去干擾 if(P1!=0 xf3) /確認按鍵按下X = P3; X=P1; /保存行掃描時有鍵按下時狀態(tài)P1=0 xfc; /列掃描Y=P1; /保存列掃描時有鍵按下時狀態(tài) Z=X|Y; /取出鍵值switch ( Z ) /判斷鍵值(那一個鍵按下)case 0 xf9: k=0; break; /對鍵值賦值case 0 xf5: k=1; break; case 0 xfa: k=2; break; case 0 xf6: k=3; break; LCD顯示頭文件#ifndef _lcdshow_H_#define _lcdshow_H_#define uchar unsigned char#define uint unsigned int#define LCDPORT P0uchar code tab=Press key;uchar code tab1=Select song;uchar code tab2=First Song ;uchar code tab3=butterfly;uchar code tab4=Second Song;uchar code tab5=Jingle bell ;uchar code tab6=Third Song ;uchar code tab7=Yesterday;uchar code tab8=Forth Song ;uchar code tab9=Youth League;sbit LCDE=P22;sbit LCDRW=P21;sbit LCDRS=P20;void Delay() uint uiCount; for(uiCount=0;uiCount0;i-) for(j=255;j0;j-);發(fā)聲頭文件:#ifndef _SOUNDPLAY_H_#define _SOUNDPLAY_H_#define SYSTEM_OSC 12000000/定義晶振頻率12000000HZ#define SOUND_SPACE 4/5 /定義普通音符演奏的長度分率,/每4分音符間隔sbit BeepIO = P37;/定義輸出管腳sbitK1=P17;unsigned int code FreTab12 = 262,277,294,311,330,349,369,392,415,440,466,494 ; /原始頻率表unsigned char code SignTab7 = 0,2,4,5,7,9,11 ; /17在頻率表中的位置unsigned char code LengthTab7= 1,2,4,8,16,32,64 ;unsigned char Sound_Temp_TH0,Sound_Temp_TL0;/音符定時器初值暫存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1;/音長定時器初值暫存void InitialSound(void)BeepIO = 0;Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;/ 計算TL1應(yīng)裝入的初值 (10ms的初裝值)Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;/ 計算TH1應(yīng)裝入的初值 TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TMOD |=