版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p><b> 1引言1</b></p><p><b> 2硬件設(shè)計2</b></p><p> 2.1硬件電路的設(shè)計框圖2</p><p> 2.2硬件電路設(shè)計模塊的選定2</p><
2、p> 2.2.1中心模塊2</p><p> 2.2.2播放模塊3</p><p> 2.2.3顯示模塊4</p><p> 2.2.4電子琴模塊4</p><p> 2.3各硬件電路的具體設(shè)計5</p><p> 2.3.1 AT89S52控制模塊的設(shè)計5</p><
3、p> 2.3.2按鍵模塊的設(shè)計6</p><p> 2.3.3揚(yáng)聲器播放模塊的設(shè)計7</p><p> 2.3.4 LCD顯示電路的設(shè)計7</p><p> 2.3.5彩燈伴奏電路的設(shè)計8</p><p><b> 3軟件設(shè)計9</b></p><p> 3.1單片機(jī)發(fā)
4、聲的基本原理9</p><p> 3.2設(shè)計的相關(guān)音樂說明9</p><p> 3.3切換原理10</p><p> 3.4音樂播放器軟件程序設(shè)計10</p><p> 3.4.1按鍵掃描子程序設(shè)計10</p><p> 3.4.2 1ms延時程序設(shè)計14</p><p>
5、 3.4.3 LCD顯示子程序設(shè)計15</p><p> 3.4.4函數(shù)初始化子程序設(shè)計16</p><p> 3.4.5系統(tǒng)主程序設(shè)計17</p><p><b> 4結(jié)論19</b></p><p><b> 參考文獻(xiàn)20</b></p><p>
6、附錄一 硬件原理圖21</p><p> 附錄二 軟件主程序22</p><p><b> 致謝32</b></p><p><b> 摘 要</b></p><p> 目前流行的MP3播放器的音質(zhì)已相當(dāng)好,但略感遺憾的是除了選擇歌曲和顯示歌名外,絕大部分播放器沒有諸如隨意彈奏樂曲、樂
7、曲節(jié)奏跳動等功能。而隨著人們生活水平的不斷提高,單片機(jī)控制無疑是人們追求的目標(biāo)之一。要為現(xiàn)代人工作、生活提供更好的更方便的服務(wù)就需要從單片機(jī)技術(shù)著手,一切向著數(shù)字化控制、智能化控制方向發(fā)展。</p><p> 本設(shè)計是采用單片機(jī)為核心設(shè)計的數(shù)字音樂播放器。本設(shè)計在實現(xiàn)音樂的播放及歌曲名顯示等基本功能的基礎(chǔ)上進(jìn)行了擴(kuò)展,添加了彩燈伴奏、按鍵彈奏、顯示音樂節(jié)拍等功能。</p><p> 本
8、論文給出了系統(tǒng)方案的建立、硬件電路的詳細(xì)設(shè)計及軟件的程序?qū)崿F(xiàn)。并通過軟硬件的聯(lián)立調(diào)試,驗證了設(shè)計方案的可行性。</p><p> 關(guān)鍵詞:多功能;MP3音樂播放器;單片機(jī);按鍵彈奏</p><p><b> Abstract</b></p><p> The current popular MP3 player sound has bee
9、n quite good, but feel regretful slightly is in addition to the choice of songs and display the song name, most players without such as random play music rhythm, music and other functions. But as people living standard r
10、ise ceaselessly, SCM control is one of the goals that people pursue. For the modern life of work, to provide better and more convenient service needs from proceed toward the SCM technology, all digital control, intellige
11、nt control direc</p><p> This design is the use of single-chip microcomputer as the core design of the digital music player. The design in the implementation of music playing and the song name display and o
12、ther basic functions based on the expansion, adding lights accompaniment, play button, display the beat of the music and other functions.</p><p> This paper gives a system scheme, hardware establishment det
13、ailed circuit design and software program. And through the software and hardware of simultaneous debugging, verify the feasibility of the design scheme.</p><p> Key words: multi function; MP3 music player;
14、single chip microcomputer; play button</p><p><b> 1引言</b></p><p> 二十世紀(jì)九十年代以來,計算機(jī)、信息、電子、控制、通信等技術(shù)得到迅速發(fā)展,促使了社會生產(chǎn)力的提高,也使人們的生產(chǎn)方式和生活方式產(chǎn)生了日新月異的變化。隨著人們生活水平的提高及對音樂的喜愛,對音樂播放器的品質(zhì),功能,品種等提出了越來越
15、多的要求,表現(xiàn)在對控制系統(tǒng)性能、可靠性等要求越來越高。而品質(zhì)的提高,功能的更新,可靠性的增強(qiáng),品種的變化無不與產(chǎn)品的核心控制部分水平的提高密不可分。家用音樂播放器產(chǎn)品及其它有關(guān)消費(fèi)電器產(chǎn)品都是一些開環(huán)或閉環(huán)控制系統(tǒng),都由核心控制部分,執(zhí)行部分與人機(jī)界面三部分組成。而最為重要的控制部分一般是由單片機(jī)來執(zhí)行完成的,這就必將導(dǎo)致和促進(jìn)單片機(jī)在音樂領(lǐng)域應(yīng)用的發(fā)展?,F(xiàn)在這些由單片機(jī)實現(xiàn)的音樂播放器的功能越來越強(qiáng)、費(fèi)用越來越低。例如,就目前市場上的
16、MP3的功能越來越強(qiáng)大體積卻越來越小,價格也逐漸便宜,被大多數(shù)人所能接受。但這些音樂播放器也或多或少的存在著一些問題,解決這些問題,非智能化的單片機(jī)莫屬。</p><p> 本設(shè)計由硬件電路設(shè)計和軟件程序設(shè)計兩大部分組成。整個硬件電路是由中心控制、播放、選曲、顯示、電子琴和彩燈等模塊組成,中心控制模塊采用AT89S52單片機(jī),播放模塊是由8550 NPN三極管和電磁蜂鳴器組成,采用LCD1602顯示模塊,電子琴
17、設(shè)有8個按鍵,其中7個作為音符輸入,另外1個作為模式轉(zhuǎn)換按鍵,實現(xiàn)用戶自彈作曲。軟件程序運(yùn)用C語言編程實現(xiàn)。</p><p><b> 2 硬件設(shè)計</b></p><p> 2.1 硬件電路的設(shè)計框圖</p><p> 硬件電路如圖1所示由控制模塊、按鍵模塊、LCD顯示模塊、揚(yáng)聲器播放模塊、彩燈伴奏模塊組成。</p>&l
18、t;p> 按鍵模塊共由8個按鍵組成,其中1個鍵用于實現(xiàn)播放器自動播放和自行彈奏兩模式間的轉(zhuǎn)換,其余7個鍵作為音符的輸入或音樂的播放選擇。LCD顯示模塊利用LCD1602對當(dāng)前播放的歌曲名稱進(jìn)行顯示。彩燈伴奏模塊則是LED通過控制模塊的控制伴隨音樂節(jié)奏閃亮。揚(yáng)聲器播放模塊由三極管及無源蜂鳴器組成,通過控制模塊的控制對當(dāng)前音樂進(jìn)行播放。</p><p> 2.2 硬件電路設(shè)計模塊的選定</p>
19、<p> 2.2.1 中心模塊</p><p> 目前應(yīng)用較為流行的單片機(jī)有AVR和51單片機(jī)。</p><p> 51系列的單片機(jī)優(yōu)點(diǎn)之一在于,它從內(nèi)部硬件到軟件有著一套完整的按位操作系統(tǒng),即位處理器,也稱布爾處理器,它的處理對象不是字或字節(jié),而是位,這就意味著它不僅能對片內(nèi)某些特殊功能寄存器的某位進(jìn)行處理,例如傳送、置位、清零、測試等,還能進(jìn)行位的邏輯運(yùn)算,這一點(diǎn)使其
20、他種類單片機(jī)很難實現(xiàn)的。</p><p> 51系列的單片機(jī)的另一個優(yōu)點(diǎn)便是具備了乘法和除法指令,其中八位除以八位的除法指令商為八位,精度顯得有些不足,因此在應(yīng)用方面不是很多,但八位乘以八位的乘法指令積為十六位,這樣的精度已經(jīng)足以滿足大部分應(yīng)用的要求了,更為重要的是,直接具備了乘法與除法指令,這就使得在實際應(yīng)用時,使用者不必額外編寫相應(yīng)的子程序以備調(diào)用,與其他系列單片機(jī)相比,51系列的單片機(jī)在編程操作方面的簡便
21、與實用性無疑上了一個新臺階。而同屬指令系統(tǒng)規(guī)范完整這一范疇所帶來的便利還包括了二進(jìn)制—十進(jìn)制調(diào)整指令DA,可將二進(jìn)制變?yōu)锽CD碼,這使得十進(jìn)制的計量更為快捷簡便,省去了其他系列單片機(jī)還需要編寫調(diào)用相應(yīng)子程序的冗余過程,節(jié)省了大量的勞動力和時間。</p><p> AVR單片機(jī)作為一個新興起的系列,也具有了大多數(shù)新興事物的特點(diǎn),即在原有系列的基礎(chǔ)上,擁有高性能、高速度、甚至是更低的功耗,但這些優(yōu)化與更新的性能背后
22、,也存在著一些問題,例如其價格相比之下顯得較為昂貴,此外,它的32個通用寄存器中前16個寄存器都不能直接與立即數(shù)打交道,而不像51系列的單片機(jī)中所有的通用寄存器均可直接與立即數(shù)打交道,因而AVR系列的單片機(jī)在通用性方面無疑有所下降。由此可見,較高的價格、較低的適用性,這兩點(diǎn)便是AVR單片機(jī)進(jìn)行市場推廣所存在的最大制約。</p><p> 所以,從本系統(tǒng)設(shè)計的功能需求及成本考慮,51單片機(jī)性價比更高,AT89S5
23、2是擁有2個外部中斷,2個16位定時器,2個可編程串行UART的單片機(jī)。中心控制模塊采用AT89S52單片機(jī)已完全滿足設(shè)計需要,實現(xiàn)整個系統(tǒng)控制。</p><p> 2.2.2 播放模塊</p><p> 播放模塊是由8050 NPN三極管和電磁蜂鳴器組成。AT89S52輸出高電平控制信號,啟動8050 NPN三極管使信號放大,從而啟動電磁蜂鳴器。與LM386和喇叭的組合相比較,該播放
24、模塊存在一定噪聲,音響效果較差。但由于所需驅(qū)動功率較小,驅(qū)動器件要求不高,并能降低設(shè)計成本。因此,必須選用8050 NPN三極管和電磁蜂鳴器則能滿足系統(tǒng)要求[1]。</p><p> 2.2.3 顯示模塊</p><p> LED數(shù)碼管是一種數(shù)顯器件。我們知道,發(fā)光二極管(英文縮寫為LED)是由半導(dǎo)體材料制成的、能將電信號轉(zhuǎn)換成光信號的結(jié)型電致發(fā)光器件。如果把發(fā)光二極管制成條狀,再按照
25、一定方式連接,組成數(shù)字“8”,就構(gòu)成LED數(shù)碼管,簡稱LED。使用時按規(guī)定使某些筆段上的發(fā)光二極管發(fā)光,即可組成0 ~ 9的一系列數(shù)字。</p><p> 液晶顯示器,簡稱LCD(Liquid Crystal Display),是一種液晶利用光調(diào)制的受光型顯示器件。LCD的特點(diǎn)是體積小、形狀薄、重量輕、耗能少(1~10微瓦/平方厘米)、低發(fā)熱、工作電壓低(1.5~6伏)、無污染,無輻射、無靜電感應(yīng),尤其是視域?qū)?/p>
26、、顯示信息量大、無閃爍,并能直接與CMOS集成電路相匹配,同時還是真正的“平板”式顯示設(shè)備。 </p><p> 常見的基于單片機(jī)設(shè)計的音樂播放器基本不能顯示歌曲信息。該音樂播放系統(tǒng)設(shè)計上增加液晶顯示器,可為使用者提供曲目信息。由于LED數(shù)碼管只能顯示數(shù)字而無法顯示其他中英文字符,從設(shè)計的成本及功能的角度考慮,采用LCD1602顯示模塊,它可以顯示每首曲目的英文名字。LCD1602驅(qū)動電路簡單,可以由單片機(jī)直接
27、輸出命令驅(qū)動[2]。</p><p> 2.2.4 電子琴模塊</p><p> 電子琴設(shè)有8個按鍵,其中7個作為音符輸入,另外1個作為模式轉(zhuǎn)換按鍵,實現(xiàn)用戶自彈作曲。7個按鍵分別代表7個音符,包括中音段的全部音符。通過軟硬件設(shè)計,模式轉(zhuǎn)換按鍵觸發(fā)外部中斷,中斷使程序跳轉(zhuǎn),實現(xiàn)模式轉(zhuǎn)換,啟動電子琴。然后通過查詢電子琴所按下的按鍵,讀取電子琴輸入狀態(tài),跳轉(zhuǎn)到對應(yīng)的程序人口,實現(xiàn)自編歌曲。
28、當(dāng)需要取消電子琴編曲功能時,再次按下模式轉(zhuǎn)換按鍵引起外部中斷.即可退出電子琴功能而返回到原來音樂播放處。</p><p> 2.3 各硬件電路的具體設(shè)計</p><p> 2.3.1 AT89S52控制模塊的設(shè)計</p><p> AT89S52控制模塊如圖2所示,由核心芯片AT89S52單片機(jī)、單片機(jī)復(fù)位電路及外接晶振組成。</p><p
29、> 如圖2所示,電容C5、C9和12M晶振與單片機(jī)引腳XTAL1和XTAL2相連構(gòu)成外接晶振電路。AT89S51單片機(jī)內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是此放大器的輸入和輸出端。在XTAL1和XTAL2兩端跨接晶體就構(gòu)成了穩(wěn)定的自激振蕩器,其發(fā)出的脈沖直接送入內(nèi)部的時鐘電路,為單片機(jī)的工作提供時序。而XTAL1端和XTAL2端將電容C5和C5與內(nèi)部的反相放大器連接起來組成并聯(lián)諧振電路,C5
30、、C9取31pF,對頻率有微調(diào)作用。</p><p> AT89S51單片機(jī)有一個復(fù)位引腳,復(fù)位條件是:在時鐘電路工作后,當(dāng)外部電路在RST引腳施加持續(xù)2個機(jī)器周期以上的高電平時,使系統(tǒng)復(fù)位。一般只要保持正脈沖的寬度為10微秒,就可是單片機(jī)安全復(fù)位。本系統(tǒng)采用按鍵手動復(fù)位,在上電瞬間,RST引腳電位與VCC相同,隨著電容上充電電壓的增加,RST引腳電位逐漸下降。在單片機(jī)運(yùn)行期間,按下按鍵電容瞬間放電,RST引腳
31、電位與VCC相同,系統(tǒng)復(fù)位;隨著按鍵的斷開,電容又開始充電,RST引腳電位電位逐漸下降,系統(tǒng)開始正常工作。</p><p> 2.3.2 按鍵模塊的設(shè)計</p><p> 鍵盤在系統(tǒng)中作用在于手動切換播放器模式、音樂彈奏時音符的輸入以及曲目的選擇。因在本系統(tǒng)中需要的按鍵并不多,單片機(jī)的I/O數(shù)完全可以滿足,所以采用了獨(dú)立式鍵盤設(shè)計,如圖3所示。如圖示,按鍵均低電平有效。此外,上拉電阻保
32、證了按鍵斷開時,I/O口線有確定的高電平。在設(shè)計鍵盤的時候,還要考慮去抖問題。常見的去抖的方法有兩種:硬件方法和軟件方法。單片機(jī)中常用軟件法,因此在硬件方面將不做處理。</p><p> 如圖3所示,鍵盤輸入電路中共用到八個按鍵,S1鍵用于播放器模式的切換,在軟件中計算S1鍵按下的次數(shù),一次為播放模式,二次為自行彈奏模式;S2~S8鍵在播放器為自動播放模式時為曲目選擇鍵,即七個按鍵依次對應(yīng)一首歌曲,按下其中一個
33、鍵就播放對應(yīng)的歌曲。而在播放器為自行彈奏模式時,七個鍵就對應(yīng)著七個音符,即按下某一按鍵,播放器就發(fā)出對應(yīng)音符的節(jié)奏[3]。</p><p> 2.3.3 揚(yáng)聲器播放模塊的設(shè)計</p><p> 揚(yáng)聲器播放模塊是由8050 NPN三極管和無源蜂鳴器組成,如圖4所示。無源蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。無源蜂鳴器發(fā)聲原理是電流通過電磁線圈,使電磁線圈產(chǎn)生磁場來驅(qū)動振動
34、膜發(fā)聲的,因此需要一定的電流才能驅(qū)動它,單片機(jī)IO引腳輸出的電流較小,單片機(jī)輸出的TTL電平基本上驅(qū)動不了蜂鳴器,因此設(shè)計過程中增加一個由8050 NPN三極管組成的電流放大電路。如圖所示,蜂鳴器的負(fù)極直接接地,蜂鳴器的正極接到三極管的發(fā)射極E上,三極管的基級B經(jīng)過限流電阻R9后由單片機(jī)的P22引腳控制,當(dāng)P22輸出高電平時,三極管Q1截止,沒有電流流過線圈,蜂鳴器不發(fā)聲;當(dāng)P22輸出低電平時,三極管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)
35、出聲音。因此,我們可以通過程序控制P22腳的電平來使蜂鳴器發(fā)出聲音和關(guān)閉。</p><p> 2.3.4 LCD顯示電路的設(shè)計</p><p> LCD顯示電路由單片機(jī)P0及P3.0-P3.2端口控制。我們選用的是工業(yè)字符型液晶顯示屏LCD1602,能同時顯示16*2即32個字符(16列2行)。硬件連接如圖5所示。其中變位器是為調(diào)節(jié)LCD對比度而設(shè)計。LCD的顯示驅(qū)動在軟件中完成,硬件
36、中不做處理。</p><p> 2.3.5 彩燈伴奏電路的設(shè)計</p><p> 根據(jù)設(shè)計要求,本設(shè)計中設(shè)計了彩燈伴奏電路,彩燈采用普通發(fā)光二級管。播放器工作時,發(fā)光二級管根據(jù)音樂節(jié)拍閃亮。當(dāng)播放器發(fā)出duo音時,D1亮;當(dāng)播放器發(fā)出ruai音時,D2亮;當(dāng)播放器發(fā)出mi音時,D3亮;當(dāng)播放器發(fā)出fa音時,D4亮;當(dāng)播放器發(fā)出suo音時,D1、D4亮;當(dāng)播放器發(fā)出la音時,D2、D3亮
37、;當(dāng)播放器發(fā)出xi音時,D3、D4亮。在程序執(zhí)行過程中,單片機(jī)對發(fā)出的音符進(jìn)行檢測,再輸出對應(yīng)的彩燈信號。硬件電路較簡單,如圖6所示。</p><p><b> 3 軟件設(shè)計</b></p><p> 3.1 單片機(jī)發(fā)聲的基本原理</p><p> 我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單處機(jī)某個口線的高電平或低電
38、平,則在該口線上就能產(chǎn)生一定頻率形波,接上喇叭就能發(fā)出一定頻率的聲音,若再利用延時程序控制高 、低電平的持續(xù)時間,就能改變輸出頻率,從而改變音調(diào)。音符的節(jié)拍我們可以用定時器T0來控制,送入不同的初值,就可以產(chǎn)生不同的定時時間。便如某歌曲的節(jié)奏為每分鐘94拍,即一拍為0.64秒。但是,由于T0的最大定時時間只能為131毫秒,因此不可能直接用改變T0的時間初值來實現(xiàn)不同節(jié)拍。我們可以用T0來產(chǎn)生10毫秒的時間基準(zhǔn),然后設(shè)置一個中斷計數(shù)器,通
39、過判別中斷計數(shù)器的值來控制節(jié)拍時間的長短。例如對1/4拍音符,定時時間為0.16秒,相應(yīng)的時間常數(shù)為16(即10H);對3拍音符,定時時間為1.92秒,相應(yīng)時間長數(shù)為192(即C0H)。我們將每一音符的時間常數(shù)和其相應(yīng)的節(jié)拍常數(shù)作為一組,按順序?qū)非械乃谐?shù)排列成一個表,然后由查表程序依次取出,產(chǎn)生音符并控制節(jié)奏,就可以實現(xiàn)演奏效果。此外,結(jié)束符和休止符可以分別用代碼00H和FFH來表示,若查表結(jié)果為00H,則表示曲子終了;若查表結(jié)
40、果為FFH,則產(chǎn)生相應(yīng)的停頓效</p><p> 3.2 設(shè)計的相關(guān)音樂說明</p><p> 要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期時間。利用半周期時間定時這個半周期時間,每當(dāng)計時到后就將輸出的I/O反向,然后重復(fù)計時此半周期再對I/O反向,就可以在I/O腳上得到此頻率的脈沖。</p><p> 記數(shù)脈沖值與頻率的
41、關(guān)系公式如:N=Fi/2/Fr。N:記數(shù)值;Fi:內(nèi)部計時依次為1us,故其頻率為1 MHZ;Fr:要產(chǎn)生的頻率。</p><p> 其記數(shù)值的求法如:T=65536-N=65536-Fi/2/Fr。例:設(shè)K=65536,F(xiàn)=1000000=Fi=1 MHZ。求低音DO(26HZ),中音DO(523HZ),高音DO(1046HZ)的記數(shù)值。</p><p> 每個音符使用1個音節(jié),字節(jié)
42、的高四位代表音符的高低,低四位代表音符的節(jié)拍。如果1拍為0.4秒,1/4拍為0.1秒,假設(shè)1/4拍為 DELAY,則1拍為4 DELAY。</p><p><b> 3.3 切換原理</b></p><p> 播放器具有手動彈奏和自行播放兩種模式,對于這兩種模式的切換,本設(shè)計是通過軟件判斷模式轉(zhuǎn)換按鍵按下的次數(shù)來實現(xiàn)的。當(dāng)模式轉(zhuǎn)換按鍵按下一次時,播放器為自動播放模
43、式;當(dāng)按鍵連續(xù)按下兩次時,播放器為手動彈奏模式。在軟件中的流程圖大致如圖7所示。</p><p> 3.4 音樂播放器軟件程序設(shè)計</p><p> 3.4.1 按鍵掃描子程序設(shè)計</p><p> 本設(shè)計中采用的獨(dú)立式鍵盤,按鍵的閉合與否直接反應(yīng)在口線的電平上,即口線的電平是呈現(xiàn)的高電平還是低電平。因此可以通過口線的電平高、低狀態(tài)檢測,來確認(rèn)按鍵是否按下。但
44、如果在觸點(diǎn)抖動期間檢測按鍵的通與斷狀態(tài),可能導(dǎo)致判斷出錯,即按鍵一次按下或釋放被錯誤的認(rèn)為是多次操作,為克服按鍵點(diǎn)機(jī)械抖動所致的檢測錯誤,確保CPU對一次按鍵動作只確認(rèn)一次按鍵,必須采取去抖動的措施。軟件中去抖動的措施即在第一次檢測到有鍵按下時,執(zhí)行一段延時10ms的子程序,然后再次檢測該鍵的電平狀態(tài),如果該鍵電平仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下[5]。</p><p> 一般把按鍵掃描程序設(shè)計成子程序
45、,以便其他程序調(diào)用[6]。程序流程圖如圖8所示:</p><p><b> 程序如下:</b></p><p> void key_scan()</p><p><b> { </b></p><p> if(key1==0)//---------------key1為模式轉(zhuǎn)換鍵)--
46、------------------</p><p><b> {</b></p><p> delay_ms(9);//延時,用于消抖動</p><p> if(key1==0)//延時后再次確認(rèn)按鍵按下</p><p><b> {</b></p><p> w
47、hile(!key1);</p><p><b> set++;</b></p><p> if(set==3)</p><p> set=1;//模式轉(zhuǎn)換按鍵選擇模式</p><p><b> }}</b></p><p> if(key2==0)//-----
48、----------key2為曲目2或音符duo)--------------------</p><p><b> {</b></p><p> delay_ms(9);//延時,用于消抖動</p><p> if(key2==0)//延時后再次確認(rèn)按鍵按下</p><p><b> { </b
49、></p><p><b> duo=1;</b></p><p> while(!key2);</p><p><b> }</b></p><p><b> }</b></p><p> if(key3==0)//---------
50、------key3為曲目3或ruai)--------------------</p><p><b> {</b></p><p> delay_ms(9);//延時,用于消抖動</p><p> if(key3==0)//延時后再次確認(rèn)按鍵按下</p><p><b> {</b>&l
51、t;/p><p><b> ru=1;</b></p><p> while(!key3);</p><p><b> }</b></p><p><b> }</b></p><p> if(key4==0)//---------------k
52、ey4為曲目4或mi)--------------------</p><p><b> {</b></p><p> delay_ms(9);//延時,用于消抖動</p><p> if(key4==0)//延時后再次確認(rèn)按鍵按下</p><p><b> {</b></p>
53、<p><b> mi=1;</b></p><p> while(!key4);</p><p><b> }</b></p><p><b> }</b></p><p> if(key5==0)//---------------key5為曲目5或f
54、a)--------------------</p><p><b> {</b></p><p> delay_ms(9);//延時,用于消抖動</p><p> if(key5==0)//延時后再次確認(rèn)按鍵按下</p><p><b> {</b></p><p>
55、;<b> fa=1;</b></p><p> while(!key5);</p><p><b> }</b></p><p><b> }</b></p><p> if(key6==0)//---------------key6為曲目6或suo)------
56、--------------</p><p><b> {</b></p><p> delay_ms(9);//延時,用于消抖動</p><p> if(key6==0)//延時后再次確認(rèn)按鍵按下</p><p><b> {</b></p><p><b&g
57、t; suo=1;</b></p><p> while(!key6);</p><p><b> }</b></p><p><b> }</b></p><p> if(key7==0)//---------------key7為曲目7或la)--------------
58、------</p><p><b> {</b></p><p> delay_ms(9);//延時,用于消抖動</p><p> if(key7==0)//延時后再次確認(rèn)按鍵按下</p><p><b> {</b></p><p><b> la=1
59、;</b></p><p> while(!key7);</p><p><b> }</b></p><p><b> }</b></p><p> if(key8==0)//---------------key8為曲目8或xi)--------------------<
60、;/p><p><b> {</b></p><p> delay_ms(9);//延時,用于消抖動</p><p> if(key8==0)//延時后再次確認(rèn)按鍵按下</p><p><b> {</b></p><p><b> xi=1;</b&g
61、t;</p><p> while(!key8);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 3.4.2 1ms延時程序設(shè)計</p>&l
62、t;p> 延時程序一般是通過一層或多層循環(huán)實現(xiàn),整個過程延時的時間是程序執(zhí)行的指令總條數(shù)乘以執(zhí)行每條指令所用的時間。由于該系統(tǒng)的晶振選用的是12M,所以執(zhí)行每條指令所所用時間為2us,程序執(zhí)行流程如圖9所示[7]。</p><p><b> 程序如下:</b></p><p> void delay_ms(uint xms)//延時函數(shù),有參函數(shù)</
63、p><p><b> {</b></p><p><b> uint x,y;</b></p><p> for(x=xms;x>0;x--)</p><p> for(y=110;y>0;y--);</p><p><b> }</b>
64、;</p><p> 3.4.3 LCD顯示子程序設(shè)計</p><p> 本設(shè)計中利用LCD1602顯示當(dāng)前播放曲目名稱以及彈奏時的音符。LCD開始工作是靠軟件來實現(xiàn)的[8]。整個顯示過程中的程序工作流程圖如圖10所示:</p><p><b> 程序如下:</b></p><p> void lcd_dis
65、play ( )</p><p><b> {</b></p><p> WriteCMD(0x80);</p><p> for(y=0;y<7;y++)</p><p> {WriteData(name[y]); mydelay(5); }</p><p> mydelay(
66、2); </p><p> WriteCMD(0x80+0x40);</p><p> for(z=0;z<12;z++)</p><p> { WriteData(num[z]); mydelay(5); }</p><p> for(x=0;x<19;x++)</p><p> {Write
67、CMD(0x18); mydelay(5);}}</p><p> 3.4.4 函數(shù)初始化子程序設(shè)計</p><p> 函數(shù)初始化程序即把在主函數(shù)內(nèi)對某些參數(shù)和標(biāo)記位賦初值編寫成一個函數(shù),這樣使程序更具有條理化,清晰易懂。由于整個程序要用到定時器0和定時器1,所以初始化程序主要是對定時器相關(guān)內(nèi)容作說明,程序的簡單框圖如圖11所示。</p><p><b&g
68、t; 程序如下:</b></p><p> void InitialSound(void)</p><p><b> {</b></p><p> Sound_Temp_TH1 = (65536-(1/1200)*SYSTEM_OSC)/256;// 計算TL1應(yīng)裝入的初值 (10ms的初裝值)</p>&
69、lt;p> Sound_Temp_TL1 = (65536-(1/1200)*SYSTEM_OSC)%256;// 計算TH1應(yīng)裝入的初值</p><p> TH1 = Sound_Temp_TH1;</p><p> TL1 = Sound_Temp_TL1;</p><p> TMOD = 0x11;</p><p>
70、ET0 = 1; ET1 = 0; TR0 = 0; TR1= 0; EA = 1;</p><p><b> }</b></p><p> 3.4.5 系統(tǒng)主程序設(shè)計</p><p> 播放器工作時,程序工作流程圖如圖12所示,先對在程序過程中所需的各種標(biāo)記位及參數(shù)進(jìn)行初始化賦值,再執(zhí)行按鍵掃描子程序并計算及保存鍵值,根據(jù)其中的模式轉(zhuǎn)換
71、鍵的按鍵次數(shù)進(jìn)行模式判斷,按鍵次數(shù)為1時播放器處于自動播放模式,揚(yáng)聲器播放模塊開始工作,同時彩燈伴奏模塊隨著單片機(jī)端口高低電平的變換閃爍達(dá)到伴奏的效果,另一方面顯示模塊進(jìn)入工作狀態(tài)對當(dāng)前曲目的曲目名進(jìn)行顯示;按鍵次數(shù)為2時播放器處于手動彈奏模式,再次對按鍵進(jìn)行掃描,對按下的鍵值進(jìn)行分析,單片機(jī)輸出相應(yīng)的音符,彩燈伴奏模塊也伴隨音符閃亮,同時LCD顯示模塊對當(dāng)前音符進(jìn)行顯示。</p><p><b>
72、4 結(jié)論</b></p><p> 本設(shè)計以MSC-51系列單片機(jī)為核心,充分利用了AT89C51芯片的I/O引腳,以獨(dú)立式鍵盤作為琴鍵輸入及曲目的選擇鍵,采用LCD1602對當(dāng)前曲目及音符進(jìn)行顯示,并利用發(fā)光二級管進(jìn)行音樂伴奏。本文從理論上分析了該設(shè)計方案的可行性,并預(yù)計能達(dá)到設(shè)計要求,主要體現(xiàn)在:</p><p><b> 擁有彩燈伴奏功能;</b>
73、;</p><p> 具有音頻D/A轉(zhuǎn)換功能,可以輸出音頻模擬信號并能播放音頻文件;</p><p><b> 顯示歌曲信息功能;</b></p><p> 播放器具有手動彈奏和自動播放兩個模式。</p><p> 在做此畢業(yè)設(shè)計中遇到不少的難點(diǎn),有的原理,根本就不知道怎樣去實現(xiàn)。最后通過自己仔細(xì)查資料,一點(diǎn)一點(diǎn)
74、的就慢慢懂了。在實驗中發(fā)現(xiàn),其實再難編寫的程序都是由一些基礎(chǔ)程序模塊構(gòu)成的,很多的基礎(chǔ)模塊前人就已經(jīng)做好了,只要我們拼湊就行了,當(dāng)然拼湊的工作也不是很簡單,最重要的還是要自己的基礎(chǔ)扎實,同時,自己的思路要非常的清晰。設(shè)計完后,感覺到平時掌握的東西實在太少了,要真正實現(xiàn)學(xué)有所成、學(xué)有所用還有很長的路要走。 現(xiàn)在電子信息技術(shù)發(fā)展迅速,我們現(xiàn)在學(xué)的東西在社會上也許已經(jīng)或即將被淘汰。因此在學(xué)校要學(xué)的不僅是書本上的東西,更重要的是自學(xué)的能
75、力、獨(dú)立思考的能力和動手的能力。要想在競爭異常激烈的現(xiàn)代社會立足,就必須有實力。在學(xué)校的時間是最好的學(xué)習(xí)機(jī)會,一定要珍惜好這有限的時間,多學(xué)知識,盡量充實自己,為以后進(jìn)入社會多做準(zhǔn)備。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 張紅梅,王磊杰.AT89S52與LED驅(qū)動S6B0724的應(yīng)用[J].電子質(zhì)量,2008(5):13-16.&
76、lt;/p><p> [2] 趙亮.液晶顯示模塊LCD1602應(yīng)用[J],電子制作,2007(3):58-59. </p><p> [3] 張春峰,鄒新杰,余張國.基于ATMEGA16的智能控制器的開發(fā)研制[J],微計算機(jī)信息,2007,,23(8):123-124.</p><p> [4] 侯振鵬.嵌入式C語言程序設(shè)計-使用MCS-51[M],北京:人民郵電
77、出版社,2006:117,119.</p><p> [5] 李朝青.單片機(jī)原理及接口技術(shù)[M],北京:北京航空航天大學(xué)出版社,2005:374-378.</p><p> [6] 華南農(nóng)業(yè)大學(xué)工程學(xué)院.Lab2000 系列單片機(jī)實驗系統(tǒng)實驗指導(dǎo)[M],廣州:華南農(nóng)業(yè)大學(xué)出版社,2006:19,65.</p><p> [7] Konrad King.SQL編
78、程實用大全[J].杜大鵬,譯,北京:中國水利水電出版社,2005,35(257):1-2.</p><p> [8] T.Parsons. The Social System. New York: Free Press, 1961: P36-45.</p><p><b> 附錄一 硬件原理圖</b></p><p><b>
79、附錄二 軟件主程序</b></p><p> #include <AT89S52.H></p><p> #include <intrins.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</
80、p><p> #define LCDPORT P0</p><p> unsigned int code tab[]={64021,64103,64260,64400,</p><p> 64524,64580,64684,64777,</p><p> 64820,64898,64968,65030,</p><p
81、> 65058,65110,65157,65178};</p><p> unsigned char code name[]="1234567" ;</p><p> unsigned char code num[]="200711111111";</p><p> unsigned char code ta
82、b1[]="PLAYING MUSIC IS";</p><p> unsigned char code tab2[]="TWO BUFFER";</p><p> unsigned char code tab3[]="THE TONE IS";</p><p> unsigned char code
83、 tab4[]="LOW SO LOW LA LOW TI MID DO MID RE MIN MI MIN FA MID SO MID LA MID TI HIG DO HIG RE HIG MI HIG FA HIG SO HIG LA";</p><p><b> //兩只蝴蝶</b></p><p> Unsigned char cod
84、e Music_Two[] ={ 0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03, 0x17,0x03,0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03
85、, 0x16,0x03, 0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x15,0x03,0x16,0x01,0x17,0x03,0x16,0x03, 0x17,0x01,0x16,0x03,0x17,0x03,0x16,0
86、x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02</p><p> //********************************************************************//</p><p> //*********************************************************
87、***********//</p><p> #ifndef __SOUNDPLAY_H_REVISION_FIRST__</p><p> #define __SOUNDPLAY_H_REVISION_FIRST__</p><p> //************************************************************
88、******//</p><p> #define SYSTEM_OSC 12000000</p><p> #define SOUND_SPACE 4/5 </p><p> sbit BeepIO=P3^0;</p><p> unsigned int code FreTab[12] = { 262,277,29
89、4,311,330,349,369,392,415,440,466,494 }; //原始頻率表</p><p> unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在頻率表中的位置</p><p> unsigned char code LengthTab[7]= { 1,2,4,8,16,32,6
90、4 };</p><p> unsigned char Sound_Temp_TH0,Sound_Temp_TL0;//音符定時器初值暫存</p><p> unsigned char Sound_Temp_TH1,Sound_Temp_TL1;//音長定時器初值暫存</p><p> //*********************************
91、*****************************************//</p><p> void InitialSound(void)</p><p><b> {</b></p><p> BeepIO = 0;</p><p> Sound_Temp_TH1 = (65536-(1/1200
92、)*SYSTEM_OSC)/256;// 計算TL1應(yīng)裝入的初值 (10ms的初裝值)</p><p> Sound_Temp_TL1 = (65536-(1/1200)*SYSTEM_OSC)%256;// 計算TH1應(yīng)裝入的初值</p><p> TH1 = Sound_Temp_TH1;</p><p> TL1 = Sound_Temp_TL1;
93、</p><p> TMOD = 0x11;</p><p> ET0 = 1; ET1 = 0; TR0 = 0; TR1= 0; EA = 1;</p><p><b> }</b></p><p> void BeepTimer0(void) interrupt 1//音符發(fā)生中斷</p>
94、<p> {BeepIO = !BeepIO;</p><p> TH0 = Sound_Temp_TH0;TL0 = Sound_Temp_TL0;</p><p><b> }</b></p><p> //****************************************************
95、*****************//</p><p> void Play(unsigned char *Sound;unsigned char Signature;unsigned char Octachord;unsigned int Speed)</p><p> {unsigned int NewFreTab[12];//新的頻率表</p><p
96、> unsigned char i,j;</p><p> int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLengt;</p><p> unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;</p><p> for(i=0;i<
97、;12;i++) // 根據(jù)調(diào)號及升降八度來生成新的頻率表</p><p> {j = i + Signature;</p><p> if(j > 11)</p><p> {j = j-12; NewFreTab[i] = FreTab[j]*2;</p><p><b> }</b></
98、p><p><b> else</b></p><p> NewFreTab[i] = FreTab[j];</p><p> if(Octachord == 1)</p><p> NewFreTab[i]>>=2;</p><p> else if(Octachord ==
99、3)</p><p> NewFreTab[i]<<=2;</p><p><b> }</b></p><p> SoundLength = 0;</p><p> while(Sound[SoundLength] != 0x00)//計算歌曲長度</p><p> {S
100、oundLength+=2;}Point = 0; Tone = Sound[Point];</p><p> Length = Sound[Point+1]; // 讀出第一個音符和它時時值</p><p> LDiv0 = 12000/Speed;// 算出1分音符的長度(幾個10ms)</p><p> LDiv4 = LDiv0/4;
101、// 算出4分音符的長度</p><p> LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最長間隔標(biāo)準(zhǔn)</p><p> TR0 = 0;TR1 = 1;</p><p> while(Point < SoundLength)</p><p> {SL=Tone%10;
102、//計算出音符</p><p> SM=Tone/10%10; //計算出高低音</p><p> SH=Tone/100; //計算出是否升半</p><p> CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出對應(yīng)音符的頻率</p><p><b>
103、; if(SL!=0)</b></p><p> {if (SM==1) CurrentFre >>= 2; //低音</p><p> if (SM==3) CurrentFre <<= 2; //高音</p><p> Temp_T = 65536-(50000/CurrentFre)*10/(12000000
104、/SYSTEM_OSC);//計算計數(shù)器初值</p><p> Sound_Temp_TH0 = Temp_T/256;Sound_Temp_TL0 = Temp_T%256;TH0 = Sound_Temp_TH0;TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時的補(bǔ)償</p><p> }SLen=LengthTab[Length%10]; //算出是
105、幾分音符</p><p> XG=Length/10%10; //算出音符類型(0普通1連音2頓音)</p><p> FD=Length/100;</p><p> LDiv=LDiv0/SLen; //算出連音音符演奏的長度(多少個10ms)</p><p> if (FD==1)</p><p&g
106、t; LDiv=LDiv+LDiv/2;</p><p><b> if(XG!=1)</b></p><p> if(XG==0) //算出普通音符的演奏長度</p><p> if (SLen<=4)</p><p> LDiv1=LDiv-LDiv4;</p><p>
107、;<b> else</b></p><p> LDiv1=LDiv*SOUND_SPACE;</p><p><b> else</b></p><p> LDiv1=LDiv/2; //算出頓音的演奏長度</p><p><b> else</b></p
108、><p> LDiv1=LDiv;</p><p> if(SL==0) LDiv1=0;</p><p> LDiv2=LDiv-LDiv1; //算出不發(fā)音的長度</p><p> if (SL!=0)</p><p><b> {</b></p><p>
109、 TR0=1;for(i=LDiv1;i>0;i--) //發(fā)規(guī)定長度的音</p><p><b> {</b></p><p> while(TF1==0);</p><p> TH1=Sound_Temp_TH1;</p><p> TL1=Sound_Temp_TL1;TF1=0;}</p&g
110、t;<p> }if(LDiv2!=0)</p><p> {TR0=0; BeepIO=0;</p><p> for(i=LDiv2;i>0;i--) //音符間的間隔</p><p><b> {</b></p><p> while(TF1==0);</p><
111、p> TH1=Sound_Temp_TH1;</p><p> TL1 = Sound_Temp_TL1;</p><p><b> TF1=0;</b></p><p><b> }</b></p><p> }Point+=2;</p><p> Ton
112、e=Sound[Point];</p><p> Length=Sound[Point+1];</p><p><b> }</b></p><p> BeepIO = 0;</p><p><b> }</b></p><p> //***************
113、***********液晶函數(shù)************************************//</p><p> //**********************************************************************//</p><p> sbit LCDE=P3^5;</p><p> sbit LCDR
114、W=P3^6;</p><p> sbit LCDRS=P3^7;</p><p> void Delay()</p><p> {uint uiCount;</p><p> for(uiCount=0;uiCount<250;uiCount++);</p><p><b> }</b
115、></p><p> void WriteCMD(uchar Command) </p><p> { Delay(); //先延時。 LCDE=1; //然后把LCD改為寫入命令狀態(tài)。</p><p> LCDRS=0; LCDRW=0; LCDPORT=Command; //再輸出命令。 Delay(); LCDE=0;
116、 //最后執(zhí)行命令。</p><p><b> }</b></p><p> void WriteData(uchar dat) </p><p> { Delay(); //先延時。 LCDE=1; //然后把LCD改為寫入數(shù)據(jù)狀態(tài)。</p><p> LCDRS=1; LC
117、DRW=0;LCDPORT=dat; //再輸出數(shù)據(jù)。 LCDE=0; //最后顯示數(shù)據(jù)。</p><p><b> }</b></p><p> void inicry()</p><p> {LCDRW=0;LCDE=0;WriteCMD(0x38);WriteCMD(0x0f);WriteCMD(0x07);Wr
118、iteCMD(0x01);}</p><p> void mydelay(int x)</p><p> { int i,y; for(i=x;i>0;i--) for(y=255;y>0;y--);</p><p><b> }</b></p><p> //********************
119、*************************************************//</p><p><b> #endif</b></p><p><b> main()</b></p><p><b> { </b></p><p> unsign
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機(jī)的mp3播放器設(shè)計【畢業(yè)論文】
- 基于單片機(jī)的mp3播放器設(shè)計-畢業(yè)設(shè)計論文
- 開題報告--基于通用單片機(jī)mp3播放器設(shè)計
- 基于單片機(jī)的音樂播放器設(shè)計畢業(yè)論文
- 基于單片機(jī)的mp3播放器設(shè)計[任務(wù)書]
- 基于android的mp3音樂播放器設(shè)計畢業(yè)設(shè)計論文
- 基于單片機(jī)的mp3設(shè)計-畢業(yè)論文
- 基于fpga的mp3音樂播放器設(shè)計
- 基于mp3播放器的設(shè)計
- 基于安卓android的mp3播放器畢業(yè)論文
- 基于-單片機(jī)控制的音樂播放器的畢業(yè)設(shè)計
- 單片機(jī)課程設(shè)計--基于陀螺儀的智能mp3播放器
- 畢業(yè)論文(設(shè)計)基于stm32的mp3播放器設(shè)計
- 給予android的mp3音樂播放器設(shè)計--畢業(yè)設(shè)計論文
- 基于單片機(jī)的mp3播放器設(shè)計-東華理工大學(xué)畢業(yè)設(shè)計(論文)
- 畢業(yè)設(shè)計---基于單片機(jī)的音樂播放器
- 畢業(yè)設(shè)計—基于單片機(jī)的音樂播放器
- 畢業(yè)設(shè)計(論文)-單片機(jī)音樂播放器設(shè)計
- 基于vs1003的mp3音樂播放器設(shè)計
- 基于單片機(jī)的mp3設(shè)計與實現(xiàn)--畢業(yè)論文
評論
0/150
提交評論