基于Atmega16的MP3設(shè)計與實現(xiàn)_第1頁
基于Atmega16的MP3設(shè)計與實現(xiàn)_第2頁
基于Atmega16的MP3設(shè)計與實現(xiàn)_第3頁
基于Atmega16的MP3設(shè)計與實現(xiàn)_第4頁
基于Atmega16的MP3設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-50-第1章緒論1.1嵌入式系統(tǒng)嵌入式系統(tǒng)是一種“完全嵌入受控器件內(nèi)部,為特定應(yīng)用而設(shè)計的專用計算機系統(tǒng)”,根據(jù)英國電氣工程師協(xié)會(U.K.InstitutionofElectricalEngineer)的定義,嵌入式系統(tǒng)為控制、監(jiān)視或輔助設(shè)備、機器或用于工廠運作的設(shè)備。國內(nèi)普遍認(rèn)同的嵌入式系統(tǒng)定義為:以應(yīng)用為中心,以計算機技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗等嚴(yán)格要求的專用計算機系統(tǒng)。1.2嵌入式的發(fā)展從20世紀(jì)七十年代單片機的出現(xiàn)到各式各樣的嵌入式微處理器,微控制器的大規(guī)模應(yīng)用,嵌入式系統(tǒng)已經(jīng)有了近30年的發(fā)展歷史。嵌入式系統(tǒng)的出現(xiàn)最初是基于單片機的。70年代單片機的出現(xiàn),使得汽車、家電、工業(yè)機器、通信裝置以及成千上萬種產(chǎn)品可以通過內(nèi)嵌電子裝置來獲得更佳的使用性能:更容易使用、更快、更便宜。這些裝置已經(jīng)初步具備了嵌入式的應(yīng)用特點,但是這時的應(yīng)用只是使用8位的芯片,執(zhí)行一些單線程的程序,還談不上“系統(tǒng)”的概念。最早的單片機是Intel公司的8048,它出現(xiàn)在1976年。Motorola同時推出了68HC05,Zilog公司推出了Z80系列,這些早期的單片機均含有256字節(jié)的RAM、4K的ROM、4個8位并口、1個全雙工串行口、兩個16位定時器。之后在80年代初,Intel又進(jìn)一步完善了8048,在它的基礎(chǔ)上研制成功了8051,這在單片機的歷史上是值得紀(jì)念的一頁,迄今為止,51系列的單片機仍然是最為成功的單片機芯片,在各種產(chǎn)品中有著非常廣泛的應(yīng)用。從80年代早期開始,嵌入式系統(tǒng)的程序員開始用商業(yè)級的“操作系統(tǒng)”編寫嵌入式應(yīng)用軟件,這使得可以獲取更短的開發(fā)周期,更低的開發(fā)資金和更高的開發(fā)效率,“嵌入式系統(tǒng)”真正出現(xiàn)了。確切點說,這個時候的操作系統(tǒng)是一個實時核,這個實時核包含了許多傳統(tǒng)操作系統(tǒng)的特征,包括任務(wù)管理、任務(wù)間通訊、同步與相互排斥、中斷支持、內(nèi)存管理等功能。90年代以后,隨著對實時性要求的提高,軟件規(guī)模不斷上升,實時核逐漸發(fā)展為實時多任務(wù)操作系統(tǒng)(RTOS),并作為一種軟件平臺逐步成為目前國際嵌入式系統(tǒng)的主流。這時候更多的公司看到了嵌入式系統(tǒng)的廣闊發(fā)展前景,開始大力發(fā)展自己的嵌入式操作系統(tǒng)。除了上面的幾家老牌公司以外,還出現(xiàn)了PalmOS,WinCE,嵌入式Linux,Lynx,Nucleux,以及國內(nèi)的Hopen,DeltaOs等嵌入式操作系統(tǒng)。隨著嵌入式技術(shù)的發(fā)展前景日益廣闊,相信會有更多的嵌入式操作系統(tǒng)軟件出現(xiàn)。1.3嵌入式的特點這些年來掀起了嵌入式系統(tǒng)應(yīng)用熱潮的原因主要有幾個方面:一是芯片技術(shù)的發(fā)展,使得單個芯片具有更強的處理能力,而且使集成多種接口已經(jīng)成為可能,眾多芯片生產(chǎn)廠商已經(jīng)將注意力集中在這方面。另一方面的原因就是應(yīng)用的需要,由于對產(chǎn)品可靠性、成本、更新?lián)Q代要求的提高,使得嵌入式系統(tǒng)逐漸從純硬件實現(xiàn)和使用通用計算機實現(xiàn)的應(yīng)用中脫穎而出,成為近年來令人關(guān)注的焦點。從上面的定義,我們可以看出嵌入式系統(tǒng)的幾個重要特征:1.系統(tǒng)內(nèi)核小。由于嵌入式系統(tǒng)一般是應(yīng)用于小型電子裝置的,系統(tǒng)資源相對有限,所以內(nèi)核較之傳統(tǒng)的操作系統(tǒng)要小得多。比如Enea公司的OSE分布式系統(tǒng),內(nèi)核只有5K,而Windows的內(nèi)核?簡直沒有可比性。2.專用性強。嵌入式系統(tǒng)的個性化很強,其中的軟件系統(tǒng)和硬件的結(jié)合非常緊密,一般要針對硬件進(jìn)行系統(tǒng)的移植,即使在同一品牌、同一系列的產(chǎn)品中也需要根據(jù)系統(tǒng)硬件的變化和增減不斷進(jìn)行修改。同時針對不同的任務(wù),往往需要對系統(tǒng)進(jìn)行較大更改,程序的編譯下載要和系統(tǒng)相結(jié)合,這種修改和通用軟件的“升級”是完全兩個概念。3.系統(tǒng)精簡。嵌入式系統(tǒng)一般沒有系統(tǒng)軟件和應(yīng)用軟件的明顯區(qū)分,不要求其功能設(shè)計及實現(xiàn)上過于復(fù)雜,這樣一方面利于控制系統(tǒng)成本,同時也利于實現(xiàn)系統(tǒng)安全。4.高實時性的系統(tǒng)軟件(OS)是嵌入式軟件的基本要求。而且軟件要求固態(tài)存儲,以提高速度;軟件代碼要求高質(zhì)量和高可靠性。5.嵌入式軟件開發(fā)要想走向標(biāo)準(zhǔn)化,就必須使用多任務(wù)的操作系統(tǒng)。嵌入式系統(tǒng)的應(yīng)用程序可以沒有操作系統(tǒng)直接在芯片上運行;但是為了合理地調(diào)度多任務(wù)、利用系統(tǒng)資源、系統(tǒng)函數(shù)以及和專家?guī)旌瘮?shù)接口,用戶必須自行選配RTOS(Real-TimeOperatingSystem)開發(fā)平臺,這樣才能保證程序執(zhí)行的實時性、可靠性,并減少開發(fā)時間,保障軟件質(zhì)量。6.嵌入式系統(tǒng)開發(fā)需要開發(fā)工具和環(huán)境。由于其本身不具備自舉開發(fā)能力,即使設(shè)計完成以后用戶通常也是不能對其中的程序功能進(jìn)行修改的,必須有一套開發(fā)工具和環(huán)境才能進(jìn)行開發(fā),這些工具和環(huán)境一般是基于通用計算機上的軟硬件設(shè)備以及各種邏輯分析儀、混合信號示波器等。開發(fā)時往往有主機和目標(biāo)機的概念,主機用于程序的開發(fā),目標(biāo)機作為最后的執(zhí)行機,開發(fā)時需要交替結(jié)合進(jìn)行。7.嵌入式系統(tǒng)與具體應(yīng)用有機結(jié)合在一起,升級換代也是同步進(jìn)行。因此,嵌入式系統(tǒng)產(chǎn)品一旦進(jìn)入市場,具有較長的生命周期。8.為了提高運行速度和系統(tǒng)可靠性,嵌入式系統(tǒng)中的軟件一般都固化在存儲器芯片中。1.4嵌入式發(fā)展現(xiàn)狀和發(fā)展趨勢進(jìn)入20世紀(jì)90年代,嵌入式技術(shù)全面展開,目前已成為通信和消費類產(chǎn)品的共同發(fā)展方向。在通信領(lǐng)域,數(shù)字技術(shù)正在全面取代模擬技術(shù)。在廣播電視領(lǐng)域,美國已開始由模擬電視向數(shù)字電視轉(zhuǎn)變,歐洲的DVB(數(shù)字電視廣播)技術(shù)已在全球大多數(shù)國家推廣。數(shù)字音頻廣播(DAB)也已進(jìn)入商品化試播階段。而軟件、集成電路和新型元器件在產(chǎn)業(yè)發(fā)展中的作用日益重要。所有上述產(chǎn)品中,都離不開嵌入式系統(tǒng)技術(shù)。象前途無可計量的維納斯計劃生產(chǎn)機頂盒,核心技術(shù)就是采用32位以上芯片級的嵌入式技術(shù)。在個人領(lǐng)域中,嵌入式產(chǎn)品將主要是個人商用,作為個人移動的數(shù)據(jù)處理和通訊軟件。由于嵌入式設(shè)備具有自然的人機交互界面,GUI屏幕為中心的多媒體界面給人很大的親和力。手寫文字輸入、語音撥號上網(wǎng)、收發(fā)電子郵件以及彩色圖形、圖像已取得初步成效。硬件方面,不僅有各大公司的微處理器芯片,還有用于學(xué)習(xí)和研發(fā)的各種配套開發(fā)包。目前低層系統(tǒng)和硬件平臺經(jīng)過若干年的研究,已經(jīng)相對比較成熟,實現(xiàn)各種功能的芯片應(yīng)有盡有。而且巨大的市場需求給我們提供了學(xué)習(xí)研發(fā)的資金和技術(shù)力量。從軟件方面講,也有相當(dāng)部分的成熟軟件系統(tǒng)。國外商品化的嵌入式實時操作系統(tǒng),已進(jìn)入我國市場的有WindRiver、Microsoft、QNX和Nuclear等產(chǎn)品。我國自主開發(fā)的嵌入式系統(tǒng)軟件產(chǎn)品如科銀(CoreTek)公司的嵌入式軟件開發(fā)平臺DeltaSystem,中科院推出的Hopen嵌入式操作系統(tǒng)(雖然還不夠完善)。同時由于是研究熱點,所以我們可以在網(wǎng)上找到各種各樣的免費資源,從各大廠商的開發(fā)文檔,到各種驅(qū)動,程序源代碼,甚至很多廠商還提供微處理器的樣片。這對于我們從事這方面的研發(fā),無疑是個資源寶庫。對于軟件設(shè)計來說,不管是上手還是進(jìn)一步開發(fā),都相對來說比較容易。這就使得很多生手能夠比較快的進(jìn)入研究狀態(tài),利于發(fā)揮大家的積極創(chuàng)造性。第2章概述2.1課題研究的目的MP3從問世以來,以其小巧的外形,近乎不差CD的音質(zhì),較小的數(shù)據(jù)目以及前衛(wèi)的功能迅速的得到了大眾的青睞,很快的得到了推廣和普及,打敗了傳統(tǒng)的隨身聽CD和MD。故此在市場的推動下,各大公司紛紛推出自己的MP3音樂播放器。這樣使得MP3的研制和生產(chǎn)變得更加容易,成本也在逐步降低,市場更加廣闊。同時為了能夠更好地打動消費者,MP3的功能也在與日俱增,我們可以發(fā)現(xiàn)每隔一段時間就會有新的元素加入到MP3中,其中2.5寸的硬盤MP3,支持WMA編碼的MP3,微硬盤的MP3,閃存彩屏MP3,可拍照MP3,可視頻MP3,乃至MP3手表,MP3眼鏡。MP3迅速的發(fā)展遠(yuǎn)遠(yuǎn)超出了人們的預(yù)想。直到今天MP3依舊是主流產(chǎn)品,雖然單純的MP3越來越少,但是MP3確實當(dāng)下任何電子產(chǎn)品不可或缺的一部分。如今的MP3技術(shù)已經(jīng)非常成熟了,各大制造商已經(jīng)不再單純關(guān)心的如何實現(xiàn)MP3,而更多的是如何能在低成本低功耗的實現(xiàn)MP3,并且賦予MP3更多的功能使其變得更加實用。這就意味著對于傳統(tǒng)的MP3在實現(xiàn)過程中如何優(yōu)化如何提高M(jìn)P3的市場競爭力是當(dāng)下的熱點。這就是本課題研究的目的所在。基于以上背景,我在此次設(shè)計中提出采用Atmega16微處理器的方案實現(xiàn)MP3,在降低硬件成本的基礎(chǔ)上保證高質(zhì)量的播放效果。2.2課題研究的意義MP3是一種典型的嵌入式設(shè)備,詳細(xì)的研究MP3播放器的開發(fā)過程,可以為嵌入式開發(fā)提供一種合適的開發(fā)方法和框架。MP3使用MPEG-1中的第3層音頻壓縮模式,可以將音樂文件以1:10甚至1:12的壓縮率,壓縮成容量較小的文件。而MP3播放器則用以對MP3進(jìn)行實時的解壓縮(解碼),這樣,高品質(zhì)的MP3音樂就播放出來了。體積小,音質(zhì)高,本件格式小是MP3逐步取代其他類型的音樂格式,并成為網(wǎng)上音樂的代名詞。對于本文研究還有另一個原因,近些年來,嵌入式系統(tǒng)和單片機開發(fā)的有機結(jié)合別廣泛應(yīng)用于網(wǎng)絡(luò)通信,工業(yè)控制等諸多領(lǐng)域,本文提出基于Atmega16單片機的MP3設(shè)計與實現(xiàn),更加體現(xiàn)出該設(shè)計的靈活性和實時性。2.3國內(nèi)外概況從韓國在1998年推出第一款MP3之后,經(jīng)過16年的發(fā)展,MP3占據(jù)了電子產(chǎn)品很大的一份市場份額。在MP3市場上,國內(nèi)品牌廠商具有絕對優(yōu)勢。愛國者、聯(lián)想、朝華等廠商都占據(jù)市場銷售的前列。但國外品牌,如三星、iRIVER、iPOD、并沒有放棄對市場的爭奪。一方面他們繼續(xù)鞏固在高端市場的優(yōu)勢,同時也在不斷想中低端市場滲透。松下、三洋和創(chuàng)新等加大投入,連索尼、HP和DELL等IT巨頭也進(jìn)軍中國MP3市場。

國內(nèi)的品牌也不再滿足低端定位,紛紛推出自己的高端產(chǎn)品?,F(xiàn)在已經(jīng)是百花爭鳴的MP3時代。2.4課題研究的內(nèi)容本論文主要研究設(shè)計了一種基于Atmega16的MP3音樂播放器系統(tǒng)。本設(shè)計實現(xiàn)了一種簡單的MP3播放器,其核心主控芯片為Atmega16,解碼芯片為VS1003,顯示屏為LCD12864可顯示中文,采用紅外遙控控制。本播放器硬件電路簡單,成本低廉,功能強大,易于拓展,系統(tǒng)主要是依靠c語言和匯編語言。本文主要研究實現(xiàn)MP3播放器的一下基本功能:1.實現(xiàn)歌曲播放,暫停,重播,上一首,下一首等功能。2.顯示播放列表,播放列表顯示歌曲名稱,播放時間。3.選擇相應(yīng)歌曲播放,歌曲播放過程中顯示歌曲播放進(jìn)度。4.實現(xiàn)音量大小調(diào)節(jié)以及靜音模式。第3章MP3播放器硬件設(shè)計與實現(xiàn)3.1MP3播放器系統(tǒng)總結(jié)構(gòu)設(shè)計本文MP3播放器硬件設(shè)計總體結(jié)構(gòu)如下,本系統(tǒng)的具體硬件設(shè)計主要包括:主芯片Atmega16和USB接口的連接設(shè)計,此部分主要用于MP3文件的傳輸和固件下載;主芯片Atmega16和按鍵以及LCD之間的設(shè)計連接,用戶通過顯示屏幕獲取播放器的進(jìn)程息,通過按鍵來對音樂進(jìn)行選擇和控制;主芯片Atmega16和VS1003解碼芯片之間,將該系統(tǒng)解碼后的數(shù)字信號轉(zhuǎn)換為人耳能識別的模擬信號,這一部分主要包括時鐘信號、數(shù)據(jù)信號以及反饋信號的連接;電源轉(zhuǎn)換部分,而USB接口以及電池的電源都需要DC-DC部分來進(jìn)行轉(zhuǎn)換,從而為系統(tǒng)提供所需的電源;播放系統(tǒng)和存儲系統(tǒng)的切換電路設(shè)計。如圖3.1。 圖3.1系統(tǒng)總體結(jié)構(gòu)3.2ATmega16微控制器3.2.1Atmega16簡介ATmega16是基于增強的AVRRISC結(jié)構(gòu)的低功耗8位CMOS微控制器。由于其先進(jìn)的指令集以及單時鐘周期指令執(zhí)行時間,ATmega16的數(shù)據(jù)吞吐率高達(dá)1MIPS/MHz,從而可以減緩系統(tǒng)在功耗和處理速度之間的矛盾。Atmega16有如下特點:16K字節(jié)的系統(tǒng)內(nèi)可編程Flash(具有同時讀寫的能力,即RWW),512字節(jié)EEPROM,1K字節(jié)SRAM,32個通用I/O口線,32個通用工作寄存器,用于邊界掃描的JTAG接口,支持片內(nèi)調(diào)試與編程,三個具有比較模式的靈活的定時器/計數(shù)器(T/C),片內(nèi)/外中斷,可編程串行USART,有起始條件檢測器的通用串行接口,8路10位具有可選差分輸入級可編程增益(TQFP封裝)的ADC,具有片內(nèi)振蕩器的可編程看門狗定時器,一個SPI串行端口,以及六個可以通過軟件進(jìn)行選擇的省電模式。3.2.2Atmega16引腳功能說明VCC引腳是電源正極,GND引腳是電源接地。端口A(PA7..PA0):端口A做為A/D轉(zhuǎn)換器的模擬輸入端。端口A為8位雙向I/O口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱的驅(qū)動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復(fù)位過程中,即使系統(tǒng)時鐘還未起振,端口A處于高阻狀態(tài)。端口B(PB7..PB0):端口B為8位雙向I/O口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱的驅(qū)動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復(fù)位過程中,即使系統(tǒng)時鐘還未起振,端口B處于高阻狀態(tài)。端口B也可以用做其他不同的特殊功能.端口C(PC7..PC0):端口C為8位雙向I/O口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱的驅(qū)動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復(fù)位過程中,即使系統(tǒng)時鐘還未起振,端口C處于高阻狀態(tài)。如果JTAG接口使能,即使復(fù)位出現(xiàn)引腳PC5(TDI)、PC3(TMS)與PC2(TCK)的上拉電阻被激活。端口C也可以用做其他不同的特殊功能.端口D(PD7..PD0):端口D為8位雙向I/O口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對稱的驅(qū)動特性,可以輸出和吸收大電流。作為輸入使用時,若內(nèi)部上拉電阻使能,則端口被外部電路拉低時將輸出電流。在復(fù)位過程中,即使系統(tǒng)時鐘還未起振,端口D處于高阻狀態(tài)。端口D也可以用做其他不同的特殊功能.RESET為復(fù)位輸入引腳。持續(xù)時間超過最小門限時間的低電平將引起系統(tǒng)復(fù)位。持續(xù)時間小于門限間的脈沖不能保證可靠復(fù)位。XTAL1引腳為反向振蕩放大器與片內(nèi)時鐘操作電路的輸入端。XTAL2引腳為反向振蕩放大器的輸出端。AVCC是端口A與A/D轉(zhuǎn)換器的電源。不使用ADC時,該引腳應(yīng)直接與VCC連接。使用ADC時應(yīng)通過一個低通濾波器與VCC連接。AREF是A/D的模擬基準(zhǔn)輸入引腳。3.2.3ATmega16引腳圖圖3.2Atmega16引腳圖3.2.4ATmega16內(nèi)核介紹為了獲得最高的性能以及并行性,AVR采用了Harvard結(jié)構(gòu),具有獨立的數(shù)據(jù)和程序總線。程序存儲器里的指令通過一級流水線運行。CPU在執(zhí)行一條指令的同時讀取下一條指令(在本文稱為預(yù)取)。這個概念實現(xiàn)了指令的單時鐘周期運行。程序存儲器是可以在線編程的FLASH??焖僭L問寄存器文件包括32個8位通用工作寄存器,訪問時間為一個時鐘周期。從而實現(xiàn)了單時鐘周期的ALU操作。在典型的ALU操作中,兩個位于寄存器文件中的操作數(shù)同時被訪問,然后執(zhí)行運算,結(jié)果再被送回到寄存器文件。整個過程僅需一個時鐘周期。寄存器文件里有6個寄存器可以用作3個16位的間接尋址寄存器指針以尋址數(shù)據(jù)空間,實現(xiàn)高效的地址運算。其中一個指針還可以作為程序存儲器查詢表的地址指針。這些附加的功能寄存器即為16位的X、Y、Z寄存器。ALU支持寄存器之間以及寄存器和常數(shù)之間的算術(shù)和邏輯運算。ALU也可以執(zhí)行單寄存器操作。運算完成之后狀態(tài)寄存器的內(nèi)容得到更新以反映操作結(jié)果。程序流程通過有/無條件的跳轉(zhuǎn)指令和調(diào)用指令來控制,從而直接尋址整個地址空間。大多數(shù)指令長度為16位,亦即每個程序存儲器地址都包含一條16位或32位的指令。程序存儲器空間分為兩個區(qū):引導(dǎo)程序區(qū)(Boot區(qū))和應(yīng)用程序區(qū)。這兩個區(qū)都有專門的鎖定位以實現(xiàn)讀和讀/寫保護(hù)。用于寫應(yīng)用程序區(qū)的SPM指令必須位于引導(dǎo)程序區(qū)。在中斷和調(diào)用子程序時返回地址的程序計數(shù)器(PC)保存于堆棧之中。堆棧位于通用數(shù)據(jù)SRAM,因此其深度僅受限于SRAM的大小。在復(fù)位例程里用戶首先要初始化堆棧指針SP。這個指針位于I/O空間,可以進(jìn)行讀寫訪問。數(shù)據(jù)SRAM可以通過5種不同的尋址模式進(jìn)行訪問。AVR存儲器空間為線性的平面結(jié)構(gòu)。AVR有一個靈活的中斷模塊。控制寄存器位于I/O空間。狀態(tài)寄存器里有全局中斷使能位。每個中斷在中斷向量表里都有獨立的中斷向量。各個中斷的優(yōu)先級與其在中斷向量表的位置有關(guān),中斷向量地址越低,優(yōu)先級越高。I/O存儲器空間包含64個可以直接尋址的地址,作為CPU外設(shè)的控制寄存器、SPI,以及其他I/O功能。映射到數(shù)據(jù)空間即為寄存器文件之后的地址0x20-0x5F。3.3VS1003解碼芯片3.3.1VS1003簡介VS1003是由芬蘭VLSI公司出品的一款單芯片的MP3/WMA/MIDI音頻解碼和ADPCM編碼芯片,其擁有一個高性能低功耗的DSP處理器核VS_DSP,5K的指令RAM0.5K的數(shù)據(jù)RAM串行的控制和數(shù)據(jù)輸入接口,4個通用IO口,一個UART口;同時片內(nèi)帶有一個可變采樣率的ADC、一個立體聲DAC以及音頻耳機放大器。VS1003支持解碼格式:MP3(mpeg1和mpeg2,層3),MP3+V,WMA,WAV,MIDI,SP-MIDI。VS1003支持編碼格式:IMAADPCM(單聲道),麥克風(fēng)和線入(Lineinput)兩種輸入方式。VS1003共有16個16位的寄存器,地址分別為0x0–0xF;除了模式寄存器(MODE,0x0)和狀態(tài)寄存器(STATUS,0x1)在復(fù)位后的初始值分別為0x800和0x3C外,其余的寄存器在VS1003初始化后的值均為0。3.3.2VS1003結(jié)構(gòu)圖圖3.3VS1003結(jié)構(gòu)圖3.3.3VS1003特點解碼MP3(MPEG1&2音頻層III)(CBR+VBR+ABR),WMA4.0/4.1/7/8/9的所有配置文件(5-384kbit/s的),WAV(PCM+IMAADPCM);MIDI/SP-MIDI文件,對話筒輸入或線路輸入的音頻信號進(jìn)行IMAADPCM編碼,從麥克風(fēng)或線路輸入編碼IMAADPCM,流媒體支持,低音和高音控制,使用一個12-13MHz的時鐘,內(nèi)部PLL時鐘倍頻器,低功耗運行,內(nèi)含高性能片上立體聲數(shù)模轉(zhuǎn)換器,兩聲道間無相位差。3.3.4VS1003性能高品質(zhì)的片上立體聲DAC,沒有通道之間的相位誤差,立體聲耳機驅(qū)動器能夠驅(qū)動30歐姆負(fù)載,獨立的工作電壓為模擬,數(shù)字和I/O,5.5KiB加入用戶代碼/數(shù)據(jù)的片上RAM,串行控制和數(shù)據(jù)接口,可以用來作為一個從屬協(xié)處理器,針對特殊應(yīng)用的SPI閃存啟動,特殊應(yīng)用的SPIFlash引導(dǎo),UART用于調(diào)試目的,新的功能可被添加與軟件和4的GPIO引腳。3.3.5VS1003工作原理音頻解碼模塊完成MCU從SD卡里讀取的數(shù)字MP3音頻數(shù)據(jù)流進(jìn)行解析、并轉(zhuǎn)化成模擬信號進(jìn)行輸出。在這里,系統(tǒng)使用VS1003音頻解碼芯片來實現(xiàn)音樂數(shù)據(jù)流的解析。VS1003是由芬蘭VLSI公司出品的一款單芯片的MP3/WMA音頻解碼芯片,其擁有一個高性能低功耗的DSP處理器核VS_DSP,5K的指令ROM,0.5K的數(shù)據(jù)RAM,串行的控制和數(shù)據(jù)輸入接口,4個通用I/O口,一個UART口,同時片內(nèi)帶有一個可變采樣速率的ADC、一個立體聲DAC以及音頻耳機放大器接口。VS1003與核心控制器Atmega16的數(shù)據(jù)通信是通過SPI總線方式進(jìn)行的。VS1003主要通過串行命令接口(SCI)和串行數(shù)據(jù)接口(SDI)來接收MSP430F149控制器的控制命令和MP3的數(shù)據(jù)。通過XCS、XDCS引腳的置高、置低來確認(rèn)是哪一個接口處于傳送狀態(tài)。對于VS1003芯片的功能控制,如初始化、軟復(fù)位、暫停、音量控制、播放時間的讀取等,均是通過SCI寫入到特定寄存器的內(nèi)容來實現(xiàn)的。兩條SCI指令之間要通過DREQ引腳信號判斷上次處理是否完成。該系統(tǒng)使用Atmega16內(nèi)部接口與VS1003進(jìn)行通信,下面介紹其引腳連接情況。PA3是VS1003的中斷請求引腳。當(dāng)VS1003內(nèi)部數(shù)據(jù)已處理完畢,需要新的數(shù)據(jù)時,將DREQ拉高。Atmega16根據(jù)這個信號來給VS1003發(fā)送新的數(shù)據(jù)流。PB13引腳連接到Atmega16內(nèi)部接口的時鐘(SCLK)信號線。PB14引腳連接到Atmega16內(nèi)部接口的主輸入從輸出(MISO)信號線。這里Atmega16是主設(shè)備,VS1003是從設(shè)備。數(shù)據(jù)流的傳輸方向是從VS1003傳輸給Atmega16。主要用于讀取VS1003的一些狀態(tài)和內(nèi)部寄存器值,比如寄存器測試返回的內(nèi)部寄存器的值。PB15引腳連接到Atmega16內(nèi)部接口的主輸出從輸入(MOSI)信號線。這里Atmega16是主設(shè)備,VS1003是從設(shè)備。數(shù)據(jù)流方向是從Atmega16傳輸給VS1003,主要傳輸給VS1003一些控制命令、MP3/WMA數(shù)據(jù)流等。PA1引腳低電平有效,如果拉低該引腳,那么通過SPI傳輸?shù)氖强刂菩盘?。控制信號包括讀寫VS1003的內(nèi)部寄存器、對VS1003進(jìn)行初始化、設(shè)置左右聲道音量等。PA2引腳低電平有效,如果拉低該引腳,那么通過SPI傳輸?shù)氖菙?shù)據(jù)信號。比如在向VS1003傳輸MP3/WMA的數(shù)據(jù)流時需要拉低該引腳。PA0引腳低電平有效,拉低該引腳則硬件復(fù)位VS1003芯片。3.4SD卡3.4.1SD卡簡介SD卡(SecureDigitalMemoryCard)是一種為滿足安全性、容量、性能和使用環(huán)境等各方面的需求而設(shè)計的一種新型存儲器件,SD卡允許在兩種模式下工作,即SD模式和SPI模式。3.4.2SD卡內(nèi)部結(jié)構(gòu)圖圖3.4SD卡結(jié)構(gòu)圖3.4.3SD卡引腳和功能CLK為時鐘信號引腳,每個時鐘周期傳輸一個命令或數(shù)據(jù)位,頻率可在0~25MHz之間變化,SD卡的總線管理器可以不受任何限制的自由產(chǎn)生0~25MHz的頻率;CMD為雙向命令和回復(fù)線,命令是一次主機到從卡操作的開始,命令可以是從主機到單卡尋址,也可以是到所有卡;回復(fù)是對之前命令的回答,回復(fù)可以來自單卡或所有卡;DAT0~3引腳為數(shù)據(jù)線,數(shù)據(jù)可以從卡傳向主機也可以從主機傳向卡。SD卡以命令形式來控制SD卡的讀寫等操作。可根據(jù)命令對多塊或單塊進(jìn)行讀寫操作。在SPI模式下其命令由6個字節(jié)構(gòu)成,其中高位在前。3.4.4SD卡引腳圖圖3.5SD卡引腳圖3.4.5SD卡引腳功能說明圖3.5SD卡引腳功能說明3.4.6SD卡工作原理SD卡是目前使用非常廣泛,比如在MP3,數(shù)碼相機,智能手機等都采用SD卡作為存儲設(shè)備。因此SD卡已經(jīng)成為時下最為通用的數(shù)據(jù)存儲卡。并且SD卡它價格低廉、存儲容量大、使用方便、通用性與安全性強等優(yōu)點。SD卡支持兩種總線方式:SD方式與SPI方式。其中SD方式采用6線制,而SPI方式采用4線制,采用單片機對SD卡進(jìn)行讀寫時一般都采用SPI模式??捎貌煌某跏蓟绞绞筍D卡工作于SD方式或SPI方式。在本設(shè)計中,音頻數(shù)據(jù)MP3文件是以SD卡為載體。所以在電路設(shè)計中必須含有讀取SD卡模塊。該系統(tǒng)使用Atmega16內(nèi)部接口SPI1與SD卡進(jìn)行通信,下面介紹其引腳連接情況。PE3引腳為低電平有效,連接到SD卡的片選引腳CD/DAT3。SPI在和SD卡進(jìn)行通信時,需要將PE3拉低才能對SD卡進(jìn)行操作。PA7引腳映射為Atmega16內(nèi)部接口的主輸出從輸入(MOSI)信號線。這里Atmega16是主設(shè)備,SD卡是設(shè)備。數(shù)據(jù)流的傳輸方向是從Atmega16傳輸給SD卡。該信號線用于傳輸一些控制命令來完成SD卡的操作,如讀、寫等。PA5引腳連接到Atmega16內(nèi)部接口時鐘(SCLK)信號線??稍O(shè)置SPI的時鐘頻率來調(diào)整讀取SD卡數(shù)據(jù)的快慢。PA6引腳已連接到Atmega16內(nèi)部接口的主輸入從輸出(MISO)信號線。數(shù)據(jù)的傳輸方向是從SD卡傳輸給Atmega16,主要返回SD卡的一些狀態(tài)、內(nèi)部寄存器值等。PC12引腳用于檢測SD卡是否完全插入。當(dāng)SD卡完全插入時,PC12為低電平,否則為高電平。3.5LCDYX12864顯示屏3.5.1YX12864簡介YX12864B是128×64點陣的漢字圖形型液晶顯示模塊,控制器ST7920。可顯示漢字及圖形,內(nèi)置8192個中文漢字(16X16點陣)、128個字符(8X16點陣)及64X256點陣顯示RAM(GDRAM)??膳cCPU直接接口,提供兩種界面來連接微處理機:8位并行及串行兩種連接方式。具有多種功能:光標(biāo)顯示、畫面移位、睡眠模式等。3.5.2YX12864顯示屏主要硬件接口圖3.6LCD顯示屏硬件接口3.5.3YX12864顯示屏引腳說明表3.1LCD引腳說明引腳名稱方向說明引腳名稱方向說明1VSS-GND11DB4I數(shù)據(jù)42VDD-+5V12DB5I數(shù)據(jù)53VO-懸空13DB6I數(shù)據(jù)64RS(CS)OH:DataL:Code14DB7I數(shù)據(jù)75R/WOH:ReadL:Write15PSB06E(SCLK)OEnableSignal16NC-空腳7DB0I數(shù)據(jù)017/RST0低電平8DB1I數(shù)據(jù)118VEE-Negative9DB2I數(shù)據(jù)219LEDA-背光正極10DB3I數(shù)據(jù)320LEDK-背光負(fù)極3.6紅外控制器3.6.1紅外控制簡介紅外遙控是一種無線、非接觸控制技術(shù),具有抗干擾能力強,信息傳輸可靠,功耗低,成本低,易實現(xiàn)等顯著優(yōu)點,被諸多電子設(shè)備特別是家用電器廣泛采用,并越來越多的應(yīng)用到計算機系統(tǒng)中。紅外遙控的發(fā)射電路是采用紅外發(fā)光二極管來發(fā)出經(jīng)過調(diào)制的紅外光波;紅外接收電路由紅外接收二極管、三極管或硅光電池組成,它們將紅外發(fā)射器發(fā)射的紅外光轉(zhuǎn)換為相應(yīng)的電信號,再送后置放大器。發(fā)射機一般由指令鍵(或操作桿)、指令編碼系統(tǒng)、調(diào)制電路、驅(qū)動電路、發(fā)射電路等幾部分組成。當(dāng)按下指令鍵或推動操作桿時,指令編碼電路產(chǎn)生所需的指令編碼信號,指令編碼信號對載波進(jìn)行調(diào)制,再由驅(qū)動電路進(jìn)行功率放大后由發(fā)射電路向外發(fā)射經(jīng)調(diào)制定的指令編碼信號。接收電路一般由接收電路、放大電路、調(diào)制電路、指令譯碼電路、驅(qū)動電路、執(zhí)行電路(機構(gòu))等幾部分組成。接收電路將發(fā)射器發(fā)出的已調(diào)制的編碼指令信號接收下來,并進(jìn)行放大后送解調(diào)電路,解調(diào)電路將已調(diào)制的指令編碼信號解調(diào)出來,即還原為編碼信號。指令譯碼器將編碼指令信號進(jìn)行譯碼,最后由驅(qū)動電路來驅(qū)動執(zhí)行電路實現(xiàn)各種指令的操作控制(機構(gòu))。紅外遙控的特點是不影響周邊環(huán)境、不干擾其它電器設(shè)備。由于其無法穿透墻壁,故不同房間的家用電器可使用通用的遙控器而不會產(chǎn)生相互干擾;電路調(diào)試簡單,只要按給定電路連接無誤,一般不需任何調(diào)試即可投入工作;編解碼容易,可進(jìn)行多路遙控。3.6.2紅外控制發(fā)送原理紅外發(fā)射端發(fā)送數(shù)據(jù)時,是將待發(fā)送的二進(jìn)制數(shù)據(jù)調(diào)制成一系列的脈沖串信號后發(fā)射出去。紅外載的PWM功能產(chǎn)生頻率為38K的載波信號。而PTD0為普通I/O,產(chǎn)生一定脈寬的方波信號,用來代表二進(jìn)制數(shù)字“1”或“0”。PTD4和PTD0通過或門輸出調(diào)制后的載波信號。在PTD0為低時,或門允許38K載波信號通過,而PTD0為高時,或門不允許38K載波信號通過,從而產(chǎn)生了時斷時續(xù)的紅外載波信號。3.6.3紅外控制接收原理紅外接收采用HS0038B紅外接收器,紅外接收電路的原理是:當(dāng)接收到38K的載波信號,HS0038B接收器會輸出低電平,否則輸出高電平,從而可以將“時斷時續(xù)”的紅外光信號解調(diào)成一定周期的連續(xù)方波信號,經(jīng)單片機處理,便可以恢復(fù)出原數(shù)據(jù)信號。HS0038B是能夠接收紅外信號的小型化接收器件,它的環(huán)氧包裝可以作為紅外過濾器,因此不需要再加紅外過濾裝置。HS0038B最主要的優(yōu)點是,即使在干擾很強的環(huán)境中,它的輸出還是很穩(wěn)定的。3.6.4紅外控制電路圖3.7紅外控制電路3.7MP3系統(tǒng)硬件總結(jié)本系統(tǒng)在硬件上分為6個模塊:微控制器Atmega16,解碼模塊VS1003,存儲模塊SD卡,紅外模塊,顯示屏模塊LCD,USB接口模塊。硬件元件連接圖見附錄Ⅰ。第4章MP3播放器軟件系統(tǒng)設(shè)計與實現(xiàn)4.1MP3播放器軟件總體設(shè)計流程MP3播放器的軟件結(jié)構(gòu)跟硬件是相對應(yīng)的,即每一個硬件部分都有相應(yīng)的軟件代碼,這是因為大多數(shù)的硬件部分都是數(shù)字可編程控制的。音樂播放器首先讀取存儲器上的音樂信號,再通過解碼器對信號進(jìn)行解碼分析,經(jīng)解碼的信號通過D/A轉(zhuǎn)換器將解碼出的數(shù)字信號轉(zhuǎn)換成模擬信號,然后把轉(zhuǎn)換后的模擬音頻放大,通過低通濾波后到音頻輸出。本系統(tǒng)的軟件設(shè)計包括VS1003驅(qū)動程序設(shè)計,SD卡驅(qū)動以及讀寫設(shè)計,F(xiàn)AT文件系統(tǒng)驅(qū)動設(shè)計,紅外遙控設(shè)計。MP3播放器總體設(shè)計流程圖見圖4.1。圖4.1軟件設(shè)計流程圖4.2VS1003音頻解碼芯片驅(qū)動程序設(shè)計在播放音樂前首先要對VS1003進(jìn)行一系列初始化,完成對VS1003的基本設(shè)置,才能正確的播放音頻文件。VS1003解碼芯片是通過SPI實現(xiàn)數(shù)據(jù)通信。第一步首先初始化與VS1003相連接的I/O接口,接著對VS1003進(jìn)行硬件復(fù)位和軟件復(fù)位,之后初始化VS1003內(nèi)部寄存器,最后向VS1003寫數(shù)據(jù),進(jìn)行音樂播放功能。如圖4.2所示。圖4.2VS1003解碼設(shè)計流程圖4.3SD卡存儲模塊驅(qū)動程序設(shè)計SD存儲了系統(tǒng)文件非常重要的信息,如果SD卡驅(qū)動出現(xiàn)問題,將直接導(dǎo)致系統(tǒng)崩潰。因此,SD卡驅(qū)動對系統(tǒng)來說至關(guān)重要。只要SD卡初始化成功,后面的處理就相對簡單了。SD卡有兩個可選的通信協(xié)議:SD模式和SPI模式。SD模式是SD卡標(biāo)準(zhǔn)的讀/寫方式,本系統(tǒng)選擇SPI模式讀取SD卡,因為SD卡在上電初期自動進(jìn)入SD總線模式在此模式下向SD卡發(fā)送復(fù)位命令,SD卡在接收復(fù)位命令過程中CS低電平有效,進(jìn)入SPI模式否則工作在SD模式。SD卡驅(qū)動流程圖見圖4.3。圖4.3SD卡驅(qū)動設(shè)計流程圖在SD卡初始化的時候注意SPI時鐘頻率一定不要超過400Khz,SIP在低速模式下,方便初始化的兼容性。4.4紅外遙控解碼模塊程序設(shè)計在同一個遙控電路中通常要使用實現(xiàn)不同的遙控功能或區(qū)分不同的機器類型,這樣就要求信號按一定的編碼傳送,編碼則會由編碼芯片或電路完成。對應(yīng)于編碼芯片通常會有相配對的解碼芯片或包含解碼模塊的應(yīng)用芯片。編碼中并沒有輸出反碼,無法通過正反碼相對比的方法來糾錯。在抗干擾方面除了做硬件上的抗干擾,解碼時軟件可以對引導(dǎo)碼和間隔碼做一定的檢查來更大程度的減少誤碼產(chǎn)生。本文的方法是當(dāng)有紅外信號觸發(fā)CPU中斷時,延時7ms(這個時間不能超過8.44ms)后判斷是否輸入引腳仍然是低電平,是則繼續(xù),否則退出中斷。接著用同樣的方法判斷引導(dǎo)碼的后半部分。這個電路連接PC串口后,可以用串口調(diào)試軟件,使用4800比特率來查看遙控的自定義碼(系統(tǒng)碼)和鍵碼。程序中只定義了1號和2號鍵來控制D2,D3的亮滅。該遙控的自定碼是02H。4.5LCD顯示屏模塊程序設(shè)計LCD顯示屏模塊有并行和串行兩種連接方式。LCD模塊控制芯片提供兩套控制命令。當(dāng)IC1在接受指令前,微處理器必須先確認(rèn)其內(nèi)部處于非忙碌狀態(tài),即讀取BF標(biāo)志時,BF需為零,方可接受新的指令;如果在送出一個指令前并不檢查BF標(biāo)志,那么在前一個指令和這個指令中間必須延長一段較長的時間,即是等待前一個指令確實執(zhí)行完成。LCD顯示屏流程見圖4.4。圖4.4LCD顯示屏程序設(shè)計流程圖第5章硬件調(diào)試和軟件調(diào)試5.1硬件調(diào)試硬件調(diào)試流程:第一步檢查電源指示燈是否能正常點亮,第二步檢查蜂鳴器是否能正常相應(yīng),第三步檢查顯示屏是否能正常顯示,第四步檢查VS1003解碼模塊是否正常,第五步檢查SD卡模塊是否正常,第六步檢查紅外模塊是否正常,第七步檢查將所有模塊連在一起檢查,是否可以正常工作。在硬件調(diào)試過程中主要注意一下幾個問題:(1)排除邏輯故障。這類故障出現(xiàn)的頻率比較高,其中包括搭錯線,短路,開路。排除這類問題首先將電路板對照原理圖檢查連著是否一致。我特別注意檢查了是否有短路和電源極性錯誤,重點檢查系統(tǒng)總線是否存在互相之間的短路或與其他信號線的短路。(2)排除元器件故。造成這類問題這要有兩個原因:一個是元器件買回來就是壞的了另一個是由于安裝錯誤,造成元器件燒壞。在確保安裝過程無誤的情況下檢查與元器件相連的元件是否可以正常工作。(3)排除電源故障。每次在上電之前一定一要檢查電源電壓的幅值和極性,否則很容易造成集成模塊的損壞,加電后一定檢查各器件引腳的電位,一般先檢查VCC和GND之間的電位。5.2軟件調(diào)試軟件編程測試重要的是調(diào)試程序中出現(xiàn)的問題,在軟件調(diào)試中經(jīng)常會遇到這幾個問題:1.硬件接口指令的使用錯誤。只用接口指令時一定要注意看芯片手冊確定接口寫法。2.語法錯誤。語法錯誤比較常見,并且很難查找,最好使用單步調(diào)試來查找問題。3.書寫錯誤。這類屬于隱藏問題,程序本身沒有問題,由于某些該大寫的沒大寫,或者英文輸入法和中文輸入法的差別導(dǎo)致,所以在調(diào)試過程中如果遇到程序本身沒有問題但就是無法運行下去,就一定要注意是不是某些歌符號寫錯了。第6章總結(jié)本次設(shè)計我采用了Atmega16單片機微控制器為核心展開對MP3播放器的設(shè)計,使用VS1003為解碼芯片,以及SD卡為存儲卡,采用紅外遙控和LCD顯示屏完成了本次MP3播放器的設(shè)計。在本次設(shè)計中,通過查閱大量資料,逐步完成各部分電路圖的設(shè)計以及程序代碼的編寫,并通過硬件調(diào)試成功實現(xiàn)了MP3的播放/暫停、上一曲/下一曲、聲音的調(diào)節(jié)等功能,通過這次畢業(yè)設(shè)計,使我對單片機的開發(fā)和C語言的編寫有了一定的了解,也鍛煉了自己的動手能力。由于本次設(shè)計中的許多芯片都是第一次使用,因此遇到了很多問題,并且在調(diào)試過程出現(xiàn)了許多錯誤,多虧在老師和同學(xué)細(xì)心的幫助下,最終實現(xiàn)了音樂播放器的各種功能,達(dá)到了設(shè)計的要求。通過這次畢業(yè)設(shè)計,我掌握了很多硬件和軟件等方面的知識,也學(xué)會了很多課本上沒有學(xué)會的東西,這為我以后的深入學(xué)習(xí)打下了堅實的基礎(chǔ),同時為我今后在工作方面的發(fā)展也有很大幫助。致謝從畢業(yè)論文選題之后,就開始積極準(zhǔn)備本次畢業(yè)設(shè)計所需要的各種硬件設(shè)備,學(xué)習(xí)所欠缺的知識,在設(shè)計過程中有很多想不到的地方,如果沒有安海龍老師的細(xì)心指教,以及同學(xué)的幫助,想要完成這個畢業(yè)設(shè)立是難以想象的。而且由于缺乏經(jīng)驗,實際應(yīng)用過程中遇到很多書本上沒有學(xué)過的情況,對虧了老師的耐心教導(dǎo),才能使的本次畢業(yè)設(shè)計順利進(jìn)行。非常感謝老師的幫助和教導(dǎo)。在寫論文中,得到了安海龍老師耐心的教導(dǎo),并且為我指出了多處錯誤,還給我提供了一些如何改正的建議。老師嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度和科學(xué)的教學(xué)方法對我起到了極大的幫助。從畢業(yè)設(shè)計選題到畢業(yè)設(shè)計完結(jié),安海龍老師始終細(xì)心的教導(dǎo)我,給我提供很多有幫助的指導(dǎo)。我再次向安海龍老師致以誠摯的謝意。同時也要感謝各位老師和同學(xué)們都給了我極大的支持,在畢業(yè)設(shè)計過程中提出了寶貴的意見和建議。感謝所有幫助過我的老師和同學(xué)們,謝謝大家。參考文獻(xiàn)[1]吳迅.用單片機設(shè)計音樂播放器[J].山東:電子世界,2009.6[2]李廣弟朱月秀.單片機基礎(chǔ)

[M].北京:北京航空航天大學(xué)出版社,2007.6:168~199[3]周立功.ARM微控制器基礎(chǔ)與實踐[M].北京航空航天大學(xué)出版社,2003.1:24~27[4]周立功.ARM嵌入式系統(tǒng)基礎(chǔ)教程[M].北京航空航天大學(xué)出版社,2008.9:103~124[5]電子學(xué)報李文明.AVR單片機讀寫SD卡技術(shù).電子測量與儀器學(xué)報[R].中國科學(xué)院,2007.6.[6]馬馳崔向唐建.MP3播放器解碼功能的實現(xiàn).沈陽:沈陽工業(yè)學(xué)院,2003.4:41-69.[7]余錫存曹國華.單片機原理及接口技術(shù).西安:西安電子科技大學(xué)出版社,2000.2:122-136.[8]馬延飛.MPEG音頻第Ⅲ層編碼的算法研究與硬件實現(xiàn).西安:西安電子科技大學(xué)出版社,2002.[9]徐波譯.C和指針[M].人民郵電出版社,2008:49~187[10]王飛飛別志遠(yuǎn).基于ARM平臺的MP3軟解碼算法研究與實現(xiàn)[期刊論文].電子設(shè)計工程,2012.附錄Ⅰ硬件接線圖圖1Atmega6接線圖圖2VS1003接線圖圖3SD卡接線圖圖4LCD顯示屏接線圖圖5紅外控制接線圖圖6附錄Ⅱ源程序#ifndef__VS1003_H_#define__VS1003_H_#defineVS1003B_XCS_H() PORTB|=_BV(PB1) //XCS#defineVS1003B_XCS_L() PORTB&=~_BV(PB1) //XCS#defineVS1003B_XDCS_H() PORTB|=_BV(PB2) //XDCS#defineVS1003B_XDCS_L() PORTB&=~_BV(PB2) //XDCS#defineVS1003B_XRESET_H() PORTB|=_BV(PB0);#defineVS1003B_XRESET_L() PORTB&=~_BV(PB0);//低復(fù)位#defineDREQbit() while(!(PINB&(1<<PB3))); //vs1003相關(guān)宏定義//VS1003內(nèi)部定義#defineVS_Write0x02//寫命令#defineVS_Read0x03//讀命令//VS1003寄存器定義#defineVS_MODE0x00//控制模式#defineVS_STATUS0x01//VS1003狀態(tài)#defineVS_BASS0x02//內(nèi)置高/低音增強器#defineVS_CLOCKF0x03//時鐘頻率+倍頻數(shù)#defineVS_DECODE_TIME0x04//每秒解碼次數(shù)#defineVS_AUDATA0x05//音頻數(shù)據(jù)#defineVS_WRAM0x06//RAM讀寫#defineVS_WRAMADDR0x07//RAM讀寫地址#defineVS_HDAT00x08//流頭數(shù)據(jù)0#defineVS_HDAT10x09//流頭數(shù)據(jù)1#defineVS_AIADDR0x0A//應(yīng)用程序起始地址#defineVS_VOL0x0B//音量控制#defineVS_AICTRL00x0C//應(yīng)用控制寄存器0#defineVS_AICTRL10x0D//應(yīng)用控制寄存器1#defineVS_AICTRL20x0E//應(yīng)用控制寄存器2#defineVS_AICTRL30x0F//應(yīng)用控制寄存器3externunsignedcharset_volume;externunsignedintVolume_Buf[10];externunsignedintSPI_WR(unsignedcharx);externvoidMSPI_init(void);externvoidMSPI_Low(void);//低速spiexternvoidMSPI_High(void);//高速spiexternvoidSPI_WriteByte(unsignedcharCH);//spi寫字節(jié)externunsignedcharSPI_ReadByte(void);//spi讀字節(jié)externvoidVS1003B_WriteCMD(unsignedcharaddr,unsignedintdat);//寫寄存器externunsignedintVS1003B_ReadCMD(unsignedcharaddr);//讀寄存器externvoidVS1003B_WriteDAT(unsignedchardat);//寫數(shù)據(jù),音樂數(shù)據(jù)externunsignedcharVS1003B_Init(void);//初始化externvoidVS1003B_SoftReset(void);//軟件復(fù)位externvoidLoadPatch(void);externvoidVS1003B_set_VOL(void);externvoidDISP_freq(void);externvoidDISP_decode_time(void);externvoidSine_Test(unsignedcharx);#endif#include<avr/io.h>#include<util/delay.h>#include"vs1003.h"#include"uart.h"unsignedcharset_volume=8;unsignedintVolume_Buf[10]={0xfefe,0x8080,0x7070,0x6060,0x5050,0x4040,0x2828,0x1818,0x0505,0x0101};unsignedintSPI_WR(unsignedcharx);voidMSPI_init(void);voidMSPI_Low(void);//低速spivoidMSPI_High(void);//高速spivoidSPI_WriteByte(unsignedcharCH);//spi寫字節(jié)unsignedcharSPI_ReadByte(void);//spi讀字節(jié)voidVS1003B_WriteCMD(unsignedcharaddr,unsignedintdat);//寫寄存器unsignedintVS1003B_ReadCMD(unsignedcharaddr);//讀寄存器voidVS1003B_WriteDAT(unsignedchardat);//寫數(shù)據(jù),音樂數(shù)據(jù)unsignedcharVS1003B_Init(void);//初始化voidVS1003B_SoftReset(void);//軟件復(fù)位voidLoadPatch(void);voidVS1003B_set_VOL(void);voidDISP_freq(void);voidDISP_decode_time(void);voidSine_Test(unsignedcharx);//==================================================================================================//==================================================================================================voidMSPI_Init(void)//SPI初始化{// DDRB|=_BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB5)|_BV(PB7); //XRST,XCS,MOSI,SCK設(shè)置輸出// DDRB&=~(_BV(PB6)|_BV(PB3)); //MISO,DREQ設(shè)置輸入 DDRB=0B10110111; PORTB=0xff; //設(shè)置上拉 SPCR=0; SPCR=(1<<SPE)|(1<<MSTR); //使能SPI,主機方式,MSB在前,模式0,64分頻. SPSR&=~_BV(SPI2X);}/*********************************************************************名稱:SPI低速運行*********************************************************************/voidMSPI_Low(void){ //EnableSPIinMasterModewithIDLElowandclockat8M/128 SPCR|=_BV(SPE)|_BV(SPR0)|_BV(SPR1)|_BV(MSTR); SPSR&=~_BV(SPI2X);}/*********************************************************************名稱:SPI高速運行描述:8M/2*********************************************************************/voidMSPI_High(void){ SPCR&=~(_BV(SPR0)|_BV(SPR1)); SPSR|=_BV(SPI2X);}unsignedintSPI_WR(unsignedcharx){ SPDR=x; while(!(SPSR&(1<<SPIF))); return(SPDR);}voidSPI_WriteByte(unsignedchardat)//通過SPI發(fā)送一個字節(jié)的數(shù)據(jù){ SPDR=dat; while(!(SPSR&(1<<SPIF)));}unsignedcharSPI_ReadByte(void)//通過SPI讀取一個字節(jié)的數(shù)據(jù){ SPI_WriteByte(0xff);//移8個脈沖,不一定是0xff,任意值都行 return(SPDR);}/*********************************************************************名稱:寫VS1003B寄存器描述:功能:返回值:輸入值:地址和數(shù)據(jù)*********************************************************************/voidVS1003B_WriteCMD(unsignedcharaddr,unsignedintdat){ DREQbit();//檢測DREQ是否忙 VS1003B_XDCS_H(); VS1003B_XCS_L(); SPI_WriteByte(2);//寫入0x02 SPI_WriteByte(addr); SPI_WriteByte(dat>>8);//高8位 SPI_WriteByte(dat);//低8位 VS1003B_XCS_H();}/*********************************************************************名稱:讀VS1003B寄存器描述:功能:返回值:數(shù)據(jù),int類型輸入值:地址*********************************************************************/unsignedintVS1003B_ReadCMD(unsignedcharaddr){ unsignedinttemp; DREQbit();//檢測DREQ是否忙 VS1003B_XDCS_H(); VS1003B_XCS_L(); SPI_WriteByte(VS_Read);//寫入0x03 SPI_WriteByte(addr);//寄存器地址 temp=SPI_ReadByte();//讀高字節(jié) temp<<=8; temp+=SPI_ReadByte();//讀低字節(jié) VS1003B_XCS_H(); returntemp;}/*********************************************************************名稱:給VS1003B寫入1字節(jié)的音樂數(shù)據(jù)描述:檢測DREQ忙功能:返回值:數(shù)據(jù),int類型輸入值:地址*********************************************************************/voidVS1003B_WriteDAT(unsignedchardat){ DREQbit();//檢測DREQ是否忙 SPI_WriteByte(dat);//送1字節(jié)數(shù)據(jù)}/*********************************************************************名稱:VS1003B初始化函數(shù)描述:功能:返回值:7meansfail,33isOK!輸入值:*********************************************************************/unsignedcharVS1003B_Init(void){ unsignedcharretry=0; MSPI_Init(); VS1003B_XCS_H(); VS1003B_XDCS_H(); VS1003B_XRESET_H(); _delay_ms(20); VS1003B_XRESET_L(); _delay_ms(20); VS1003B_XRESET_H();//reset _delay_ms(20);//延時 //delay VS1003B_WriteCMD(0x00,0x0804);//寫復(fù)位 //reset//軟起動一次就行 while(VS1003B_ReadCMD(VS_CLOCKF)!=0xc000)//寫時鐘寄存器 //setPLLregister { VS1003B_WriteCMD(VS_CLOCKF,0xc000);//一直寫到讀出值與寫入值一樣為止.0xc00isfowVS1003orhigherversion _delay_ms(20); if(retry++>20)return7; } VS1003B_WriteCMD(VS_VOL,Volume_Buf[set_volume]);//設(shè)置音量 VS1003B_WriteCMD(VS_BASS,0x7a7a); return0x33; //正常返回0x33.}/*********************************************************************名稱:VS1003B軟件復(fù)位 描述:功能:返回值:輸入值:*********************************************************************/voidVS1003B_SoftReset(void){ VS1003B_WriteCMD(0x00,0x0804);//寫復(fù)位 //reset _delay_ms(20);}/*********************************************************************名稱:VS1003B音量設(shè)置描述:根據(jù)set_volume,寫入對應(yīng)數(shù)組Volume_Buf[set_volume]的值功能:返回值:輸入值:*********************************************************************/voidVS1003B_set_VOL(void){ VS1003B_WriteCMD(VS_VOL,Volume_Buf[set_volume]);//設(shè)置音量}/*********************************************************************名稱:VS1003B正弦測試描述:功能:返回值:輸入值:*********************************************************************/voidSine_Test(unsignedcharx){ unsignedchari; VS1003B_WriteCMD(VS_VOL,0x6060); VS1003B_WriteCMD(0x00,0x0820); for(i=0;i<x;i++) { DREQbit(); VS1003B_XDCS_L(); SPI_WriteByte(0x53); SPI_WriteByte(0xef); SPI_WriteByte(0x6e); SPI_WriteByte(i); SPI_WriteByte(0); SPI_WriteByte(0); SPI_WriteByte(0); SPI_WriteByte(0); _delay_ms(44); SPI_WriteByte(0x45); SPI_WriteByte(0x78); SPI_WriteByte(0x69); SPI_WriteByte(0x74); SPI_WriteByte(0); SPI_WriteByte(0); SPI_WriteByte(0); SPI_WriteByte(0); VS1003B_XDCS_H(); _delay_ms(44); }}#ifndef__SD_SPI_H_#define__SD_SPI_H_#include<avr/io.h>#include<util/delay.h>#defineSET_SD_CS() PORTB|=_BV(PB4)#defineCLR_SD_CS() PORTB&=~_BV(PB4)#defineSET_SPI_MOSI() PORTB|=_BV(PB5)/*********************************定義全局變量******************************/externunsignedcharbuf[512]; //數(shù)據(jù)緩沖區(qū)externunsignedintk;externvoidSPI_Low(void); //SPI低速模式externvoidSPI_High(void); //SPI高速模式externvoidSPI_InitPort(void); //初始化externunsignedcharSPI_RW(unsignedchardat); //讀SPIexternunsignedcharSD_Write_com(unsignedchar*cmd); //寫SPIexternunsignedcharSD_Init(void); //SD卡初始化externunsignedcharSD_Write_Sector(unsignedlongaddr,unsignedchar*buffer); //寫一個扇區(qū)externunsignedcharSD_Read_Sector(unsignedlongaddr,unsignedchar*buffer); //讀一個扇區(qū)externunsignedcharSD_Read_Byte(unsignedlongaddr,unsignedchar*buffer,unsignedintBytes); //讀一個字節(jié)#endif#include"sd_spi.h"unsignedcharbuf[512]={}; //數(shù)據(jù)緩沖區(qū)unsignedintk;voidSPI_Low(void); //SPI低速模式voidSPI_High(void); //SPI高速模式voidSPI_IniPortt(void); //初始化unsignedcharSPI_RW(unsignedchardat); //讀SPIunsignedcharSD_Write_com(unsignedchar*cmd); //寫SPIunsignedcharSD_Init(void); //SD卡初始化unsignedcharSD_Write_Sector(unsignedlongaddr,unsignedchar*buffer); //寫一個扇區(qū)unsignedcharSD_Read_Sector(unsignedlongaddr,unsignedchar*buffer); //讀一個扇區(qū)unsignedcharSD_Read_Byte(unsignedlongaddr,unsignedchar*buffer,unsignedintBytes); //讀一個字節(jié) voidSPI_Low(void) //SPI低速模式,方便初始化兼容(<400KHz),{ SPCR=0; SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主機方式,MSB在前,模式0,128分頻 }voidSPI_High(void) //SPI高速模式{ SPCR=0; SPCR=(1<<SPE)|(1<<MSTR); //使能SPI,主機方式,MSB在前,模式0,4分頻,2倍頻 }voidSPI_InitPort(void){ DDRB=0b10110111; PORTB=0xff; //全部上拉。MISO設(shè)置輸入}/****************************************************************************函數(shù)功能:SPI讀寫入口參數(shù):出口參數(shù):****************************************************************************/ unsignedcharSPI_RW(unsignedchardat)//SPI讀寫1Byte(欲想讀之必先與之){ SPDR=dat; while(!(SPSR&(1<<SPIF))); return(SPDR);}/****************************************************************************函數(shù)功能:SPI寫命令入口參數(shù):出口參數(shù):****************************************************************************/ unsignedcharSD_Write_Com(unsignedchar*cmd){ unsignedchari,temp,retry; SET_SD_CS(); //關(guān)片選 SPI_RW(0XFF); //提高兼容性,如果沒有這里,有些SD卡可能不支持 CLR_SD_CS(); //開片選(后面的讀寫扇區(qū)可以省去開片選) asm("nop"); for(i=0;i<6;i++) //發(fā)送6字節(jié)命令幀(6*8=48位) { SPI_RW(*cmd); cmd++; } SPI_RW(0XFF); //寫入指令后附加8個時鐘脈沖 retry=0; do //不斷地讀 { temp=SPI_RW(0XFF); retry++; }while((temp==0XFF)&&(retry<254)); return(temp);}/****************************************************************************函數(shù)功能:SD卡初始化入口參數(shù):出口參數(shù):****************************************************************************/ unsignedcharSD_Init(void){ unsignedchari,temp; unsignedintretry; //重試次數(shù)16位數(shù)據(jù)(適應(yīng)大容量SD卡) unsignedcharCMD[]={0x40,0x00,0x00,0x00,0x00,0x95}; SPI_InitPort(); SPI_Low(); //SPI初始化低速模式 _delay_us(200); //WaitMMC/SDready... retry=0; do { SET_SD_CS(); for(i=0;i<0x0f;i++) { SPI_RW(0xff); //至少74個信號脈沖 } temp=SD_Write_Com(CMD); //寫入CMD0號命令,最大重試次數(shù)254 retry++; if(retry==600) { SET_SD_CS(); return(1); //寫入CMD0號命令錯誤 } }while(temp!=1); CMD[0]=0x41; //CMD1號命令 CMD[5]=0xFF; retry=0; do { temp=SD_Write_Com(CMD); retry++; if(retry>60000) //寫入CMD1號命令,最大重試次數(shù)60000 { SET_SD_CS(); //關(guān)閉片選 return(1); //寫CMD1命令失敗 } }while(temp!=0); SET_SD_CS(); //關(guān)閉片選 SPI_High(); //初始化成功,SPI高速模式 SET_SPI_MOSI(); //沒數(shù)據(jù)時SD_MI應(yīng)保持為高電平 return(0); //成功初始化 }/****************************************************************************函數(shù)功能:SD卡寫一個扇區(qū)入口參數(shù):出口參數(shù):****************************************************************************/ unsignedcharSD_Write_Sector(unsignedlongaddr,unsignedchar*buffer){//向SD卡中的指定地址的扇區(qū)寫入512個字節(jié),使用CMD24(24號命令,單塊寫命令) unsignedchartemp,retry; unsignedinti; unsignedcharcmd24[]={0x58,0x00,0x00,0x00,0x00,0xff}; addr<<=9;// addr=addr*512; //將塊地址(扇區(qū)地址)轉(zhuǎn)為字節(jié)地址(所以SD卡的最大容量為4G) cmd24[1]=((addr&0xFF000000)>>24); cmd24[2]=((addr&0x00FF0000)>>16); cmd24[3]=((addr&0x0000FF00)>>8);//cmd24[4]=((addr&0x000000FF)>>0); //可以省去 //CLR_SD_CS;//打開SD卡片選 retry=0; do {

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論