何諧+唐大權(quán)+張淑廷+陳雪
摘 要: 主要介紹一種基于51單片機(jī)的音樂播放器的硬件設(shè)計方法,并研究在FAT32文件系統(tǒng)下音樂播放器的程序設(shè)計。該音樂播放器采用STC12C5A60S2單片機(jī)為主控制器,SD卡作為音樂文件的存儲介質(zhì),VS1003芯片作為解碼器。STC12C5A60S2單片機(jī)從 SD卡中讀取音樂文件,并不斷將數(shù)據(jù)流傳送至VS1003解碼,最后連接耳機(jī)播放,同時STC12C5A60S2連接OLED液晶顯示屏實時顯示音樂播放信息。實驗表明,該音樂播放器連接耳機(jī)能流暢播放多種格式的音樂文件。
關(guān)鍵詞: STC12C5A60S2; 音樂播放器; FAT32文件系統(tǒng); 程序設(shè)計
中圖分類號: TN912.2?34 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2014)16?0011?03
Design of music player based on MCU STC12C5A60S2
HE Xie, TANG Da?quan, ZHANG Shu?ting, CHEN Xue
(Jiangyin Polytechnic College, Jiangyin, 214400, China)
Abstract: The hardware design method of the music player based on MCU STC12C5A60S2 is introduced in this paper. The program design of the music player based on principle of FAT32 file system is studied. In the music player, MCU STC12C5A60S2 is taken as a main controller, SD card as a memory medium of music files and VS1003 chip as a decoder unit. When the player is running, MCU STC12C5A60S2 reads the music file from the SD card and continuously transfers data flow to VS1003 for decoding. In the meantime, the OLED liquid crystal display shows the message of the music in real time. The tested results from experiments show the music player can play the music files in multiple formats fluently if the player is connected with ear phone.
Keywords: STC12C5A60S2; music player; FAT32 file system; program design
隨著電子科技的進(jìn)步,在生活中人們越來越多的使用便攜音樂播放器來欣賞音樂,這樣的音樂播放器以MP3播放器為主流,小巧便攜,但音質(zhì)不佳,容量有限,且不能兼容播放多種格式音樂文件[1]。本文采用STC 公司的微控制器STC12C5A60S2,結(jié)合解碼芯片VS1003進(jìn)行音樂文件的解碼、SD卡作為音樂文件的存儲介質(zhì)設(shè)計了一種可支持多種音樂格式的音樂播放器。為了使微控制器STC12C5A60S2能自動識別SD卡上的音樂文件,本文還研究了FAT32文件系統(tǒng)在基于51單片機(jī)的音樂播放器中的應(yīng)用。
1 系統(tǒng)硬件電路設(shè)計
1.1 單片機(jī) STC12C5A60S2
STC12C5A60S2是宏晶公司的高速 1T單片機(jī),具有一個時鐘/機(jī)器周期,增強(qiáng)型8051內(nèi)核,處理速度比傳統(tǒng)8051快8~12倍,該單片機(jī)時鐘從5~35 MHz可選,相當(dāng)于普通8051的60~420 MHz,運(yùn)行速度完全可以滿足各種音樂格式的解碼需要[2]。
STC12C5A60S2內(nèi)置60 KB FLASH存儲器和1 280 B大容量SRAM,滿足大型程序的設(shè)計要求。本文所設(shè)計的音樂播放器選擇其作為主控制器芯片,利用其2組I/O口模仿SPI接口,一組不斷讀取SD卡音頻文件送入緩存區(qū),另一組則將讀取的音頻數(shù)據(jù)流送至音頻解碼器VS1003進(jìn)行解碼,同時主控制器還負(fù)責(zé)人機(jī)交互,連接OLED顯示屏幕顯示歌曲信息,控制鍵盤用以選擇曲目。系統(tǒng)硬件結(jié)構(gòu)如圖1所示。
1.2 SD卡
SD卡存儲器是一種大容量、小尺寸便攜記憶卡,目前被廣泛應(yīng)用于數(shù)碼相機(jī)、PAD等設(shè)備,本音樂播放器選擇SD卡作為存儲裝置[3]。SD卡使用前應(yīng)通過讀卡器連接至計算機(jī),格式化為FAT32文件格式,同時將*.MP3,*.WAV,*.WMA格式的音樂文件復(fù)制到SD卡中。音樂播放器設(shè)計帶SD卡座,SD存儲卡的數(shù)據(jù)傳輸接口有SD和SPI兩種工作模式, SD模式是SD存儲卡的標(biāo)準(zhǔn)傳輸模式,需要6根信號線,SPI接口只需要4根信號線,是一種串行的數(shù)據(jù)傳輸方式,由于控制器接口數(shù)量的限制,這里采用SPI接口模式,將STC12C5A60S2單片機(jī)的4個I/O模擬成SPI總線與SD卡連接。
圖1 系統(tǒng)硬件結(jié)構(gòu)
SPI總線的MIS0,即主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出;SPI總線的MOSI,即主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入;SPI總線的時鐘信號SCK由主設(shè)備產(chǎn)生;CS為從設(shè)備片選信號,由主設(shè)備控制。在4線SPI模式下數(shù)據(jù)長度為8位,在SCK的上升沿將數(shù)據(jù)寫入,且高位在前[3]。
1.3 VS1003音頻解碼器
VS1003是荷蘭VLSI公司出品一款單芯片MP3/WMA/MIDI/WAV音頻解碼和ADPCM編碼芯片,擁有一個高新能DSP處理器核,5 KB的指令RAM,0.5 KB的數(shù)據(jù)RAM,通過SPI控制,芯片內(nèi)部帶有一個可變采樣率ADC,一個18位立體聲DAC和耳機(jī)放大器[4]。VS1003作為主控芯片的從機(jī)使用,STC12C5A60S2通過它的一組模擬SPI接口的I/O向VS1003不斷輸出音頻數(shù)據(jù)流,VS1003自動解碼,并連接外部功放和喇叭,就可以聽到所播放的音樂。
VS1003與單片機(jī)STC12C5A60S2的連接需要7個I/O口,XRST為VS1003的復(fù)位信號,當(dāng)DREQ引腳向主機(jī)發(fā)出請求數(shù)據(jù)信號時,主機(jī)才可以向VS1003發(fā)送數(shù)據(jù),XDCS和XCS分別為傳輸數(shù)據(jù)、命令時所對應(yīng)的片選信號,低有效,VS_MISO、VS_MOSI、VS_SCK為模擬的SPI接口[5]。單片機(jī)與VS1003以及SD卡的連接原理圖如圖2所示。
1.4 鍵盤與顯示
另外單片機(jī)STC12C5A60S2的P3.0,P3.1和P3.2口還連接三個獨立式按鍵,實現(xiàn)“播放/暫停、上一曲、下一曲的命令。當(dāng)前播放信息由128×64的OLED顯示屏來進(jìn)行顯示,主要顯示當(dāng)前播放歌曲名稱、播放進(jìn)度等信息。OLED顯示屏為自發(fā)光的二極管點陣,尺寸小,分辨率高,最大可顯示4行英文[6]。該OLED顯示屏的控制器為SSD1306,SSD1306可提供多種接口方式,這里采用8080并口方式與STC12C5A60S2單片機(jī)相連,共占用13個I/O口,其具體連接如圖3所示。
圖2 單片機(jī)與VS1003以及SD卡的連接
圖3 OLED液晶顯示屏與單片機(jī)的連接
OLED_CS是OLED的片選信號,OLED_RST為硬復(fù)位OLED,OLED_DC為命令/數(shù)據(jù)標(biāo)志(0:命令;1:數(shù)據(jù)),OLED_WR為向OLED寫入數(shù)據(jù),OLED_RD為從OLED讀取數(shù)據(jù), OLED_D0~OLED_D7為8位雙向數(shù)據(jù)線。當(dāng)需要寫入數(shù)據(jù)至OLED模塊時,先根據(jù)寫入的數(shù)據(jù)是數(shù)據(jù)還是命令,設(shè)置OLED_DC,然后OLED_CS置為低,選中OLED,由于是寫入操作,因此接著將OLED_WR置為低,隨后在OLED_WR的上升沿,將OLED_D0~OLED_D7的8位數(shù)據(jù)寫入到了OLED中去。由于VS1003芯片和OLED液晶屏的供電均為3.3 V,而STC12C5A60S2的工作電壓為5 V,因此還加入圖4所示的電源轉(zhuǎn)換電路,將5 V電壓轉(zhuǎn)換為3.3 V。
圖4 電源轉(zhuǎn)換電路
2 文件系統(tǒng)
當(dāng)SD卡被格式化為FAT32文件格式時,SD卡中的文件是按簇進(jìn)行劃分存儲的,為讀出文件,必須找到存放文件的所有簇,不同的簇具有不同的簇號,一般每個簇大小為4 KB,也就是8個扇區(qū),一個扇區(qū)的大小則為512 B。FAT32文件系統(tǒng)還將SD卡的邏輯盤空間劃分為三大部分:保留區(qū)、FAT表區(qū)(文件分配表區(qū))和DATA區(qū)[7]。
保留區(qū)中記錄著FAT32的大部分全局參數(shù),包括每扇區(qū)的字節(jié)數(shù)、每簇扇區(qū)數(shù)、保留扇區(qū)數(shù)、FAT表數(shù)、FAT區(qū)前隱扇區(qū)數(shù)、FAT表所占扇區(qū)數(shù)、第一個目錄的簇號等。FAT表區(qū)主要是FAT表,它是一個鏈?zhǔn)浇Y(jié)構(gòu),每4 B為一個FAT表項,從02簇開始,每個簇都依次對應(yīng)一個FAT表項內(nèi)容。如該簇未使用或已回收,相應(yīng)FAT表項內(nèi)容寫零,如果該簇是文件的最后一簇,F(xiàn)AT表項值為 0FFFFFFFH,,如果該簇不是文件的最后一簇,F(xiàn)AT表項值為該文件占用的下一個簇的簇號,文件占用的各簇構(gòu)成一個簇鏈,保存在FAT表中。因此,只要知道文件的起始簇號,就可以根據(jù)該鏈?zhǔn)浇Y(jié)構(gòu)找到整個文件。DATA區(qū)從02簇開始,可分為根目錄區(qū)和文件數(shù)據(jù)區(qū),根目錄區(qū)存放根目錄文件,每個文件目錄項占用32字節(jié),每個文件目錄項均描述了和文件相關(guān)的大部分信息,如文件名、文件創(chuàng)建時間、訪問時間、文件大小、文件起始簇號等[8]。解析出這些文件信息,特別是文件起始簇號,這樣單片機(jī)就可以根據(jù)FAT表訪問任意文件內(nèi)容。
3 系統(tǒng)軟件設(shè)計
設(shè)計該音樂播放器軟件系統(tǒng)應(yīng)設(shè)計解決以下幾大程序模塊:FAT32文件系統(tǒng)有關(guān)驅(qū)動程序,SD卡模塊驅(qū)動程序,VS1003模塊驅(qū)動程序,OLED驅(qū)動程序以及主程序模塊。
FAT32文件系統(tǒng)有關(guān)驅(qū)動程序主要是為了尋找到SD卡中的音樂文件及其相關(guān)信息,為此,必須定義和應(yīng)用一些必要的結(jié)構(gòu)體,包括 MBR(主引導(dǎo)記錄)結(jié)構(gòu)體struct PartSector,DPT(磁盤分區(qū)表)結(jié)構(gòu)體struct PartRecord ,BPB(BIOS參數(shù)塊)結(jié)構(gòu)體struct FAT32_BPB,文件目錄項結(jié)構(gòu)體struct direntry和文件信息結(jié)構(gòu)體struct FileInfo。解析這些結(jié)構(gòu)體的重要程序函數(shù)包括Get_File_Info()和尋找文件下一簇的程序GetNextCluster()等。
SD卡的驅(qū)動函數(shù)主要有:SD卡的初始化函數(shù)SD_Initialize(),給定扇區(qū)號讀扇區(qū)數(shù)據(jù)的函數(shù)SD_ReadDisk(),以及讀取SD卡CID信息和CSD信息的函數(shù)等。這些SD函數(shù)的底層均使用單片機(jī)I/O口模擬SPI來實現(xiàn)。
VS1003相關(guān)函數(shù)有VS1003的初始化函數(shù)VS_Init(),正弦波測試函數(shù)VS_Sine_Test(),VS1003軟硬復(fù)位函數(shù),調(diào)節(jié)音量、音調(diào)效果的函數(shù)set1003()。開啟VS1003播放音樂文件前必須進(jìn)行初始化和正弦波測試,然后為VS1003設(shè)置音量、音調(diào),在發(fā)生錯誤或兩首歌曲播放間隙進(jìn)行VS1003的軟硬件復(fù)位,同樣,VS1003相關(guān)函數(shù)的底層也均使用單片機(jī)I/O口模擬SPI來實現(xiàn)。
主程序在初始化之后首先計算出根目錄下音樂格式歌曲的總數(shù)目,隨后判斷按鍵狀態(tài),播放所選擇的歌曲。播放一首歌曲的程序流程圖如圖5所示:播放時,先利用FAT32函數(shù)Get_File_Info()解析文件信息結(jié)構(gòu)體FileInfoStruct,找到這首歌曲文件的起始簇號、歌曲名稱等信息。根據(jù)歌曲起始簇號調(diào)用SD函數(shù)SD_ReadDisk()按扇區(qū)讀取數(shù)據(jù)512 B,分兩次存入STM32F103RB中256 B大小的數(shù)據(jù)緩沖區(qū),緩沖區(qū)數(shù)據(jù)隨后立即發(fā)送給VS1003,控制器同時在OLED屏幕上實時顯示當(dāng)前歌曲的序號,歌曲名稱等信息。當(dāng)該簇所有扇區(qū)播放完畢,再利用FAT32函數(shù)GetNextCluster()在FAT表中繼續(xù)尋找下一簇簇號,直到簇鏈結(jié)束,一首歌曲也就播放完畢[8]。
圖5 播放歌曲程序流程圖
4 結(jié) 語
本文提出一種基于STC12C5A60S2單片機(jī)和VS1003解碼芯片的音樂播放器的硬件設(shè)計方法,并研究了在FAT32文件系統(tǒng)下音樂播放器的程序設(shè)計。經(jīng)過調(diào)試,該音樂播放器連接耳機(jī)能流暢播放出SD卡中的多種格式的音樂文件,MP3格式、WMA格式以及MIDI格式的文件均可播放,同時歌曲名稱、播放進(jìn)度等均可正確顯示至OLED屏幕。對于高采樣率的MP3文件,由于單片機(jī)本身時鐘頻率的限制,播放有卡頓現(xiàn)象,這可利用采樣率轉(zhuǎn)換軟件將采樣率降低至64 kb/s即可正常播放。
參考文獻(xiàn)
[1] 何立民.單片機(jī)高級教程[M].北京:北京航空航天大學(xué)出版社,2007.
[2] 劉軍.例說STM32[M].北京:北京航空航天大學(xué)出版社,2011.
[3] 張?zhí)煲?MP3播放器的設(shè)計[J].今日電子,2006(12):7?8.
[4] 唐繼賢.51單片機(jī)應(yīng)用系統(tǒng)開發(fā)實例精解[M].上海:科學(xué)技術(shù)出版社,2012.
[5] 李軍.便攜式MP3播放器的方案分析及其技術(shù)研究[J].電聲技術(shù),2004(7):27?29.
[6] 李寧.基于Cortex?M3的MP3播放器設(shè)計[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2009(2):48?50.
[7] 劉偉.數(shù)據(jù)恢復(fù)技術(shù)深度揭秘[M].北京:電子工業(yè)出版社,2010.
[8] 楊明極.嵌入式系統(tǒng)中SD卡的FAT32文件系統(tǒng)的設(shè)計[J].電聲技術(shù),2010(4):36?38.
[9] 戴士劍,涂彥輝.數(shù)據(jù)恢復(fù)技術(shù)[M].2版.北京:電子工業(yè)出版社,2007.
主程序在初始化之后首先計算出根目錄下音樂格式歌曲的總數(shù)目,隨后判斷按鍵狀態(tài),播放所選擇的歌曲。播放一首歌曲的程序流程圖如圖5所示:播放時,先利用FAT32函數(shù)Get_File_Info()解析文件信息結(jié)構(gòu)體FileInfoStruct,找到這首歌曲文件的起始簇號、歌曲名稱等信息。根據(jù)歌曲起始簇號調(diào)用SD函數(shù)SD_ReadDisk()按扇區(qū)讀取數(shù)據(jù)512 B,分兩次存入STM32F103RB中256 B大小的數(shù)據(jù)緩沖區(qū),緩沖區(qū)數(shù)據(jù)隨后立即發(fā)送給VS1003,控制器同時在OLED屏幕上實時顯示當(dāng)前歌曲的序號,歌曲名稱等信息。當(dāng)該簇所有扇區(qū)播放完畢,再利用FAT32函數(shù)GetNextCluster()在FAT表中繼續(xù)尋找下一簇簇號,直到簇鏈結(jié)束,一首歌曲也就播放完畢[8]。
圖5 播放歌曲程序流程圖
4 結(jié) 語
本文提出一種基于STC12C5A60S2單片機(jī)和VS1003解碼芯片的音樂播放器的硬件設(shè)計方法,并研究了在FAT32文件系統(tǒng)下音樂播放器的程序設(shè)計。經(jīng)過調(diào)試,該音樂播放器連接耳機(jī)能流暢播放出SD卡中的多種格式的音樂文件,MP3格式、WMA格式以及MIDI格式的文件均可播放,同時歌曲名稱、播放進(jìn)度等均可正確顯示至OLED屏幕。對于高采樣率的MP3文件,由于單片機(jī)本身時鐘頻率的限制,播放有卡頓現(xiàn)象,這可利用采樣率轉(zhuǎn)換軟件將采樣率降低至64 kb/s即可正常播放。
參考文獻(xiàn)
[1] 何立民.單片機(jī)高級教程[M].北京:北京航空航天大學(xué)出版社,2007.
[2] 劉軍.例說STM32[M].北京:北京航空航天大學(xué)出版社,2011.
[3] 張?zhí)煲?MP3播放器的設(shè)計[J].今日電子,2006(12):7?8.
[4] 唐繼賢.51單片機(jī)應(yīng)用系統(tǒng)開發(fā)實例精解[M].上海:科學(xué)技術(shù)出版社,2012.
[5] 李軍.便攜式MP3播放器的方案分析及其技術(shù)研究[J].電聲技術(shù),2004(7):27?29.
[6] 李寧.基于Cortex?M3的MP3播放器設(shè)計[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2009(2):48?50.
[7] 劉偉.數(shù)據(jù)恢復(fù)技術(shù)深度揭秘[M].北京:電子工業(yè)出版社,2010.
[8] 楊明極.嵌入式系統(tǒng)中SD卡的FAT32文件系統(tǒng)的設(shè)計[J].電聲技術(shù),2010(4):36?38.
[9] 戴士劍,涂彥輝.數(shù)據(jù)恢復(fù)技術(shù)[M].2版.北京:電子工業(yè)出版社,2007.
主程序在初始化之后首先計算出根目錄下音樂格式歌曲的總數(shù)目,隨后判斷按鍵狀態(tài),播放所選擇的歌曲。播放一首歌曲的程序流程圖如圖5所示:播放時,先利用FAT32函數(shù)Get_File_Info()解析文件信息結(jié)構(gòu)體FileInfoStruct,找到這首歌曲文件的起始簇號、歌曲名稱等信息。根據(jù)歌曲起始簇號調(diào)用SD函數(shù)SD_ReadDisk()按扇區(qū)讀取數(shù)據(jù)512 B,分兩次存入STM32F103RB中256 B大小的數(shù)據(jù)緩沖區(qū),緩沖區(qū)數(shù)據(jù)隨后立即發(fā)送給VS1003,控制器同時在OLED屏幕上實時顯示當(dāng)前歌曲的序號,歌曲名稱等信息。當(dāng)該簇所有扇區(qū)播放完畢,再利用FAT32函數(shù)GetNextCluster()在FAT表中繼續(xù)尋找下一簇簇號,直到簇鏈結(jié)束,一首歌曲也就播放完畢[8]。
圖5 播放歌曲程序流程圖
4 結(jié) 語
本文提出一種基于STC12C5A60S2單片機(jī)和VS1003解碼芯片的音樂播放器的硬件設(shè)計方法,并研究了在FAT32文件系統(tǒng)下音樂播放器的程序設(shè)計。經(jīng)過調(diào)試,該音樂播放器連接耳機(jī)能流暢播放出SD卡中的多種格式的音樂文件,MP3格式、WMA格式以及MIDI格式的文件均可播放,同時歌曲名稱、播放進(jìn)度等均可正確顯示至OLED屏幕。對于高采樣率的MP3文件,由于單片機(jī)本身時鐘頻率的限制,播放有卡頓現(xiàn)象,這可利用采樣率轉(zhuǎn)換軟件將采樣率降低至64 kb/s即可正常播放。
參考文獻(xiàn)
[1] 何立民.單片機(jī)高級教程[M].北京:北京航空航天大學(xué)出版社,2007.
[2] 劉軍.例說STM32[M].北京:北京航空航天大學(xué)出版社,2011.
[3] 張?zhí)煲?MP3播放器的設(shè)計[J].今日電子,2006(12):7?8.
[4] 唐繼賢.51單片機(jī)應(yīng)用系統(tǒng)開發(fā)實例精解[M].上海:科學(xué)技術(shù)出版社,2012.
[5] 李軍.便攜式MP3播放器的方案分析及其技術(shù)研究[J].電聲技術(shù),2004(7):27?29.
[6] 李寧.基于Cortex?M3的MP3播放器設(shè)計[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2009(2):48?50.
[7] 劉偉.數(shù)據(jù)恢復(fù)技術(shù)深度揭秘[M].北京:電子工業(yè)出版社,2010.
[8] 楊明極.嵌入式系統(tǒng)中SD卡的FAT32文件系統(tǒng)的設(shè)計[J].電聲技術(shù),2010(4):36?38.
[9] 戴士劍,涂彥輝.數(shù)據(jù)恢復(fù)技術(shù)[M].2版.北京:電子工業(yè)出版社,2007.