【正文】
。 /* 操作成功 */ printf(Error: %02X\n,(UINT16)iError)。i5。 if(i==ERR_FOUND_NAME) { printf(match file %04d: %s\n,(unsigned int)EnumCount, )。 //在屏幕第三行顯示 LCD12864_W_Word( 畢業(yè)設(shè)計 )。數(shù)據(jù)請求,在VS1003 的FIFO 在能夠接受數(shù)據(jù)的時候輸出高電平 spi_write([i])。 goto next。 // 關(guān)閉文件 mStopIfError(i)。void delay1(uint m) //延時程序 { uint i,j。 //11111ABC,RW(0),RS(1),0 SendByte(0xf0amp。 //復(fù)位 delay1(1)。 break。) { LCD12864_Write_Dat(Alphabet[i])。 //寫入需要顯示字符的低八位數(shù)據(jù)}/*****************************************************函數(shù)名稱:Display_HZ(unsigned char x,unsigned char y,unsigned char *HZ) 功能描述:指定位置顯示一行漢字函數(shù),可自動換行調(diào)用函數(shù):Set_Cursor(unsigned char x, unsigned char y); LCD12864_Write_Dat(unsigned char Data)。//寫指令或數(shù)據(jù)(1,數(shù)據(jù)) }}/********************************************************函數(shù)名稱:LCD12864_Clr() 調(diào)用函數(shù):LCD12864_W_Test(bit i,unsigned char word) *********************************************************/void LCD12864_Clr(){ LCD12864_W_Test(0,0x01)。 //重新設(shè)置顯示的起始地址 } }}/******************************************************函數(shù)名稱:Display_HZ(unsigned char x,unsigned char y,unsigned char *HZ) 功能描述:指定位置顯示漢字函數(shù)調(diào)用函數(shù):Set_Cursor(unsigned char x, unsigned char y); LCD12864_Write_Dat(unsigned char Data)。 參數(shù)說明:x為行號;y為列號 **************************************************/void Display_String(unsigned char x,unsigned char y,unsigned char *Alphabet){ unsigned char i=0。y *********************************************/void Set_Cursor(unsigned char x, unsigned char y){ unsigned char i。 }/****************液晶初始化漢字*************/Void initinal(void) //LCD字庫初始化程序 { delay1(40)。 //移出的位給R/W E = 1。sbit R/W=P3^4。 spi_write(0)。 delay(10)。i!=。 //在屏幕第一行左顯示 LCD12864_W_Word(歌曲名:)。 // 搜索文件名,*為通配符,適用于所有文件或者子目錄 [i] = 0xFF。 if(CH375DiskConnect()==ERR_SUCCESS) break。 iSource++。 // 音量 delay(10)。 spi_write(ldat)。 //復(fù)位sbit XCS =P2^3 。存在的問題:由于時間和自身知識掌握能力的關(guān)系,此次設(shè)計雖然達(dá)到了設(shè)計的基本要求,由于硬件條件和工具有限,本次設(shè)計在功能上還不是很齊全。 圖13 驅(qū)動安裝調(diào)試2)程序下載調(diào)試按照PL2303驅(qū)動手冊下載程序不能成功,認(rèn)為是最小系統(tǒng)模塊燒了,進(jìn)入串口數(shù)據(jù)測試沒有發(fā)現(xiàn)問題,重新連線搭建系統(tǒng),將STCISP單片機(jī)下載編程燒錄軟件下載按鈕下面的兩個方框打上對號,終于把程序下載進(jìn)了單片機(jī)。數(shù)據(jù)的寫入方法主要是看DREQ信號,在VS1003的FIFO能夠接受數(shù)據(jù)的時候輸出高電平。INT引腳和MCU的外部中斷輸入引腳相連,當(dāng)有U盤插入時INT變?yōu)榈碗娖接|發(fā)外部中斷,當(dāng)RD為高電平,且CS,WR和AO都為低電平時,D7~DO上的數(shù)據(jù)被寫入CH375芯片中;當(dāng)RD為高電平,且CS和WR都為低電平,AO為高電平時,D7~DO中的數(shù)據(jù)可作為命令碼寫入CH375芯片中;當(dāng)WR為高電平,且CS,RD和AO都為低電平時,CH375中的數(shù)據(jù)可以通過D7~DO輸出。隨著科學(xué)的發(fā)展,嵌入式系統(tǒng)復(fù)雜度的提高和EDA技術(shù)的發(fā)展,各種高級的EDA工具不斷推出,比如Keil、IAR、ADS等工具,這些工具不僅極大的方便了工程師的開發(fā),同時也為用C語言這種高級語言來編寫程序提供了有利的條件。如表3所示。通過調(diào)用各個子程序來完成系統(tǒng)的功能。輸入的比特流被解碼,然后通過一個數(shù)字音量控制器到達(dá)一個18位過采樣多位εΔDAC。 圖3 USB總線的通用接口芯片CH375電路接線圖CH375的USB主機(jī)方式支持常用的USB全速設(shè)備,外部單片機(jī)可以通過CH375按照相應(yīng)USB協(xié)議與USB設(shè)備通訊。 設(shè)計方案論證通過以上的理論分析,對本設(shè)計的所有的主要芯片有了初步的了解。本設(shè)計以STC12C5A60S2芯片作為主控制器,芬蘭VLSI公司的VS1003作為音頻解碼芯片,南京沁恒公司的CH375作為USB設(shè)備接口芯片,以U盤作為媒體存儲介質(zhì),LCD12864液晶屏作為顯示屏,來完成音樂播放器的功能。[關(guān)鍵詞]單片機(jī);音樂播放器;U盤文件讀?。灰纛l解碼 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。該播放器類似于個人計算機(jī)的音樂播放軟件,可識別、提取U盤所存儲的MPWMA或MIDI格式的文件并可自行完成音頻解碼數(shù)據(jù)處理,最后送揚聲器或耳機(jī)進(jìn)行播放。在USB主機(jī)方式下,CH375還提供了串行通信方式,通過串行輸入、串行輸出和中斷輸出與單片機(jī)/DSP/MCU等相連接。同時通過LCD顯示屏來顯示所播放的曲目。圖4 LCD12864顯示電路接線圖 按鍵控制電路按鍵控制電路,、。本質(zhì)是一個典型的調(diào)試窗口,主要包括以下幾個窗口,如圖7所示。INT引腳和MCU的外部中斷輸入引腳相連,當(dāng)有U盤插入時INT變?yōu)榈碗娖接|發(fā)外部中斷,當(dāng)RD為高電平,且CS,WR和AO都為低電平時,D7~DO上的數(shù)據(jù)被寫入CH375芯片中;當(dāng)RD為高電平,且CS和WR都為低電平,AO為高電平時,D7~DO中的數(shù)據(jù)可作為命令碼寫入CH375芯片中;當(dāng)WR為高電平,且CS,RD和AO都為低電平時,CH375中的數(shù)據(jù)可以通過D7~DO輸出[3]。SCLK有獨立的操作時序,當(dāng)多個連續(xù)的指令被送入時,指令執(zhí)行時間需要被考慮,需要等待上一個指令執(zhí)行完畢才送入下一個指令,因為ST7920內(nèi)部沒有傳送/接收緩沖區(qū)。這是CH375軟件開發(fā)十分顯著的優(yōu)點。下面是單片機(jī)針對U盤的以字節(jié)為單位進(jìn)行讀寫操作的流程,如圖10所示。在播放音樂的過程中,子程序循環(huán)判斷音樂是否播放結(jié)束。經(jīng)過分析將I/O資源分配簡化,把并行通信改為串行通信,簡化了線路,并且I/O端口分配也合理還留出了余量。 Display_Wele()。 //VS1003從高位開始寫入 CLK=1。 wr_mad(0x03,0xd0,0x00)。j!=0。 mStopIfError(i)。 while (CH375DiskConnect()==ERR_SUCCESS) mDelaymS(100)。 TotalCount = 6291456。 // 剩余數(shù)據(jù)較多,限制單次讀寫的長度不能超過 sizeof() else c=TotalCount。 delay(10)。 } } /************掃描按鍵結(jié)束********************/ if(c) { printf(\n)。 while(CH375DiskStatus=DISK_CONNECT ) { if (CH375DiskConnect()!=ERR_SUCCESS) break。j++)。 }/***********寫數(shù)據(jù)*********/void LCD12864_Write_Dat(uchar data1) { RS=1。 //大于100uS的延時程序 LCD12864_Write_Cmd(0x0C)。 //第四行 default : break。 //設(shè)置顯示的起始地址 while(Alphabet[i]!=39。) { LCD12864_Write_Dat(HZ[i++])。 //寫入需要顯示字符的低八位數(shù)據(jù) if((y+i)%16==0) //如果滿一行 { x++。) { LCD12864_Write_Dat(Alphabet[i])。 //確定列號 LCD12864_Write_Cmd(i)。 //大于100uS的延時程序 LCD12864_Write_Cmd(0x01)。 //11111ABC,RW(0),RS(1),0 SendByte(0xf0amp。 for(i=0。 if(Key1==0) { while(!Key1)。 break。 // 音量 delay(10)。 // 請求讀出幾十字節(jié)數(shù)據(jù) i=CH375By