基于51單片機(jī)的音樂(lè)盒設(shè)計(jì)_第1頁(yè)
基于51單片機(jī)的音樂(lè)盒設(shè)計(jì)_第2頁(yè)
基于51單片機(jī)的音樂(lè)盒設(shè)計(jì)_第3頁(yè)
基于51單片機(jī)的音樂(lè)盒設(shè)計(jì)_第4頁(yè)
基于51單片機(jī)的音樂(lè)盒設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、基于51單片機(jī)的音樂(lè)盒設(shè)計(jì)成績(jī)課程設(shè)計(jì),嵌入式系統(tǒng)應(yīng)用題目名稱,基于51單片機(jī)的音樂(lè)盒設(shè)計(jì)1 設(shè)計(jì)的任務(wù),包含設(shè)計(jì)的內(nèi)容和設(shè)計(jì)的目標(biāo),設(shè)計(jì)內(nèi)容:本設(shè)計(jì)是一個(gè)基于AT89C52K列單片機(jī)的音樂(lè)盒,依據(jù)單片機(jī)技術(shù)原理,通過(guò)硬件電路制作以及軟件編譯,設(shè)計(jì)制作出一個(gè)多功能多功能音樂(lè)盒。該音樂(lè)盒主要由按鍵電路、復(fù)位電路、時(shí)鐘電路以及蜂鳴器和點(diǎn)陣組成。使用按鍵控制音樂(lè)盒,三個(gè)用來(lái)切換歌曲,一個(gè)用來(lái)暫停音樂(lè)和開(kāi)啟LED點(diǎn)陣,一個(gè)用來(lái)從暫停位置開(kāi)始播放音樂(lè)。本音樂(lè)盒共有三首歌曲,點(diǎn)陣式樣有四種。播放歌曲時(shí),蜂鳴器發(fā)出某個(gè)音調(diào)。本設(shè)計(jì)利用KEIL編程軟件對(duì)音樂(lè)盒源程序進(jìn)行編程并調(diào)試。設(shè)計(jì)目標(biāo):初始:點(diǎn)陣顯示作者

2、信息;按鍵1:播放歌曲1;按鍵2:播放歌曲2;按鍵3:播放歌曲3;按鍵A:暫停播放,點(diǎn)陣顯示當(dāng)前歌曲的名字;按鍵B:從暫停位置繼續(xù)播放。2 設(shè)計(jì)的過(guò)程2.1 基本結(jié)構(gòu)1、總體設(shè)計(jì)框圖按鍵輸入蜂鳴器AT89C52單片機(jī)晶振復(fù)位電路點(diǎn)陣2、AT89C5價(jià)紹AT89S52g一種低功耗、高性能CMOS的微控制器,具有8K在系統(tǒng)可編程Flash存儲(chǔ)器。使用Atmel公司高密度非易失性存儲(chǔ)技術(shù)制造,與工業(yè)器80C51產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8位CPU和在系統(tǒng)可編程Flash,使得AT89S52在眾多嵌入式控制應(yīng)用系統(tǒng)中得到廣

3、泛應(yīng)用。AT89S52M有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM32位I/O口線,看門狗定時(shí)器,2個(gè)數(shù)據(jù)指針,三個(gè)16位定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工用行口,片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52可降至0Hz靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RA岫容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。P0口:P0口是一個(gè)8位漏極開(kāi)路的雙向I/O口。作為輸出口,每位能驅(qū)動(dòng)8個(gè)TTL邏輯電平。對(duì)P0端口寫(xiě)“1”時(shí),引腳用作高阻抗輸入。當(dāng)訪問(wèn)外部程序和數(shù)

4、據(jù)存儲(chǔ)器時(shí),P0口也被作為低8位地址/數(shù)據(jù)復(fù)用。在這種模式下,P0不具有內(nèi)部上拉電阻。在flash時(shí),編程P0口也用來(lái)接收指令字節(jié);在程序校驗(yàn)時(shí),輸出指令字節(jié)。程序校驗(yàn)時(shí),需要外部上拉電阻。P1口:P1口是一個(gè)具有內(nèi)部上拉電阻的8位雙向I/O口,p1輸出緩沖器能驅(qū)動(dòng)4個(gè)TTL邏輯電平。對(duì)P1端口寫(xiě)“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)o止匕外,P1.0和P1.1分別作定時(shí)器/計(jì)數(shù)器2的外部計(jì)數(shù)輸入(P1.0/T2)和定時(shí)器/計(jì)數(shù)器2的觸發(fā)輸入(P1.1/T2EX)。在flash編程和校驗(yàn)時(shí),P1口接收低

5、8位地址字節(jié)。引腳號(hào)第二功能:P1.0 T2(定時(shí)器/計(jì)數(shù)器T2的外部計(jì)數(shù)輸入),時(shí)鐘輸出e i,£:工產(chǎn)1TSfiiFI二,二匚3FED#33«-r3Ff:5CbpcmXn*£;,» 3吒工卡崎PC£nN二F二3年小廿ll&i*C:”?AHspnai二山二二Z!P1.1T2EX(定時(shí)器/計(jì)數(shù)器T2的捕捉/重載觸發(fā)信號(hào)和方向控制)P1.5MOSI(在系統(tǒng)編程用)P1.6MISO(在系統(tǒng)編程用)P1.7SCK(在系統(tǒng)編程用)P2口:P2口是一個(gè)具有內(nèi)部上拉電阻的8位雙向I/O口,P2輸出緩沖器能驅(qū)動(dòng)4個(gè)TTL邏輯電平。對(duì)P2端口寫(xiě)“1”時(shí)

6、,內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。在訪問(wèn)外部程序存儲(chǔ)器或用16位地址讀取外部數(shù)據(jù)存儲(chǔ)器(例如執(zhí)行MOVXDPTR),P2口送出高八位地址。在這種應(yīng)用中,P2口使用很強(qiáng)的內(nèi)部上拉發(fā)送1。在使用8位地址(如MOVXRI)問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),P2口輸出P2鎖存器的內(nèi)容。在flash編程和校驗(yàn)時(shí),P2口也接收高8位地址字節(jié)和一些控制信號(hào)。P3口:P3口是一個(gè)具有內(nèi)部上拉電阻的8位雙向I/O口,p3輸出緩沖器能驅(qū)動(dòng)4個(gè)TTL邏輯電平。對(duì)P3端口寫(xiě)“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用

7、時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。P3口亦作為AT89S52W殊功能(第二功能)使用,如下表所示。在flash編程和校驗(yàn)時(shí),P3口也接收一些控制信號(hào)。引腳第二功能:P3.0RXD(串行輸入口)P3.1TXD(串行輸出口)P3.2INTO(外中斷0)P3.3INT1(外中斷1)P3.4TO(定時(shí)/計(jì)數(shù)器0)P3.5T1(定時(shí)/計(jì)數(shù)器1)P3.6WR(外部數(shù)據(jù)存儲(chǔ)器寫(xiě)選通)P3.7RD(外部數(shù)據(jù)存儲(chǔ)器讀選通)止匕外,P3口還接收一些用于FLAS幽存編程和程序校驗(yàn)的控制信號(hào)。RST:復(fù)位輸入。當(dāng)振蕩器工作時(shí),RSHI腳出現(xiàn)兩個(gè)機(jī)器周期以上高電平將是單片機(jī)復(fù)位。ALE/PR

8、OGS訪問(wèn)外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時(shí)鐘振蕩頻率的1/6輸出固定的脈沖信號(hào),因此它可對(duì)外輸出時(shí)鐘或用于定時(shí)目的。要注意的是:每當(dāng)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí)將跳過(guò)一個(gè)ALE脈沖。對(duì)FLASH#儲(chǔ)器編程期間,該引腳還用于輸入編程脈沖(PROG)如有必要,可通過(guò)對(duì)特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX口MOV鑿令才能將ALE激活。止匕外,該引腳會(huì)被微弱拉高,單片機(jī)執(zhí)行外部程序時(shí),應(yīng)設(shè)置ALE禁止位無(wú)效。PSEN程序儲(chǔ)存允許(PSEN)t出是外部程序存儲(chǔ)器的讀選通信

9、號(hào),當(dāng)AT89S52由外部程序存儲(chǔ)器取指令(或數(shù)據(jù))時(shí),每個(gè)機(jī)器周期兩次PSENt效,即輸出兩個(gè)脈沖,在此期間,當(dāng)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器,將跳過(guò)兩次PSENB號(hào)。EA/VPP:外部訪問(wèn)允許,欲使CPUR訪問(wèn)外部程序存儲(chǔ)器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復(fù)位時(shí)內(nèi)部會(huì)鎖存EA端狀態(tài)。如EA端為高電平(接Vcc端),CPUTCJ執(zhí)行內(nèi)部程序存儲(chǔ)器的指令。FLASHY儲(chǔ)器編程時(shí),該引腳加上+12V的編程允許電源Vpp,當(dāng)然這必須是該器件是使用12V編程電壓Vpp。XTAL1:振蕩器反相放大器和內(nèi)部時(shí)鐘發(fā)生電路的輸入端。XTAL2:振蕩器反

10、相放大器的輸出端。2.2 軟件設(shè)計(jì)過(guò)程包含軟件設(shè)計(jì)思路,如果使用中斷,說(shuō)明中斷類型等在本程序中設(shè)置了兩個(gè)標(biāo)志count和jy_count,分別初始化為0和0。按鍵1、2、3、A使得count在0和、1、2、3之間切換,jy_count記錄歌曲的狀態(tài),能在暫停時(shí)播放歌曲的名字,同時(shí)在按鍵B返回時(shí)能知道count的值。程序檢測(cè)count的值,count等于1時(shí)播放第一首歌曲,等于2時(shí)播放第二首,等于3時(shí)播放第三首。另一方面根據(jù)jy_count的值來(lái)控制點(diǎn)陣顯示歌曲名。1、音調(diào)、節(jié)拍以及編碼的確定方法一般說(shuō)來(lái),單片機(jī)演奏音樂(lè)基本都是單音頻率,它不包含相應(yīng)幅度的諧波頻率,也就是說(shuō)不能像電子琴那樣能奏出

11、多種音色的聲音。因此單片機(jī)奏樂(lè)只需弄清楚兩個(gè)概念即可,也就是“音調(diào)”和節(jié)拍表示一個(gè)音符唱多長(zhǎng)的時(shí)間。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、DE、F、GA、B這一組音的距離分成12個(gè)等份,每一個(gè)等份叫一個(gè)“半音”。兩個(gè)音之間的距離有兩個(gè)“半音”,就叫“全音”。在鋼琴等鍵盤樂(lè)器上,C-DD-E、F-GG-A、A-B兩音之間隔著一個(gè)黑鍵,他們之間的距離就是全音

12、;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頻率(266Hz)的一倍;同樣的,高音RE的頻率(1175Hz)剛好是中音RE的頻率(587Hz)的一倍,中音RE的頻率(587Hz)剛好是低音RE頻率(294Hz)的一倍。1)要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),然后將此周期

13、除以2,即為半周期的時(shí)間。利用定時(shí)器計(jì)時(shí)這半個(gè)周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸出脈沖的I/O反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O反相,就可在I/O腳上得到此頻率的脈沖。2)利用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)的停頓效果3)例如頻率為523Hz,其周期T=1/523=1912us,因此只要令計(jì)數(shù)器計(jì)時(shí)956us/1us=956,在每次技術(shù)956次時(shí)將I/O反相,就可得到中音DO(523Hz)。計(jì)數(shù)脈沖值與頻率

14、的關(guān)系公式如下:,N=Fi2FrN:計(jì)算值;Fi:內(nèi)部計(jì)時(shí)一次為1us,故其頻率為1MHz;4) 其計(jì)數(shù)值的求法如下:,T=65536-N=65536-Fi2Fr例如:設(shè)K=65536,F=1000000=Fi=1MHz球低音DO(261Hz>中音DO(523Hz>高音的DO(1046Hz)l勺計(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

15、5) C調(diào)各音符頻率與計(jì)數(shù)值T的對(duì)照表如表4.1所示。表4.1C調(diào)各音符頻率與計(jì)數(shù)值T的對(duì)照表低音頻率T參數(shù)中音頻率T參數(shù)高音頻率T參數(shù)Do2621908229Do523956115Do10465757Do2771805217Do554903108Do11095454,Re2941701204Re587852102Re11755151Re3111608193Re62280497Re12454848,Mi3301515182Mi65975991Mi13184545Fa3491433172Fa69871686Fa13974343Fa,3701351162Fa,74067681Fa,14804141

16、So3921276153So78463877So15683838So,4151205145So,83160272So,16613636La4401136136La88056868La17603434La,4641078129La,93253664La,18653232Si4941012121Si98850661Si197630301.2節(jié)拍的確定,光有音調(diào)是不夠的,還需要節(jié)拍,讓音樂(lè)具有旋律(固定若要構(gòu)成音樂(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ī)

17、定,就像人的心跳一樣,大部分人的心跳是每分鐘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.2節(jié)拍與節(jié)拍碼對(duì)照節(jié)拍碼節(jié)拍數(shù)節(jié)拍碼節(jié)拍數(shù)1 1/4拍11/8拍2 2/4拍2

18、1/4拍33/4拍33/8拍41拍42/1拍51又1/4拍55/8拍61又1/2拍63/4拍82拍81拍A2又1/2拍A1又1/4拍C3拍C1又1/2拍F3又3/4拍每個(gè)音符使用1個(gè)字節(jié),字節(jié)的高4位代表音符的高低,低4位代表音符的節(jié)拍,圖5.2為節(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寸問(wèn),其余的節(jié)拍就是它的倍數(shù),如圖5.3為1/4和1/8節(jié)拍的時(shí)間設(shè)定。表4.31/4和1/8節(jié)拍的時(shí)間設(shè)定曲調(diào)值DELAY曲調(diào)值DELAY調(diào)4/4125毫秒調(diào)4/462毫

19、秒調(diào)3/4187毫秒調(diào)3/494毫秒調(diào)2/4250毫秒調(diào)2/4125毫秒1.3編碼doremifasolasi分別編碼為17,重音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ù)類型為unsigne

20、dchar的數(shù)組中。程序從數(shù)組中取出一個(gè)數(shù),然后分離出高4位得到音調(diào),接著找出相應(yīng)的值賦給定時(shí)器0,使之定時(shí)操作蜂鳴器,得出相應(yīng)的音調(diào);接著分離出該數(shù)的低4位,得到延時(shí)時(shí)間,接著調(diào)用軟件延時(shí)。表4.4簡(jiǎn)譜對(duì)應(yīng)的簡(jiǎn)譜碼、T值、節(jié)拍數(shù)簡(jiǎn)譜發(fā)音簡(jiǎn)譜碼T值節(jié)拍碼節(jié)拍數(shù)5 低音SO16426011/4拍6 低音LA26440022/4拍7 低音TI36452433/4拍1 中音DO46458041拍2 中音RE56468451又1/4拍3 中音MI66477761又1/2拍4 中音FA76482082拍5 中音SO864898A2又1/2拍6 中音LA964968C3拍7 中音TIA65030F3又3/

21、4拍1 高音DOB650582 高音REC651103 高音MID651574 高音FAE651785 高音SOF652172、中斷使用情況C52系列有3個(gè)定時(shí)/計(jì)數(shù)器(T0、T1、T2),通過(guò)編程設(shè)置,每個(gè)定時(shí)器/計(jì)數(shù)器可以根據(jù)系統(tǒng)時(shí)鐘實(shí)現(xiàn)定時(shí),也可以對(duì)外部信號(hào)計(jì)數(shù)。每個(gè)定時(shí)器/計(jì)數(shù)器都有多種工作方式(方式選才¥TMOD)每個(gè)定時(shí)器/計(jì)數(shù)器都會(huì)在預(yù)設(shè)定時(shí)計(jì)數(shù)(TL0,TH1)時(shí)間到時(shí)產(chǎn)生溢出,通過(guò)中斷方式(中斷允許一一EAET0)處理。(1) 中斷初始化EA=1;/開(kāi)總中斷TMOD=0x01;/定時(shí)器0工作在方式1TH0=0;/初值為0TL0=0;/初值為0ET0=1;(2) 中斷

22、函數(shù)voidtimer0()interrupt1/用于產(chǎn)生各種音調(diào)TH0=timeh;TL0=timel;fm=fm;2.3程序流圖及說(shuō)明如果包含多個(gè)函數(shù),分別給出流程(具體到如何操作、賦值),通過(guò)文字對(duì)流程圖以及函數(shù)功能進(jìn)行說(shuō)明(1)song()函數(shù)voidsong()uinttemp;ucharjp;/jp是簡(jiǎn)譜while(1)if(count=0)while(1)if(count=0)TR0=0;fm=1;if(jy_count=0)display_school();elseif(jy_count=1)display_mlh();elseif(jy_count=2)display_jms

23、zl();elseif(jy_count=3)display_qnzl();if(count=1)/選曲temp=mlhi;if(count=2)temp=jmszli;if(count=3)temp=qnzli;if(temp=0xff)break;jp=temp/16;/取數(shù)的高4位if(jp!=0)timeh=cuzhijp*2;timel=cuzhijp*2+1;elseTR0=0;fm=1;/關(guān)蜂鳴器delay(temp%16);/取數(shù)的低4位TR0=0;/唱完一個(gè)音停10MSfm=1;delay1(10);TR0=1;i+;keyscan();TR0=0;fm=1;標(biāo)題Song()

24、函數(shù)開(kāi)始Uinttemp;Ucharjp;否否否count=0count=1cunt=2count=3是TR0=0;temp=mlhi;temp=jmszli;temp=qnzli;fm=1;否否否jy_coumt=0jy_count=1jy_count=2jy_count=2是temp=0xff是是是是display_school();display_mlh();display_jmszl();display_qnzl();否jp=temp/16結(jié)束否jp=0?是TR0=0;timeh=cuzhijp*2;timel=cuzhijp*2+1;fm=1;/關(guān)蜂鳴器delay(temp%16);

25、TR0=0;fm=1;delay1(10);TR0=1;i+;keyscan();(2)keyscan()函數(shù)voidkeyscan()uintsw;P1=0xfe;sw=P1;if(sw=0xee)delay1(5);if(sw=0xee);count=1;i=0;while(1)i=0;song();keyscan();if(sw=0xde)delay1(5);if(sw=0xde)count=2;i=0;while(1)i=0;song();keyscan();if(sw=0xbe)delay1(5);if(sw=0xbe)count=3;i=0;while(1)i=0;song();k

26、eyscan();if(sw=0x7e)delay(5);if(sw=0x7e)jy_count=count;count=0;while(1)song();keyscan();P1=0xfd;sw=P1;if(sw=0x7d)delay(5);if(sw=0x7d)count=jy_count;while(1)song();keyscan();開(kāi)始UintSw;P1=0xfe;Sw=P1否否P1=0xfd;否否Sw=0xeeSw=0xdeSw=0xbeSw=0x7eSw=P1;旦旦旦旦是是是是delay(5)delay(5)delay(5)Sw=0x7ddelay(5)是delay(5)Sw=

27、0xeeSw=0xdeSw=0xbeSw=0x7e旦旦旦旦旦是是是是是jy_count=coucount=1;count=2;count=3;Sw=0x7dnt;i=0;i=0;i=0;count=0;i=0;i=0;i=0;count=jy_cousong();song();song();song();nt;keyscan();keyscan();keyscan();keyscan();song();keyscan();(3) 主函數(shù)main()EA=1;/開(kāi)總中斷TMOD=0x01;/定時(shí)器0工作在方式1TH0=0;TL0=0;ET0=1;while(1)keyscan();song();

28、/delay1(1000);開(kāi)始EA=1;/開(kāi)總中斷TMOD=0x01;/癥時(shí)器0工作在方式1TH0=0;TL0=0;ET0=1;keyscan();song();3運(yùn)行結(jié)果或者測(cè)試結(jié)果運(yùn)行結(jié)果:(1) 程序下載到單片機(jī)后,點(diǎn)陣即顯示作者信息;(2) 按鍵1:播放歌曲1;(3) 按鍵2:播放歌曲2;(4) 按鍵3:播放歌曲3;(5) 按鍵A:暫停播放歌曲,同時(shí)點(diǎn)陣顯示當(dāng)前正在播放歌曲名(6)按鍵B:從暫停位置重新播放歌曲;4遇到的問(wèn)題及解決的方法(1)問(wèn)題:插空太小,排陣插不進(jìn)去。解決方法:把排陣折斷,一個(gè)一個(gè)裝。(2)問(wèn)題:蜂鳴器怎么發(fā)出音樂(lè),解決辦法:通過(guò)查閱資料我們得知:一般說(shuō)來(lái),單片機(jī)

29、演奏音樂(lè)基本都是單音頻率,它不包含相應(yīng)幅度的諧波頻率,也就是說(shuō)不能像電子琴那樣能奏出多種音色的聲音(只有一種音色)。因此單片機(jī)奏樂(lè)只需弄清楚兩個(gè)概念即可,也就是“音調(diào)”和節(jié)拍表示一個(gè)音符唱多長(zhǎng)的時(shí)間。(3)問(wèn)題:暫停時(shí)count已置0,怎么在點(diǎn)陣中顯示當(dāng)前播放歌曲名,解決辦法:設(shè)置變量jy_count來(lái)記錄count的值,通過(guò)判斷jy_count的值來(lái)判定播放的歌曲。(4)問(wèn)題:暫停后重新播放怎么從暫停位置繼續(xù)播放解決辦法:在暫停時(shí),記錄歌曲位置的i值不置0,在重新播放時(shí)i值不變,即可就在暫停位置繼續(xù)播放。(5)問(wèn)題:當(dāng)程序超過(guò)一定時(shí)便編譯不通過(guò)。解決辦法:由于點(diǎn)陣的漢字、歌曲的歌譜等暫用較大

30、存儲(chǔ)空間,造成程序較大,而軟件限制程序的大小,我們刪除了部分功能。5總結(jié)代碼:1.h#defineucharunsignedchar#defineuintunsignedintucharcodeqnzl=/千年之戀0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x2

31、2,0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA

32、3,0x73,0x62,0x53,0x42,0x63,0x83,0x83,0x91,0x91,0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff/結(jié)束標(biāo)志;ucharcodejmszl=/寂寞沙洲冷0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,0x21,0x31,0x51,0x52,0

33、x31,0x52,0x61,0x15,0x14,0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,0x32,0

34、x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,0x31,0x81,0x81,0x81,0x61,0x91,0x82,0x51,0x51,0x51,0x51,0x31,0x61,0x53,0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,0x31,0x31,0x81,0

35、x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,0xff;ucharcodemlh=/茉莉花0x34,0x34,0x54,0x62,0x82,0x84,0x64,0x54,0x52,0x62,0x54,0x34,0x34,0x54,0x62,0x82,0x84,0x64,0x54,0x52,0x62,0x54,0x54,0x54

36、,0x54,0x32,0x52,0x64,0x64,0x64,0x54,0x34,0x34,0x22,0x32,0x54,0x32,0x22,0x14,0x12,0x22,0x14,0x32,0x22,0x12,0x32,0x22,0x32,0x54,0x62,0x82,0x54,0x24,0x32,0x52,0x22,0x32,0x12,0x62,0x54,0x64,0x14,0x22,0x32,0x12,0x22,0x12,0x62,0x54,0x04,0xff;/簡(jiǎn)譜音調(diào)對(duì)應(yīng)的定時(shí)器初值/適合11.0592M的晶振ucharcodecuzhi=0xff,0xff,/占位0xFC,0x8E

37、,/中央C調(diào)1-70xFC,0xED,0xFD,0x43,0xFD,0x6A,0xFD,0xB3,0xFD,0xF3,0xFE,0x2D,0xFE,0x47,/高八度1-70xFE,0x76,0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16;2.hcodeunsignedcharcheng32=/程0x08,0x04,0x1D,0xFE,0xF1,0x04,0x11,0x04,0x11,0x04,0xFF,0x04,0x11,0x0FC,0x38,0x00,0x37,0xFE,0x54,0x20,0x50,0x28,0x91,0xFC,0x10

38、,0x20,0x10,0x24,0x17,0x0FE,0x10,0x00,;codeunsignedcharjing32=/晶0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x24,0x7E,0xFE,0x42,0x84,0x42,0x84,0x7E,0xFC,0x42,0x84,0x42,0x84,0x7E,0xFC,0x42,0x84,;codeunsignedcharqian32=/千0x00,0x20,0x00,0xF0,0x3F,0x00,0x01,0x00,0x01,0x00,0

39、x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,;codeunsignedcharnian32=/年0x08,0x00,0x08,0x08,0x1F,0xFC,0x11,0x00,0x21,0x00,0x41,0x10,0x1F,0xF8,0x11,0x00,0x11,0x00,0x11,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,;code

40、unsignedcharzhi32=/之0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x7F,0xF8,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x48,0x06,0x07,0xFC,0x00,0x00,;codeunsignedcharlian32=/戀0x02,0x00,0x01,0x04,0xFF,0xFE,0x04,0x40,0x0C,0x60,0x0C,0x58,0x14,0x4C,0x24,0x44,0x44,0x40,0x02

41、,0x00,0x29,0x10,0x29,0x28,0x28,0x24,0x48,0x24,0x07,0xE0,0x00,0x00,;codeunsignedcharji_232=/寂0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x88,0x04,0x0E,0xF8,0x08,0x08,0x08,0x88,0xFF,0x88,0x08,0x50,0x2C,0x50,0x2B,0x20,0x49,0x20,0x88,0x50,0x28,0x8E,0x13,0x04,;codeunsignedcharmo32=/寞0x01,0x00,0x7F,0xFE,0x44

42、,0x42,0x84,0x54,0x3F,0xF8,0x04,0x40,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x01,0x04,0xFF,0xFE,0x02,0x80,0x0C,0x60,0x30,0x1C,;codeunsignedcharsha32=/沙0x00,0x40,0x20,0x40,0x18,0x40,0x08,0x40,0x81,0x50,0x61,0x48,0x22,0x46,0x0A,0x42,0x14,0x48,0x20,0x48,0xE0,0x50,0x20,0x20,0x20,0x40,0x20,0x80

43、,0x23,0x00,0x2C,0x00,;codeunsignedcharzhou32=/洲0x01,0x04,0x41,0x04,0x31,0x24,0x11,0x24,0x81,0x24,0x65,0xB4,0x23,0x6C,0x0B,0x6C,0x11,0x24,0x21,0x24,0xE1,0x24,0x21,0x24,0x22,0x24,0x22,0x24,0x24,0x04,0x20,0x04,;codeunsignedcharleng32=/冷0x00,0x80,0x40,0x80,0x31,0x40,0x12,0x20,0x04,0x10,0x09,0x08,0x10,0x

44、8E,0x10,0x84,0x27,0xF0,0xE0,0x10,0x20,0x20,0x20,0x40,0x22,0x80,0x21,0x00,0x20,0xC0,0x00,0x40,;codeunsignedcharmo_232=/mo0x04,0x40,0x04,0x44,0xFF,0xFE,0x05,0x40,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x08,0x7F,0xFC,0x03,0x80,0x05,0x40,0x09,0x30,0x31,0x0E,0xC1,0x04,0x01,0x00,0x01,0x00,;codeunsignedcharli3

45、2=/0x08,0x20,0x08,0x24,0xFF,0xFE,0x08,0x20,0x06,0x08,0x78,0x48,0x08,0x48,0x08,0x48,0xFF,0x48,0x08,0x48,0x1C,0x48,0x1A,0x48,0x2A,0x48,0x48,0x08,0x88,0x28,0x08,0x10,;codeunsignedcharhua32=0x08,0x20,0x08,0x24,0xFF,0xFE,0x08,0x20,0x08,0x20,0x08,0x80,0x10,0x88,0x10,0x98,0x30,0xA0,0x50,0xC0,0x90,0x80,0x11

46、,0x80,0x12,0x82,0x14,0x82,0x10,0x7E,0x10,0x00,;#include<reg52.h>#include"1.h"#include"2.h"/#include"3.h"#defineucharunsignedchar#defineuintunsignedint/蜂鳴器初始化sbitfm=P3A4;/蜂鳴器連續(xù)的IO口uchartimeh,timel;uchari=0;uintcount=0;uintjy_count=0;voiddelay1(uintz);/延時(shí)1MSvoiddela

47、y(uintz);/延時(shí)165Ms即十六分音符voidsong();/點(diǎn)陣初始化#defineDATE_OUTP0/指定P2口做為輸出sbitDATA=DATE_OUTA0;歹U數(shù)據(jù)輸出位sbitSCLH=DATE_OUTA1;歹U掃描時(shí)鐘位sbitSCLT=DATE_OUTA2;歹U數(shù)據(jù)鎖存位sbitAB=DATE_OUTA3;行數(shù)據(jù)輸出位sbitSCK=DATE_OUTA4;/行掃描時(shí)鐘位uchardate32;/32字節(jié)RAM故為16*16點(diǎn)陣屏顯示緩存voiddisplay();/做為點(diǎn)陣掃描函數(shù),將顯示緩存的數(shù)據(jù)輸出到點(diǎn)陣屏voiddisplay_time(unsignedintti

48、mer);/指定時(shí)間掃描顯示voiddisplay_school();voiddisplay_jmszl();voiddisplay_qnzl();voiddisplay_mlh();voidkeyscan();main()EA=1;/開(kāi)總中斷TMOD=0x01;/定時(shí)器0工作在方式1TH0=0;TL0=0;ET0=1;while(1)keyscan();song();/delay1(1000);用于產(chǎn)生各種音調(diào)voidtimer0()interrupt1/TH0=timeh;TL0=timel;fm=fm;voidsong()uinttemp;ucharjp;/jp是簡(jiǎn)譜while(1)if

49、(count=0)/ucharj=0;while(1)if(count=0)TR0=0;fm=1;if(jy_count=0)display_school();elseif(jy_count=1)display_mlh();elseif(jy_count=2)display_jmszl();elseif(jy_count=3)display_qnzl();if(count=1)/選曲temp=mlhi;if(count=2)temp=jmszli;if(count=3)temp=qnzli;if(temp=0xff)break;jp=temp/16;/取數(shù)的高4位if(jp!=0)timeh=

50、cuzhijp*2;timel=cuzhijp*2+1;elseTR0=0;fm=1;/關(guān)蜂鳴器delay(temp%16);/取數(shù)的低4位TR0=0;/唱完一個(gè)音停10MSfm=1;delay1(10);TR0=1;i+;keyscan();TR0=0;fm=1;voiddelay(uintz)延時(shí)165Ms即十六分音符uintx,y;for(x=z;x>0;x-)for(y=19000;y>0;y-);voiddelay1(uintz)/延時(shí)1MSuintx,y;for(x=z;x>0;x-)for(y=112;y>0;y-);voidkeyscan()uintsw

51、;P1=0xfe;sw=P1;if(sw=0xee)delay1(5);if(sw=0xee);count=1;i=0;while(1)i=0;song();keyscan();if(sw=0xde)delay1(5);if(sw=0xde)count=2;i=0;while(1)i=0;song();keyscan();if(sw=0xbe)delay1(5);if(sw=0xbe)count=3;i=0;while(1)i=0;song();keyscan();if(sw=0x7e)delay(5);if(sw=0x7e)jy_count=count;count=0;while(1)son

52、g();keyscan();P1=0xfd;sw=P1;if(sw=0x7d)delay(5);if(sw=0x7d)count=jy_count;while(1)song();keyscan();/*顯示函數(shù)*/voiddisplay()ucharm,ia,n,tmp;/定義變量DATE_OUT=0XFF;/置位高電平做準(zhǔn)備/AB=0;/將行數(shù)據(jù)位清0,準(zhǔn)備移位for(m=0;m<16;m+)/循環(huán)輸出16行數(shù)據(jù)SCK=0;/為行移位做準(zhǔn)備SCLT=0;/為列鎖存做準(zhǔn)備for(ia=2;ia>0;)/每行16個(gè)點(diǎn),循環(huán)位移兩個(gè)字節(jié)ia-;/循環(huán)兩次tmp=datem*2+ia;/讀取點(diǎn)陣數(shù)據(jù)做輸出,這里用到ia目的是先讀取點(diǎn)陣數(shù)據(jù)的第二位字節(jié),因一行16個(gè)點(diǎn)由兩個(gè)字節(jié)組成,/電路中的移位寄存器最后一位對(duì)應(yīng)最后一列,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論