【正文】
REQ為高時(shí)送下一個(gè)32Byte的數(shù)據(jù),直到發(fā)完為止。系統(tǒng)流程圖如圖12所示。就是在點(diǎn)擊下載時(shí),程序自動(dòng)把已打開在緩沖區(qū)的文件重新調(diào)入,這樣方便下載程序不用總要點(diǎn)打開文件來重新調(diào)入文件。同時(shí)檢驗(yàn)了我的理論知識(shí),也完善了我的知識(shí)體系。 (并行的指令/數(shù)據(jù)選擇信號(hào);串行的片選信號(hào)) LCD12864_RW(5)P34。 //播放MP3歌曲 }}include unsigned int VOL_VALUE=0x00。}SPI寫入數(shù)據(jù): void spi_write(unsigned char x){ unsigned char i=0。 while(!DREQ)。 //硬件復(fù)位 delay(100)。 wr_mad(0x05,0xbb,0x81)。 spi_write(0)。 for(j=200。}void mStopIfError(UINT8 iError){ if(iError==ERR_SUCCESS) return。 LCD12864_Write_Cmd(0x01)。 } } for(i=0。}endif printf(Open\n)。 if(i==ERR_MISS_FILE) break。 LCD12864_Write_Cmd(0x01)。 LCD12864_W_Test(0,0x88)。 // 請(qǐng)求讀出幾十字節(jié)數(shù)據(jù) i=CH375ByteRead()。 //DREQ =P1^3 。 // 音量 delay(10)。 } if(Key1==0) //下一曲功能 { while (!Key1)。 break。 i=CH375FileClose()。 if(Key1==0) { while(!Key1)。sbit RST=P1^4。 for(i=0。 SendByte(0xf8)。 //11111ABC,RW(0),RS(1),0 SendByte(0xf0amp。 //延時(shí) RST=0。 //大于100uS的延時(shí)程序 LCD12864_Write_Cmd(0x01)。 //第一行 case 0x01: i=0x90。 //確定列號(hào) LCD12864_Write_Cmd(i)。\039。) { LCD12864_Write_Dat(Alphabet[i])。 //寫入需要顯示漢字的高八位數(shù)據(jù) LCD12864_Write_Dat(HZ[1])。 //寫入需要顯示字符的低八位數(shù)據(jù) if((y+i)%16==0) //如果滿一行 { x++。 }顯示程序:include define uchar unsigned char //宏定義define uint unsigned int //宏定義/**********。) { LCD12864_Write_Dat(HZ[i++])。 參數(shù)說明:x;y ; *HZ *******************************************************/void Display_HZ(unsigned char x,unsigned char y,unsigned char *HZ){ Set_Cursor(x,y)。 //設(shè)置顯示的起始地址 while(Alphabet[i]!=39。 Set_Cursor(x,y)。 //第四行 default : break。 switch(x) //確定行號(hào) { case 0x00: i=0x80。 //大于100uS的延時(shí)程序 LCD12864_Write_Cmd(0x0C)。 //大于40MS的延時(shí)程序 PSB=1。 }/***********寫數(shù)據(jù)*********/void LCD12864_Write_Dat(uchar data1) { RS=1。 //高脈沖 E = 0。j++)。sbit E=P3^3。 while(CH375DiskStatus=DISK_CONNECT ) { if (CH375DiskConnect()!=ERR_SUCCESS) break。 } XDCS=1。 } } /************掃描按鍵結(jié)束********************/ if(c) { printf(\n)。 wr_mad(0x0b,VOL_VALUE,VOL_VALUE)。 delay(10)。i++) { DREQ=1。 // 剩余數(shù)據(jù)較多,限制單次讀寫的長度不能超過 sizeof() else c=TotalCount。 LCD12864_W_Test(0,0x94)。 TotalCount = 6291456。 CH375vFileSize=EnumCount。 while (CH375DiskConnect()==ERR_SUCCESS) mDelaymS(100)。 else //如果沒有U盤插入,直接跳到host函數(shù)最后面 { mDelaymS(100)。 mStopIfError(i)。 i++。j!=0。 spi_write(0)。 wr_mad(0x03,0xd0,0x00)。 XCS=1。 //VS1003從高位開始寫入 CLK=1。 //指令使能sbit XDCS =P2^2 。 Display_Wele()。但是設(shè)計(jì)過程中可能沒有完全考慮到整體的設(shè)計(jì)問題,如歌詞的顯示,在以后的設(shè)計(jì)過程中注意這些細(xì)節(jié)性的問題,在實(shí)際的應(yīng)用中盡可能的避免。經(jīng)過分析將I/O資源分配簡(jiǎn)化,把并行通信改為串行通信,簡(jiǎn)化了線路,并且I/O端口分配也合理還留出了余量。解釋一下打?qū)μ?hào)的作用。在播放音樂的過程中,子程序循環(huán)判斷音樂是否播放結(jié)束。每次可以寫入32個(gè)字節(jié)的數(shù)據(jù),因?yàn)閂S1003有32Byte的數(shù)據(jù)緩沖區(qū),而DREQ變低時(shí),單片機(jī)就要停止數(shù)據(jù)的發(fā)送[8]。下面是單片機(jī)針對(duì)U盤的以字節(jié)為單位進(jìn)行讀寫操作的流程,如圖10所示。子程序庫對(duì)U 盤文件的讀寫方式分為兩種:扇區(qū)模式和字節(jié)模式。這是CH375軟件開發(fā)十分顯著的優(yōu)點(diǎn)。但是這種開發(fā)方式隨著系統(tǒng)復(fù)雜度的增高也變的愈加吃力了,因?yàn)閷?duì)開發(fā)人員要熟悉芯片的內(nèi)部資源,能夠進(jìn)行寄存器配置,這樣就對(duì)工程師的要求比較高。SCLK有獨(dú)立的操作時(shí)序,當(dāng)多個(gè)連續(xù)的指令被送入時(shí),指令執(zhí)行時(shí)間需要被考慮,需要等待上一個(gè)指令執(zhí)行完畢才送入下一個(gè)指令,因?yàn)镾T7920內(nèi)部沒有傳送/接收緩沖區(qū)。表3 LCD12864使能信號(hào)E狀態(tài)執(zhí)行動(dòng)作結(jié)果高——低I/O緩沖——DR配合W進(jìn)行寫數(shù)據(jù)或指令高DR——I/O緩沖配合R進(jìn)行讀數(shù)據(jù)或指令低/低——高無動(dòng)作INT引腳和MCU的外部中斷輸入引腳相連,當(dāng)有U盤插入時(shí)INT變?yōu)榈碗娖接|發(fā)外部中斷,當(dāng)RD為高電平,且CS,WR和AO都為低電平時(shí),D7~DO上的數(shù)據(jù)被寫入CH375芯片中;當(dāng)RD為高電平,且CS和WR都為低電平,AO為高電平時(shí),D7~DO中的數(shù)據(jù)可作為命令碼寫入CH375芯片中;當(dāng)WR為高電平,且CS,RD和AO都為低電平時(shí),CH375中的數(shù)據(jù)可以通過D7~DO輸出[3]。該部分總體開發(fā)思路是,VSl003通過同步串行總線SPI與STC12C5A60S2進(jìn)行命令和數(shù)據(jù)的傳輸。本質(zhì)是一個(gè)典型的調(diào)試窗口,主要包括以下幾個(gè)窗口,如圖7所示。通過串行總線控制解碼器。圖4 LCD12864顯示電路接線圖 按鍵控制電路按鍵控制電路,、。CH375內(nèi)置了處理MassStorage海量存儲(chǔ)設(shè)備的專用通訊協(xié)議的固件外部單片機(jī)可以直接以扇區(qū)為基本單位讀寫常用的USB存儲(chǔ)設(shè)備(包括USB硬盤/USB閃存盤/U 盤)。同時(shí)通過LCD顯示屏來顯示所播放的曲目。本MP3播放系統(tǒng)以STC12C5A60S2為控制核心,不僅要管理USB總線的通用接口芯片CH37MP3解碼芯片VS100LCD12864液晶顯示屏和按鍵的處理,同時(shí)還要管理USB存儲(chǔ)設(shè)備中的文件系統(tǒng),查找文件等等。在USB主機(jī)方式下,CH375還提供了串行通信方式,通過串行輸入、串行輸出和中斷輸出與單片機(jī)/DSP/MCU等相連接。該設(shè)計(jì)具有四按鍵操作界面,界面顯示友好,支持MPWMA和MID音樂格式,該系統(tǒng)支持FAT32文件系統(tǒng),支持大容量U盤。該播放器類似于個(gè)人計(jì)算機(jī)的音樂播放軟件,可識(shí)別、提取U盤所存儲(chǔ)的MPWMA或MIDI格式的文件并可自行完成音頻解碼數(shù)據(jù)處理,最后送揚(yáng)聲器或耳機(jī)進(jìn)行播放。 music player。[關(guān)鍵詞]單片機(jī);音樂播放器;U盤文件讀??;音頻解碼 Software Design of Music Player Based on 51 MCUAutomation Specialty Hao ShuaichenAbstract:This topic finishes the software design of the music player based on the 51 microcontroller. The paper mainly introduces the method of identification, extraction and audio decoding program to the storing the U disk MP3, WMA or MIDI format file. At the same time the hardware debugging shows that the music player can select the songs and control the volume through the keyboard, at the same time through the screen display the song name. The sound can play through the speakers or headphones. The design basically realizes the function of music player.Key words:Single chip microputer。本設(shè)計(jì)以單片機(jī)為核心控制器,設(shè)計(jì)一個(gè)音樂播放器,主要完成U盤存儲(chǔ)的音頻文件數(shù)據(jù)提取及播放任務(wù)。本設(shè)計(jì)以STC12C5A60S2芯片作為主控制器,芬蘭VLSI公司的VS1003作為音頻解碼芯片,南京沁恒公司的CH375作為USB設(shè)備接口芯片,以U盤作為媒體存儲(chǔ)介質(zhì),LCD12864液晶屏作為顯示屏,來完成音樂播放器的功能。在本地端,CH375具有8位數(shù)據(jù)總線和讀、寫、片選控制線以及中斷輸出,可以方便地掛接到單片機(jī)/DSP/MCU等控制器的系統(tǒng)總線上。 設(shè)計(jì)方案論證通過以上的理論分析,對(duì)本設(shè)計(jì)的所有的主要芯片有了初步的了解。通過對(duì)按鈕的控制來實(shí)現(xiàn)對(duì)單片機(jī)要求播放的音樂,并通過放大電路和音頻設(shè)備輸出聲音。 圖3 USB總線的通用接口芯片CH375電路接線圖CH375的USB主機(jī)方式支持常用的USB全速設(shè)備,外部單片機(jī)可以通過CH375按照相應(yīng)USB協(xié)議與USB設(shè)備通訊。其接線圖如圖4所示。輸入的比特流被解碼,然后通過一個(gè)數(shù)字音量控制器到達(dá)一個(gè)18位過采樣多位εΔDAC。uVision2集成了C語言編譯器、宏編譯、鏈接/定位、以及HEX文件產(chǎn)生器[1]。通過調(diào)用各個(gè)子程序來完成系統(tǒng)的功能。本設(shè)計(jì)中CH375工作在USBHOST模式下,將8位并行數(shù)據(jù)線D0~D7與STC12C5A60S2的P0口相連,實(shí)現(xiàn)數(shù)據(jù)與命令的并行傳輸,CH375工作在主機(jī)方式MCU通過RD,WR,片選CS、中斷INT和地址線AO的綜合控制,完成與CH375的通訊,通過USB接口實(shí)現(xiàn)從U盤讀寫數(shù)據(jù)的功能。如表3所示。ST7920是12864的控制器,如果使用多個(gè)ST7920時(shí),CS被配合使用,CS為高電平有效。隨著科學(xué)的發(fā)展,嵌入式系統(tǒng)復(fù)雜度的提高和EDA技術(shù)的發(fā)展,各種高級(jí)的EDA工具不斷推出,比如Keil、IA