1 設(shè)計(jì)任務(wù)1.1 設(shè)計(jì)目的和意義本次課程設(shè)計(jì)是應(yīng)用單片機(jī)原理設(shè)計(jì)可編程樂(lè)曲演奏器的硬件電路,并利用C語(yǔ)言進(jìn)行程序設(shè)計(jì)。課程設(shè)計(jì)的目的就是配合本課程的教學(xué)和平時(shí)實(shí)驗(yàn),以達(dá)到鞏固消化課程的內(nèi)容的目的,進(jìn)一步加強(qiáng)綜合應(yīng)用能力及單片機(jī)應(yīng)用系統(tǒng)開發(fā)和設(shè)計(jì)能力的訓(xùn)練,啟發(fā)創(chuàng)新思維,使之具有獨(dú)立單片機(jī)產(chǎn)品和科研的基本技能,是培養(yǎng)綜合運(yùn)用所學(xué)知識(shí)的過(guò)程,是知識(shí)轉(zhuǎn)化為能力和能力轉(zhuǎn)化為工程素質(zhì)的重要階段。
1.2 設(shè)計(jì)任務(wù)要求可編程樂(lè)曲演奏器的設(shè)計(jì),具體內(nèi)容如下:
- 用定時(shí)器T0方式1來(lái)產(chǎn)生不同頻率的方波。
- 由P1.0輸出驅(qū)動(dòng)喇叭,演奏最少兩段樂(lè)曲。
- 有按鍵切換選擇樂(lè)曲、開始/暫停。
- 有發(fā)光二極管伴隨音頻脈沖閃爍。
- 數(shù)碼管顯示當(dāng)前演奏曲目序號(hào)。
2 系統(tǒng)硬件電路的設(shè)計(jì)2.1 總體設(shè)計(jì)方案2.1.1 總體設(shè)計(jì)原理通過(guò)單片機(jī)的定時(shí)器產(chǎn)生一定長(zhǎng)度的方波,驅(qū)動(dòng)蜂鳴器發(fā)聲。產(chǎn)生音頻脈沖,只需算出某一音頻的周期(1/音頻),然后取半周期的時(shí)間定時(shí)。利用定時(shí)器計(jì)時(shí)這個(gè)半周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸出脈沖的I/O反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O口反相,就可在I/O腳上得到此頻率的脈沖。如中音D0,頻率為523HZ,其周期T=1/523=1912微秒,因此只要令計(jì)數(shù)器定時(shí)1912/2=956,在每計(jì)數(shù)956次時(shí)將I/O口反相,就可得到中音D0(523HZ)。
當(dāng)鍵盤有鍵按下時(shí),判斷鍵值,啟動(dòng)計(jì)數(shù)器T0,產(chǎn)生一定頻率的脈沖,由P1口輸出驅(qū)動(dòng)蜂鳴器,放出樂(lè)曲。通過(guò)單片機(jī)P0口控制數(shù)碼管,實(shí)現(xiàn)歌曲序號(hào)的顯示;功能鍵盤采用按鍵開關(guān),通過(guò)單片機(jī)P3口控制,實(shí)現(xiàn)歌曲播放順序的調(diào)換和暫停播放功能;彩燈是由普通發(fā)光二極管代替,通過(guò)單片機(jī)P2口控制,實(shí)現(xiàn)閃爍效果。
通過(guò)按下功能鍵實(shí)現(xiàn)上一首和下一首及開始/暫停播放,同時(shí)有數(shù)碼管顯示當(dāng)前播放歌曲的序號(hào),蜂鳴器播放出音樂(lè),伴有彩燈閃爍。
2.1.2 總體設(shè)計(jì)框圖單片機(jī)電源供電后,晶振電路產(chǎn)生單片機(jī)所需時(shí)鐘信號(hào),通過(guò)功能鍵產(chǎn)生外部中斷,控制演奏器的上一首和下一首曲目,再由I/O接口輸出控制蜂鳴器發(fā)聲,LED顯示,彩燈閃爍。另外,復(fù)位電路在于營(yíng)造一個(gè)程序運(yùn)行的初始狀態(tài),在程序出錯(cuò)時(shí),重新啟動(dòng)單片機(jī)工作?傮w設(shè)計(jì)框圖如圖1所示。
1.001.jpg (10.06 KB, 下載次數(shù): 31)
下載附件
2017-8-13 01:05 上傳
圖1 總體設(shè)計(jì)框圖
編程設(shè)置好定時(shí)時(shí)間,通過(guò)編程器寫入AT89C51單片機(jī)系統(tǒng)。由AT89C51單片機(jī)的定時(shí)器每秒鐘通過(guò)P0.0-P0.7口控制LED數(shù)碼顯示,復(fù)位信號(hào)由按鈕輸入,每按下一次,系統(tǒng)恢復(fù)原設(shè)定狀態(tài)。電源,晶振部分,復(fù)位電路,單片機(jī),LED,功能鍵,蜂鳴器部分后面均有詳細(xì)介紹。
2.2 具體電路設(shè)計(jì)
2.2.1 最小單片機(jī)系統(tǒng)
1.002.jpg (21.49 KB, 下載次數(shù): 30)
下載附件
2017-8-13 01:05 上傳
圖2 AT89C51系列單片機(jī)
單片機(jī)最小系統(tǒng)以AT89C51為核心,外加時(shí)鐘和復(fù)位電路,如圖2所示。電路結(jié)構(gòu)簡(jiǎn)單,抗干擾能力強(qiáng),成本相對(duì)較低,非常符合本設(shè)計(jì)的所有要求.AT89C51單片機(jī)系列是在MCS-51系列的基礎(chǔ)上發(fā)展起來(lái)的,是當(dāng)前8位單片機(jī)的典型代表,采用CHMOS工藝,即互補(bǔ)金屬氧化物的HMOS工藝, CHMOS是CMOS和HMOS的結(jié)合,具有HMOS高速度和高密度的特點(diǎn),還具有CMOS低功耗的特點(diǎn).
單片機(jī)需要一個(gè)時(shí)間基準(zhǔn)來(lái)為各種操作提供秩序,此電路叫時(shí)鐘電路,采用不同的接線方式可以獲得不同時(shí)鐘電路,有內(nèi)部時(shí)鐘電路和外部時(shí)鐘電路,外部時(shí)鐘電路會(huì)使電路復(fù)雜,故采用的是內(nèi)部時(shí)鐘電路。時(shí)鐘電路在單片機(jī)的外部通過(guò)XTAL1,XTAL2這兩個(gè)引腳跨接晶體振蕩器和微調(diào)電容,構(gòu)成穩(wěn)定的自激振蕩器.本系統(tǒng)采用的為1MHz的晶振,一個(gè)機(jī)器周期為12us,C1,C2為22pF。
復(fù)位電路的基本功能是:系統(tǒng)上電時(shí)提供復(fù)位信號(hào),直至系統(tǒng)電源穩(wěn)定后,撤銷復(fù)位信號(hào)。為可靠起見,電源穩(wěn)定后還要經(jīng)一定的延時(shí)才撤銷復(fù)位信號(hào),以防電源開關(guān)或電源插頭分-合過(guò)程中引起的抖動(dòng)而影響復(fù)位。
復(fù)位電路分為上電自動(dòng)復(fù)位和按鍵手動(dòng)復(fù)位RST引腳是復(fù)位信號(hào)的輸入端,復(fù)位信號(hào)是高電平有效.這次采用的是手動(dòng)復(fù)位。復(fù)位通過(guò)電容C2和電阻R1來(lái)實(shí)現(xiàn),按鍵手動(dòng)復(fù)位是圖中復(fù)位鍵來(lái)實(shí)現(xiàn)的。
2.2.2 發(fā)光二極管電路播放歌曲時(shí),單片機(jī)通過(guò)定時(shí)器產(chǎn)生一定長(zhǎng)度方波,驅(qū)動(dòng)蜂鳴器發(fā)出某個(gè)音調(diào),產(chǎn)生音頻脈沖,使與之對(duì)應(yīng)的發(fā)光二極管亮起。電路如圖3所示。
1.003.jpg (14.39 KB, 下載次數(shù): 28)
下載附件
2017-8-13 01:05 上傳
圖3 發(fā)光二極管電路圖
2.2.3 數(shù)碼管電路播放樂(lè)曲時(shí),數(shù)碼管電路顯示當(dāng)前播放樂(lè)曲序號(hào)。
樂(lè)曲序號(hào)顯示部分用數(shù)碼管來(lái)顯示,LED顯示器件是通過(guò)發(fā)光二極管顯示字段的器件。在單片機(jī)控制系統(tǒng)中常用的是由7段LED數(shù)碼管,它的顯示塊中有8個(gè)發(fā)光二極管,7個(gè)發(fā)光二極管組成字符“8”,1個(gè)發(fā)光二極管構(gòu)成小數(shù)點(diǎn),因此有人稱7段LED數(shù)碼管為8段顯示器。LED數(shù)碼管的電路圖如圖4所示。
1.004.jpg (14.9 KB, 下載次數(shù): 27)
下載附件
2017-8-13 01:05 上傳
圖4 LED數(shù)碼管電路圖
2.2.4 蜂鳴器電路一般所指的蜂鳴器是以壓電陶瓷為主要元件的。壓電陶瓷是一類有將壓力與電流相互轉(zhuǎn)換能力的特殊陶瓷。這種能力緣于其特殊的晶體結(jié)構(gòu)。當(dāng)壓電陶瓷在一定方向上受到一個(gè)壓力使其晶體結(jié)構(gòu)發(fā)生形變時(shí),它就會(huì)在內(nèi)部產(chǎn)生一個(gè)電流,并且電流的變化與壓力的變化密切相關(guān)。反之亦然。所以利用這一特性,在壓電陶瓷上通過(guò)一定頻率的電流,就會(huì)引起壓電陶瓷微小形變,這一形變帶動(dòng)空氣發(fā)生振動(dòng),如果頻率適當(dāng),就可以被人耳所聽見,也就是產(chǎn)生了蜂鳴聲。
蜂鳴器的作用:蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。
蜂鳴器的分類:蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。
蜂鳴器的電路圖形符號(hào):蜂鳴器在電路中用字母“H”或“HA”(舊標(biāo)準(zhǔn)用“FM”、“LB”、“JD”等)表示。
蜂鳴器電路如圖5所示。
1.005.jpg (18.65 KB, 下載次數(shù): 34)
下載附件
2017-8-13 01:05 上傳
圖5 蜂鳴器電路圖
2.2.5 鍵盤控制電路通過(guò)按下功能鍵實(shí)現(xiàn)上一首和下一首及開始/暫停播放。電路如圖6所示。
鍵盤是由一組按壓式或觸摸式開關(guān)構(gòu)成的陣列,是一種常用的輸入設(shè)備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。
非編碼鍵盤常用一些按鍵排列成行列矩陣,其硬件邏輯與按鍵編碼不存在嚴(yán)格的對(duì)應(yīng)關(guān)系,而要由所用的程序來(lái)決定。非編碼鍵盤的硬件接口簡(jiǎn)單,但是要占用較多的CPU時(shí)間,通常采用可編程鍵盤管理芯片來(lái)克服這個(gè)缺點(diǎn)。本設(shè)計(jì)使用兩種按鍵,一種是按鍵式非編碼鍵盤和輕觸式非編碼開關(guān)。
1.006.jpg (11.58 KB, 下載次數(shù): 24)
下載附件
2017-8-13 01:05 上傳
圖6 鍵盤控制電路圖
2.3 整體硬件電路
整體硬件電路如圖7所示。
1.007.jpg (27.86 KB, 下載次數(shù): 31)
下載附件
2017-8-13 01:05 上傳
圖7 整體硬件電路圖
2.4 系統(tǒng)所用元器件
表1 本系統(tǒng)所用的元器件
3軟件設(shè)計(jì)3.1 音調(diào)、節(jié)拍以及編碼的確定方法 一般說(shuō)來(lái),單片機(jī)演奏音樂(lè)基本都是單音頻率,它不包含相應(yīng)幅度的諧波頻率,也就是說(shuō)不能像電子琴那樣能奏出多種音色的聲音。因此單片機(jī)奏樂(lè)只需弄清楚兩個(gè)概念即可,也就是“音調(diào)”和節(jié)拍表示一個(gè)音符唱多長(zhǎng)的時(shí)間。
3.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è)“半音”,就叫“全音”。在鋼琴等鍵盤樂(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以產(chǎn)生不同頻率的方法。
此外結(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)。
計(jì)數(shù)脈沖值與頻率的關(guān)系公式如下:
N=Fi
1.008.jpg (773 Bytes, 下載次數(shù): 30)
下載附件
2017-8-13 01:05 上傳
2
1.009.jpg (773 Bytes, 下載次數(shù): 25)
下載附件
2017-8-13 01:05 上傳
Fr
N:計(jì)算值; Fi:內(nèi)部計(jì)時(shí)一次為1us,故其頻率為1MHz;
其計(jì)數(shù)值的求法如下:
T=65536-N=65536-Fi2Fr
例如:設(shè)K=65536,F(xiàn)=1000000=Fi=1MHz,球低音DO(261Hz)。中音DO(523Hz)。高音的DO(1046Hz)的計(jì)算值
T=65536-N=65536-Fi2Fr=65536-10000002Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
低音DO的T=65536-500000/523=64580
低音DO的T=65536-500000/1047=65059
C調(diào)各音符頻率與計(jì)數(shù)值T的對(duì)照表如表2所示。
表2 C調(diào)各音符頻率與計(jì)數(shù)值T的對(duì)照表
3.1.2 節(jié)拍的確定
若要構(gòu)成音樂(lè),光有音調(diào)是不夠的,還需要節(jié)拍,讓音樂(lè)具有旋律(固定的律動(dòng)),而且可以調(diào)節(jié)各個(gè)音的快滿度!肮(jié)拍”,即Beat,簡(jiǎn)單說(shuō)就是打拍子,就像我們聽音樂(lè)不自主的隨之拍手或跺腳。若1拍實(shí)0.5s,則1/4 拍為0.125s。至于1拍多少s,并沒(méi)有嚴(yán)格規(guī)定,就像人的心跳一樣,大部分人的心跳是每分鐘72下,有些人快一點(diǎn),有些人慢一點(diǎn),只要聽的悅耳就好。音持續(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)系。
表3 節(jié)拍與節(jié)拍碼對(duì)照
每個(gè)音符使用1個(gè)字節(jié),字節(jié)的高4位代表音符的高低,低4位代表音符的節(jié)拍,表3為節(jié)拍碼的對(duì)照。如果1拍為0.4秒,1/4拍實(shí)0.1秒,只要設(shè)定延遲時(shí)間就可求得節(jié)拍的時(shí)間。假設(shè)1/4拍為1DELAY,則1拍應(yīng)為4DELAY,以此類推。所以只要求得1/4拍的DELAY時(shí)間,其余的節(jié)拍就是它的倍數(shù),如表4為1/4和1/8節(jié)拍的時(shí)間設(shè)定。
表4 1/4和1/8節(jié)拍的時(shí)間設(shè)定
3.1.3 編碼的確定
do re mi fa so la si分別編碼為1~7,重音do編為8,重音re編為9,停頓編為0。播放長(zhǎng)度以十六分音符為單位(在本程序中為165ms),一拍即四分音符等于4個(gè)十六分音符,編為4,其它的播放時(shí)間以此類推。音調(diào)作為編碼的高4位,而播放時(shí)間作為低4位,如此音調(diào)和節(jié)拍就構(gòu)成了一個(gè)編碼。以0xff作為曲譜的結(jié)束標(biāo)志。
舉例1:音調(diào)do,發(fā)音長(zhǎng)度為兩拍,即二分音符,將其編碼為0x18。
舉例2:音調(diào)re,發(fā)音長(zhǎng)度為半拍,即八分音符,將其編碼為0x22
歌曲播放的設(shè)計(jì)。先將歌曲的簡(jiǎn)譜進(jìn)行編碼,儲(chǔ)存在一個(gè)數(shù)據(jù)類型為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í)。
表5 簡(jiǎn)譜對(duì)應(yīng)的簡(jiǎn)譜碼、T值、節(jié)拍數(shù)
3.2 軟件設(shè)計(jì)思路定時(shí)器初始化后,加載延時(shí)函數(shù)、樂(lè)曲演奏函數(shù)、定時(shí)器中斷函數(shù),按鍵控制主函數(shù)演奏樂(lè)曲。樂(lè)曲演奏函數(shù)控制七首樂(lè)曲演奏,并顯示當(dāng)前曲目序號(hào);按鍵控制切換選擇樂(lè)曲并控制開始、暫停,發(fā)光二極管閃爍。
3.3 主函數(shù)的設(shè)計(jì)主函數(shù)流程圖如圖8所示。
1.010.jpg (16.22 KB, 下載次數(shù): 37)
下載附件
2017-8-13 01:05 上傳
圖8 主函數(shù)流程圖
主函數(shù)程序:
void main()
{
while(key3==1);
led1=0;
led2=1;
InitTimer();
while(1)
{
Musics_Play();
if(key1==0)
{
delay1ms(10);
while(key1==0);
music_value++;
if(music_value>7) music_value=1;
}
if(key2==0)
{
delay1ms(10);
while(key2==0);
music_value--;
if(music_value==0) music_value=7;
}
}
}
3.4定時(shí)器初始函數(shù)的設(shè)計(jì)void InitTimer(void)
{
TMOD=0x01; //定時(shí)器0置于方式一,X=65536-N=
IT0=1;
ET0=1;
EA=1; //打開總中斷
}
3.5延時(shí)函數(shù)的設(shè)計(jì)void delay150ms(void) /*延時(shí)1/4拍時(shí)間即150ms*/
{
unsigned char a,b,c;
for(c=3;c>0;c--)
for(b=80;b>0;b--)
{
if(P3!=0xff) {break;}
for(a=214;a>0;a--);
}
}
3.6樂(lè)曲演奏函數(shù)的設(shè)計(jì)樂(lè)曲演奏函數(shù)流程圖如圖9所示。
1.011.jpg (13.49 KB, 下載次數(shù): 40)
下載附件
2017-8-13 01:05 上傳
圖9 樂(lè)曲演奏流程圖
void Musics_Play()
{
unsigned int j=0,i=0,k=0;
//------------------------音樂(lè)選擇
switch(music_value)
{
case 1 :song=song1;
led3=1;
P0=tab[1];
delay(50);
break;
.
.
.
//---------------------------節(jié)拍音調(diào)讀取
while(*(song+j)!=0xFF&&cycle_flag)
{
beat=*(song+j)&0x0F; //取出節(jié)拍
sound=*(song+j)>>4; //取出音
TH0=tones[2*sound];
TL0=tones[2*sound+1];
TR0=1;
if ((tones[2*sound]==0xFF)&&(tones[2*sound+1]==0xFF)) TR0=0;
for(i=beat;i>0;i--){delay150ms();}
TR0=0;
if(sound>=8) sound=7;
led1=!led1;
led2=!led2;
j++;
k++;
if(k==7) k=0;
}
}
3.7定時(shí)器0中斷函數(shù)的設(shè)計(jì)void Timer0Interrupt(void) interrupt 1
{
TH0=tones[2*sound];
TL0=tones[2*sound+1];
speaker = !speaker;
}
4系統(tǒng)仿真與調(diào)試
4.1 系統(tǒng)軟件程序的調(diào)試
1.012.jpg (38.44 KB, 下載次數(shù): 29)
下載附件
2017-8-13 01:05 上傳
圖10 軟件程序運(yùn)行調(diào)試圖
如圖10所示,0 Error(s),0 Warning(s)。運(yùn)行結(jié)果無(wú)錯(cuò),正常運(yùn)行。
4.2 系統(tǒng)硬件電路的仿真與調(diào)試
1.013.jpg (33.01 KB, 下載次數(shù): 39)
下載附件
2017-8-13 01:05 上傳
圖11 系統(tǒng)硬件電路調(diào)試圖
如圖11所示,最小單片機(jī)系統(tǒng)運(yùn)行正常;驅(qū)動(dòng)蜂鳴器運(yùn)行正常;數(shù)碼管顯示正常;發(fā)光二極管正常閃爍;按鍵控制正常。
1.014.jpg (35.53 KB, 下載次數(shù): 28)
下載附件
2017-8-13 01:05 上傳
圖12 產(chǎn)生方波調(diào)試圖
如圖12所示,單片機(jī)正常產(chǎn)生不同頻率的方波。
5總結(jié)
5.1 本系統(tǒng)的優(yōu)缺點(diǎn)優(yōu)點(diǎn):本系統(tǒng)實(shí)現(xiàn)了:
用定時(shí)器T0方式1來(lái)產(chǎn)生不同頻率的方波、由P1.0輸出驅(qū)動(dòng)喇叭,演奏最少兩段樂(lè)曲、有按鍵切換選擇樂(lè)曲、開始/暫停、有發(fā)光二極管伴隨音頻脈沖閃爍、數(shù)碼管顯示當(dāng)前演奏曲目序號(hào)等功能。
缺點(diǎn):
不能顯示樂(lè)曲名稱,功能較少。
5.2 心得體會(huì)
單片機(jī)的設(shè)計(jì)至今為止已經(jīng)進(jìn)入了令人鼓舞的階段,在進(jìn)行了兩周時(shí)間的摸索與實(shí)驗(yàn),使我不僅僅是掌握單片機(jī)入門軟件與硬件的常用設(shè)計(jì)與功能,同時(shí)也了解對(duì)于一項(xiàng)設(shè)計(jì)研究的制作過(guò)程所需要的詳細(xì)步驟和具體的實(shí)現(xiàn)方法的。
當(dāng)然在這次寶貴的課程設(shè)計(jì)活動(dòng)中,經(jīng)驗(yàn)才是對(duì)于我們最大的收獲,而且還增強(qiáng)了自身對(duì)未知問(wèn)題以及對(duì)知識(shí)的深化認(rèn)識(shí)的能力,用受益匪淺這個(gè)詞語(yǔ)來(lái)概括這次難忘的活動(dòng)我覺(jué)得再合適不過(guò)了。但是,光是完成了作品還是不可以自我滿足的,在從一開始的時(shí)候就懷著將作品制作得更加人性化,更加令人滿意,更加地使功能完美又方便地被應(yīng)用領(lǐng)域這個(gè)最終目的下,隨著對(duì)單片機(jī)這門學(xué)科的認(rèn)識(shí)加深,到達(dá)了拓展的程度,我想這個(gè)目的將在不遠(yuǎn)的時(shí)期內(nèi)被實(shí)現(xiàn)。
總之,這次設(shè)計(jì)從軟件編寫、調(diào)試到軟硬件聯(lián)機(jī)調(diào)試,我傾注了大量的時(shí)間和心血。真是曾經(jīng)為程序的編寫而冥思查找過(guò),曾經(jīng)為無(wú)法找出錯(cuò)誤而郁悶苦惱過(guò),也曾經(jīng)為某一功能不能實(shí)現(xiàn)而猶豫彷徨過(guò),但最終我成功了。
我不僅品味到了結(jié)果的喜悅,更明白了過(guò)程的彌足珍貴。
6參考文獻(xiàn)[1] 李建忠.單片機(jī)原理及應(yīng)用[M],西安電子科技大學(xué)出版社,2008.2.
[2] 黃智偉.全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽系統(tǒng)設(shè)計(jì)[M],北京:北京航空航天大學(xué)出版社,2006.6.
[3] 黃智偉.凌陽(yáng)單片機(jī)課程設(shè)計(jì)指導(dǎo)[M],北京:北京航空航天大學(xué)出版社,2006.11.
[4] 李廣弟,朱月秀,王秀山.單片機(jī)基礎(chǔ)[M],北京:北京航空航天大學(xué)出版社,2001.7.
[5] 趙曙光,郭萬(wàn)有,楊頌華.可編程邏輯器件原理開發(fā)與應(yīng)用[M],西安:西安電子科技大學(xué), 2000.
[6] 候伯亨.VHDL硬件描述語(yǔ)言與數(shù)字邏輯電路設(shè)計(jì)[M], 西安:西安電子科技大學(xué)出版社, 1999.
[7] 康華光. 模擬電子技術(shù)基礎(chǔ)(第四版)[M], 武漢:華中理工大學(xué)出版社,1999.
[8] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)(第二版)[M],北京:清華大學(xué)出版社,1991.
[9] 陳小忠,黃寧. 單片機(jī)接口技術(shù)實(shí)用子程序[M],北京:北京人民郵電出版社, 2005.
[10] 歐偉明,周春臨,瞿遂春.電子信息系統(tǒng)設(shè)計(jì)[M],西安電子科技大學(xué)出版社,2005.9.
[11] 賈立新,王涌.電子系統(tǒng)設(shè)計(jì)與實(shí)踐[M],北京:清華大學(xué)出版社,2007.
[12] 羅亞非.凌陽(yáng)16位單片機(jī)應(yīng)用基礎(chǔ)[M],北京:北京航空航天大學(xué)出版社,2003.
[13] 雷思孝.凌陽(yáng)單片機(jī)原理及實(shí)用技術(shù)[M],西安電子科技大學(xué),2004.
附錄1
單片機(jī)源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- uchar sound,//音
-
- beat,//節(jié)拍
-
- music_value=1;//音樂(lè)值(播放第幾首音樂(lè))
-
- uchar code * data song;
-
- sbit speaker=P1^0;///蜂鳴器
- sbit key1=P3^0;
- sbit key2=P3^1;
- sbit key3=P3^4;
- sbit key4=P3^5;
- sbit led1=P2^0;
- sbit led2=P2^1;
- sbit led3=P2^2;
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
-
-
- bit cycle_flag=1;//循環(huán)標(biāo)志位 1允許循環(huán)
- // 休止符 低6 低7 中1 中2 中3 中4 中5 中6 中7 高1 低3 低5 低4 高3
- uchar code tones[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,0x34,0xFD,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85};
-
- uchar code song1[37]={0xC4,0x12,0x32,0x44,0x42,0x52, //<<祈禱>>
- 0x52,0x44,0x32,0x32,0x12,0x14,
- 0x12,0x12,0x32,0x42,0x54,0x44,
- 0x4F,
- 0xC4,0x12,0x32,0x44,0x42,0x72,
- 0x58,0x42,0x32,0x34,
- 0x14,0x12,0x32,0x34,0x32,0x12,
- 0x1F,
- 0xFF};
- uchar code song2[46]={0x12,0x52,0x52,0x52,0x56,0x42, //<<蘭花草>>
- 0x32,0x42,0x32,0x22,0x18,
- 0x82,0x82,0x82,0x82,0x86,0x72,
- 0xB2,0x72,0x72,0x62,0x58,
- 0x52,0x82,0x82,0x72,0x56,0x42,
- 0x32,0x42,0x32,0x22,0x16,0xB2,
- 0xB2,0x32,0x32,0x22,0x16,0x52,
- 0x42,0x32,0x22,0xC2,0x88,
- 0xFF};
- uchar code song3[131]={0x52,0x42, //<<兩只蝴蝶>>
- 0x58,0x02,0x42,0x52,0x42,
- 0x38,0x04,0x12,0x32,
- 0x44,0x42,0x52,0x42,0x32,0x12,0x12,
- 0xC8,0x04,0x52,0x42,
- 0x58,0x02,0x42,0x52,0x42,
- 0x38,0x04,0x12,0x32,
- 0x44,0x42,0x52,0x42,0x32,0x12,0x32,
- 0x48,0x04,0x52,0x42,
- 0x58,0x02,0x42,0x52,0x42,
- 0x38,0x04,0x12,0x32,
- 0x44,0x42,0x52,0x42,0x32,0x12,0x11,0x31,
- 0xC8,0x04,0x52,0x72,
- 0x78,0x02,0x72,0x82,0x72,
- 0x58,0x04,0x42,0x42,
- 0x44,0x42,0x52,0x42,0x32,0x12,0x12,
- 0x32,0x32,0x3C,
- 0x09,0x72,0x72,0x82,
- 0xA2,0x92,0x92,0x82,0x52,0x42,0x42,0x42,
- 0x58,0x02,0x52,0x52,0x72,
- 0x84,0x84,0x02,0x12,0x52,0x42,
- 0x48,0x04,0x52,0x72,
- 0x72,0x52,0x74,0x02,0xA4,0x92,
- 0x82,0x92,0x54,0x02,0x82,0x82,0x92,
- 0x82,0x72,0x52,0x42,0x02,0xC4,0x12,
- 0x3C,
- 0xFF};
- uchar code song4[37]={0xC4,0x12,0x32,0x44,0x42,0x52, //<<祈禱>>
- 0x52,0x44,0x32,0x32,0x12,0x14,
- 0x12,0x12,0x32,0x42,0x54,0x44,
- 0x4F,
- 0xC4,0x12,0x32,0x44,0x42,0x72,
- 0x58,0x42,0x32,0x34,
- 0x14,0x12,0x32,0x34,0x32,0x12,
- 0x1F,
- 0xFF};
- uchar code song5[144]={0x52,0x62, //<<陽(yáng)光總在風(fēng)雨后>>
- 0x74,0x74,0x74,0x34,
- 0x42,0x34,0x52,0x56,0x42,
- 0x34,0x34,0x14,0x32,0x12,
- 0x12,0xC2,0xC4,0x04,0x52,0x62,
- 0x74,0x74,0x74,0x34,
- 0x42,0x34,0x52,0x56,0x42,
- 0x34,0x32,0x12,0x12,0x34,0x42,
- 0x4C,0x52,0x42,
- 0x34,0x32,0x42,0x32,0x12,0x12,0xC2,
- 0xC2,0x54,0x52,0x54,0x52,0x52,
- 0x42,0x32,0x32,0x12,0x32,0x42,0x32,0x52,
- 0x5C,0x52,0x42,
- 0x34,0x32,0x42,0x32,0x12,0x12,0xC2,
- 0xC2,0x54,0x52,0x54,0x02,0x52,
- 0x52,0x42,0x32,0x12,0x32,0x84,0x72,
- 0x7F,
- 0x0F,
- 0x74,0x72,0x52,0x54,0x74,
- 0x82,0x52,0x52,0x72,0x78,
- 0x34,0x32,0x32,0x42,0x54,0x72,
- 0x7F,
- 0x86,0x82,0x72,0x52,0x54,
- 0x72,0x84,0x32,0x36,0x52,
- 0x42,0x52,0x42,0x32,0x34,0x12,0x32,
- 0x32,0x42,0x4C,
- 0x86,0x82,0x72,0x52,0x54,
- 0x72,0x84,0x52,0x56,0x52,
- 0x42,0x52,0x72,0x82,0x52,0x34,0x12,
- 0x12,0x32,0x3C,
- 0xFF};
- uchar code song6[77]={0xC2,0xC2,0x34,0x42,0x42, //<<一生有你>>
- 0x52,0x41,0x51,0x5C,
- 0x04,0xC2,0xC2,0x34,0x42,0x42,
- 0x52,0x31,0x41,0x4C,
- 0x04,0xC2,0xC2,0x34,0x42,0x42,
- 0x52,0x41,0x51,0x58,0x32,0x52,
- 0x4C,0x42,0x32,
- 0x34,0x32,0x42,0x48,
- 0x04,0xC2,0xC2,0x34,0x42,0x42,
- 0x72,0x41,0x51,0x5C,
- 0x04,0xC2,0xC2,0x32,0x32,0x42,0x42,
- 0x52,0x42,0x4C,
- 0x04,0xC2,0xC2,0x34,0x42,0x42,
- 0x52,0x41,0x51,0x58,0x32,0x52,
- 0x4C,0x42,0x32,
- 0x32,0x42,0x4C,
- 0xFF};
- uchar code song7[]={0XC2,0XB2, //<<喜歡你>>
- 0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
- 0XC6,0X12,0XC4,0X12,0XC2,
- 0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
- 0X4C,0X42,0X32,
- 0X74,0X82,0X74,0X82,0X72,
- 0X52,0X41,0X38,0X32,0X42,
- 0X16,0XC2,0X72,0X52,0X42,0X42,
- 0X3C,0XC2,0XB2,
- 0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
- 0XC6,0X12,0XC4,0X12,0XC2,
- 0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
- 0X4C,0X42,0X32,
- 0X76,0X82,0X74,0X82,0X72,
- 0X53,0X41,0X38,0X32,0X42,
- 0X16,0XC2,0X72,0X52,0X41,0X51,0X12,
- 0XCC,0XC2,0XB2,
- 0X16,0XC2,0X72,0X52,0X42,0X42,
- 0X3C,0X32,0X32,
- 0X26,0X22,0X24,0X42,0X32,
- 0x22,0x12,0x18,0x02,0x52,
- 0X46,0X12,0X44,0X72,0X82,
- 0X5C,0X52,0X52,
- 0X46,0X42,0X74,0X42,0X32,
- 0X36,0X42,0X58,
- 0X82,0X72,0X62,0X52,0X46,0X32,
- 0X3C,0X12,0XB2,
- 0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
- 0XC6,0X12,0XC4,0X12,0XC2,
- 0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
- 0X48,0X02,0X42,0X52,0X62,
- 0X76,0X82,0X74,0X82,0X72,
- 0X56,0X41,0X38,0X32,0X22,
- 0X16,0XC2,0X72,0X52,0X42,0X42,
- 0X3C,0X04,0X04,0X04,0X04,
- 0xFF};
-
-
-
- void delay150ms(void) /*延時(shí)1/4拍時(shí)間即150ms*/
- {
- unsigned char a,b,c;
-
- for(c=3;c>0;c--)
- for(b=80;b>0;b--)
- {
- if(P3!=0xff) {break;}
- for(a=214;a>0;a--);
- }
-
- }
-
- /**************************************
-
- *名稱: InitTimer(void)
-
- *功能:定時(shí)器初始化函數(shù)
-
- ***************************************/
- void InitTimer(void)
- {
- TMOD=0x01; //定時(shí)器0置于方式一
-
- IT0=1;
-
- ET0=1;
-
- EA=1; //打開總中斷
-
- }
- /**************************************
-
- *名稱:Music_Play()
-
- *功能:樂(lè)曲演奏函數(shù)
-
- ***************************************/
- void delay(uint i)
- {
- uchar j;
- for(i;i>0;i--)
- for(j=115;j>0;j--);
- }
-
- void Musics_Play()
- {
- unsigned int j=0,i=0,k=0;
- //------------------------音樂(lè)選擇
- switch(music_value)
- {
- case 1 :song=song1;
- led3=1;
- P0=tab[1];
- delay(50);
- break;
- case 2 :song=song2;
- led3=1;
- P0=tab[2];
- delay(50);
- break;
- case 3 :song=song3;
- led3=1;
- P0=tab[3];
- delay(50);
- break;
- case 4 :song=song4;
- led3=1;
- P0=tab[4];
- delay(50);
- break;
- case 5 :song=song5;
- led3=1;
- P0=tab[5];
- delay(50);
- break;
- case 6 :song=song6;
- led3=1;
- P0=tab[6];
- delay(50);
- break;
- case 7 :song=song7;
- led3=1;
- P0=tab[7];
- delay(50);
- break;
- }
- //---------------------------節(jié)拍音調(diào)讀取
-
- while(*(song+j)!=0xFF&&cycle_flag)
- {
- beat=*(song+j)&0x0F; //取出節(jié)拍
- sound=*(song+j)>>4; //取出音
- TH0=tones[2*sound];
- TL0=tones[2*sound+1];
- TR0=1;
- if ((tones[2*sound]==0xFF)&&(tones[2*sound+1]==0xFF)) TR0=0;
- for(i=beat;i>0;i--){delay150ms();}
- TR0=0;
- if(sound>=8) sound=7;
- led1=!led1;
- led2=!led2;
- j++;
- k++;
- if(k==7) k=0;
- }
- }
- void delay1ms(int t) //1ms延時(shí)函數(shù)
- {
- int i,j;
- for (i=0;i<t;i++)
- for(j=0;j<120;j++);
- }
- void main()
- {
- while(key3==1);
- led1=0;
- led2=1;
- InitTimer();
- while(1)
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
233256uajyeb47fali5445.png (56.83 KB, 下載次數(shù): 40)
下載附件
2017-8-13 01:05 上傳
所有資料51hei提供下載: