何谐+唐大权+张淑廷+陈雪
摘 要: 主要介绍一种基于51单片机的音乐播放器的硬件设计方法,并研究在FAT32文件系统下音乐播放器的程序设计。该音乐播放器采用STC12C5A60S2单片机为主控制器,SD卡作为音乐文件的存储介质,VS1003芯片作为解码器。STC12C5A60S2单片机从 SD卡中读取音乐文件,并不断将数据流传送至VS1003解码,最后连接耳机播放,同时STC12C5A60S2连接OLED液晶显示屏实时显示音乐播放信息。实验表明,该音乐播放器连接耳机能流畅播放多种格式的音乐文件。
关键词: STC12C5A60S2; 音乐播放器; FAT32文件系统; 程序设计
中图分类号: TN912.2?34 文献标识码: 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
随着电子科技的进步,在生活中人们越来越多的使用便携音乐播放器来欣赏音乐,这样的音乐播放器以MP3播放器为主流,小巧便携,但音质不佳,容量有限,且不能兼容播放多种格式音乐文件[1]。本文采用STC 公司的微控制器STC12C5A60S2,结合解码芯片VS1003进行音乐文件的解码、SD卡作为音乐文件的存储介质设计了一种可支持多种音乐格式的音乐播放器。为了使微控制器STC12C5A60S2能自动识别SD卡上的音乐文件,本文还研究了FAT32文件系统在基于51单片机的音乐播放器中的应用。
1 系统硬件电路设计
1.1 单片机 STC12C5A60S2
STC12C5A60S2是宏晶公司的高速 1T单片机,具有一个时钟/机器周期,增强型8051内核,处理速度比传统8051快8~12倍,该单片机时钟从5~35 MHz可选,相当于普通8051的60~420 MHz,运行速度完全可以满足各种音乐格式的解码需要[2]。
STC12C5A60S2内置60 KB FLASH存储器和1 280 B大容量SRAM,满足大型程序的设计要求。本文所设计的音乐播放器选择其作为主控制器芯片,利用其2组I/O口模仿SPI接口,一组不断读取SD卡音频文件送入缓存区,另一组则将读取的音频数据流送至音频解码器VS1003进行解码,同时主控制器还负责人机交互,连接OLED显示屏幕显示歌曲信息,控制键盘用以选择曲目。系统硬件结构如图1所示。
1.2 SD卡
SD卡存储器是一种大容量、小尺寸便携记忆卡,目前被广泛应用于数码相机、PAD等设备,本音乐播放器选择SD卡作为存储装置[3]。SD卡使用前应通过读卡器连接至计算机,格式化为FAT32文件格式,同时将*.MP3,*.WAV,*.WMA格式的音乐文件复制到SD卡中。音乐播放器设计带SD卡座,SD存储卡的数据传输接口有SD和SPI两种工作模式, SD模式是SD存储卡的标准传输模式,需要6根信号线,SPI接口只需要4根信号线,是一种串行的数据传输方式,由于控制器接口数量的限制,这里采用SPI接口模式,将STC12C5A60S2单片机的4个I/O模拟成SPI总线与SD卡连接。
图1 系统硬件结构
SPI总线的MIS0,即主设备数据输入,从设备数据输出;SPI总线的MOSI,即主设备数据输出,从设备数据输入;SPI总线的时钟信号SCK由主设备产生;CS为从设备片选信号,由主设备控制。在4线SPI模式下数据长度为8位,在SCK的上升沿将数据写入,且高位在前[3]。
1.3 VS1003音频解码器
VS1003是荷兰VLSI公司出品一款单芯片MP3/WMA/MIDI/WAV音频解码和ADPCM编码芯片,拥有一个高新能DSP处理器核,5 KB的指令RAM,0.5 KB的数据RAM,通过SPI控制,芯片内部带有一个可变采样率ADC,一个18位立体声DAC和耳机放大器[4]。VS1003作为主控芯片的从机使用,STC12C5A60S2通过它的一组模拟SPI接口的I/O向VS1003不断输出音频数据流,VS1003自动解码,并连接外部功放和喇叭,就可以听到所播放的音乐。
VS1003与单片机STC12C5A60S2的连接需要7个I/O口,XRST为VS1003的复位信号,当DREQ引脚向主机发出请求数据信号时,主机才可以向VS1003发送数据,XDCS和XCS分别为传输数据、命令时所对应的片选信号,低有效,VS_MISO、VS_MOSI、VS_SCK为模拟的SPI接口[5]。单片机与VS1003以及SD卡的连接原理图如图2所示。
1.4 键盘与显示
另外单片机STC12C5A60S2的P3.0,P3.1和P3.2口还连接三个独立式按键,实现“播放/暂停、上一曲、下一曲的命令。当前播放信息由128×64的OLED显示屏来进行显示,主要显示当前播放歌曲名称、播放进度等信息。OLED显示屏为自发光的二极管点阵,尺寸小,分辨率高,最大可显示4行英文[6]。该OLED显示屏的控制器为SSD1306,SSD1306可提供多种接口方式,这里采用8080并口方式与STC12C5A60S2单片机相连,共占用13个I/O口,其具体连接如图3所示。
图2 单片机与VS1003以及SD卡的连接
图3 OLED液晶显示屏与单片机的连接
OLED_CS是OLED的片选信号,OLED_RST为硬复位OLED,OLED_DC为命令/数据标志(0:命令;1:数据),OLED_WR为向OLED写入数据,OLED_RD为从OLED读取数据, OLED_D0~OLED_D7为8位双向数据线。当需要写入数据至OLED模块时,先根据写入的数据是数据还是命令,设置OLED_DC,然后OLED_CS置为低,选中OLED,由于是写入操作,因此接着将OLED_WR置为低,随后在OLED_WR的上升沿,将OLED_D0~OLED_D7的8位数据写入到了OLED中去。由于VS1003芯片和OLED液晶屏的供电均为3.3 V,而STC12C5A60S2的工作电压为5 V,因此还加入图4所示的电源转换电路,将5 V电压转换为3.3 V。
图4 电源转换电路
2 文件系统
当SD卡被格式化为FAT32文件格式时,SD卡中的文件是按簇进行划分存储的,为读出文件,必须找到存放文件的所有簇,不同的簇具有不同的簇号,一般每个簇大小为4 KB,也就是8个扇区,一个扇区的大小则为512 B。FAT32文件系统还将SD卡的逻辑盘空间划分为三大部分:保留区、FAT表区(文件分配表区)和DATA区[7]。
保留区中记录着FAT32的大部分全局参数,包括每扇区的字节数、每簇扇区数、保留扇区数、FAT表数、FAT区前隐扇区数、FAT表所占扇区数、第一个目录的簇号等。FAT表区主要是FAT表,它是一个链式结构,每4 B为一个FAT表项,从02簇开始,每个簇都依次对应一个FAT表项内容。如该簇未使用或已回收,相应FAT表项内容写零,如果该簇是文件的最后一簇,FAT表项值为 0FFFFFFFH,,如果该簇不是文件的最后一簇,FAT表项值为该文件占用的下一个簇的簇号,文件占用的各簇构成一个簇链,保存在FAT表中。因此,只要知道文件的起始簇号,就可以根据该链式结构找到整个文件。DATA区从02簇开始,可分为根目录区和文件数据区,根目录区存放根目录文件,每个文件目录项占用32字节,每个文件目录项均描述了和文件相关的大部分信息,如文件名、文件创建时间、访问时间、文件大小、文件起始簇号等[8]。解析出这些文件信息,特别是文件起始簇号,这样单片机就可以根据FAT表访问任意文件内容。
3 系统软件设计
设计该音乐播放器软件系统应设计解决以下几大程序模块:FAT32文件系统有关驱动程序,SD卡模块驱动程序,VS1003模块驱动程序,OLED驱动程序以及主程序模块。
FAT32文件系统有关驱动程序主要是为了寻找到SD卡中的音乐文件及其相关信息,为此,必须定义和应用一些必要的结构体,包括 MBR(主引导记录)结构体struct PartSector,DPT(磁盘分区表)结构体struct PartRecord ,BPB(BIOS参数块)结构体struct FAT32_BPB,文件目录项结构体struct direntry和文件信息结构体struct FileInfo。解析这些结构体的重要程序函数包括Get_File_Info()和寻找文件下一簇的程序GetNextCluster()等。
SD卡的驱动函数主要有:SD卡的初始化函数SD_Initialize(),给定扇区号读扇区数据的函数SD_ReadDisk(),以及读取SD卡CID信息和CSD信息的函数等。这些SD函数的底层均使用单片机I/O口模拟SPI来实现。
VS1003相关函数有VS1003的初始化函数VS_Init(),正弦波测试函数VS_Sine_Test(),VS1003软硬复位函数,调节音量、音调效果的函数set1003()。开启VS1003播放音乐文件前必须进行初始化和正弦波测试,然后为VS1003设置音量、音调,在发生错误或两首歌曲播放间隙进行VS1003的软硬件复位,同样,VS1003相关函数的底层也均使用单片机I/O口模拟SPI来实现。
主程序在初始化之后首先计算出根目录下音乐格式歌曲的总数目,随后判断按键状态,播放所选择的歌曲。播放一首歌曲的程序流程图如图5所示:播放时,先利用FAT32函数Get_File_Info()解析文件信息结构体FileInfoStruct,找到这首歌曲文件的起始簇号、歌曲名称等信息。根据歌曲起始簇号调用SD函数SD_ReadDisk()按扇区读取数据512 B,分两次存入STM32F103RB中256 B大小的数据缓冲区,缓冲区数据随后立即发送给VS1003,控制器同时在OLED屏幕上实时显示当前歌曲的序号,歌曲名称等信息。当该簇所有扇区播放完毕,再利用FAT32函数GetNextCluster()在FAT表中继续寻找下一簇簇号,直到簇链结束,一首歌曲也就播放完毕[8]。
图5 播放歌曲程序流程图
4 结 语
本文提出一种基于STC12C5A60S2单片机和VS1003解码芯片的音乐播放器的硬件设计方法,并研究了在FAT32文件系统下音乐播放器的程序设计。经过调试,该音乐播放器连接耳机能流畅播放出SD卡中的多种格式的音乐文件,MP3格式、WMA格式以及MIDI格式的文件均可播放,同时歌曲名称、播放进度等均可正确显示至OLED屏幕。对于高采样率的MP3文件,由于单片机本身时钟频率的限制,播放有卡顿现象,这可利用采样率转换软件将采样率降低至64 kb/s即可正常播放。
参考文献
[1] 何立民.单片机高级教程[M].北京:北京航空航天大学出版社,2007.
[2] 刘军.例说STM32[M].北京:北京航空航天大学出版社,2011.
[3] 张天益.MP3播放器的设计[J].今日电子,2006(12):7?8.
[4] 唐继贤.51单片机应用系统开发实例精解[M].上海:科学技术出版社,2012.
[5] 李军.便携式MP3播放器的方案分析及其技术研究[J].电声技术,2004(7):27?29.
[6] 李宁.基于Cortex?M3的MP3播放器设计[J].单片机与嵌入式系统应用,2009(2):48?50.
[7] 刘伟.数据恢复技术深度揭秘[M].北京:电子工业出版社,2010.
[8] 杨明极.嵌入式系统中SD卡的FAT32文件系统的设计[J].电声技术,2010(4):36?38.
[9] 戴士剑,涂彦辉.数据恢复技术[M].2版.北京:电子工业出版社,2007.
主程序在初始化之后首先计算出根目录下音乐格式歌曲的总数目,随后判断按键状态,播放所选择的歌曲。播放一首歌曲的程序流程图如图5所示:播放时,先利用FAT32函数Get_File_Info()解析文件信息结构体FileInfoStruct,找到这首歌曲文件的起始簇号、歌曲名称等信息。根据歌曲起始簇号调用SD函数SD_ReadDisk()按扇区读取数据512 B,分两次存入STM32F103RB中256 B大小的数据缓冲区,缓冲区数据随后立即发送给VS1003,控制器同时在OLED屏幕上实时显示当前歌曲的序号,歌曲名称等信息。当该簇所有扇区播放完毕,再利用FAT32函数GetNextCluster()在FAT表中继续寻找下一簇簇号,直到簇链结束,一首歌曲也就播放完毕[8]。
图5 播放歌曲程序流程图
4 结 语
本文提出一种基于STC12C5A60S2单片机和VS1003解码芯片的音乐播放器的硬件设计方法,并研究了在FAT32文件系统下音乐播放器的程序设计。经过调试,该音乐播放器连接耳机能流畅播放出SD卡中的多种格式的音乐文件,MP3格式、WMA格式以及MIDI格式的文件均可播放,同时歌曲名称、播放进度等均可正确显示至OLED屏幕。对于高采样率的MP3文件,由于单片机本身时钟频率的限制,播放有卡顿现象,这可利用采样率转换软件将采样率降低至64 kb/s即可正常播放。
参考文献
[1] 何立民.单片机高级教程[M].北京:北京航空航天大学出版社,2007.
[2] 刘军.例说STM32[M].北京:北京航空航天大学出版社,2011.
[3] 张天益.MP3播放器的设计[J].今日电子,2006(12):7?8.
[4] 唐继贤.51单片机应用系统开发实例精解[M].上海:科学技术出版社,2012.
[5] 李军.便携式MP3播放器的方案分析及其技术研究[J].电声技术,2004(7):27?29.
[6] 李宁.基于Cortex?M3的MP3播放器设计[J].单片机与嵌入式系统应用,2009(2):48?50.
[7] 刘伟.数据恢复技术深度揭秘[M].北京:电子工业出版社,2010.
[8] 杨明极.嵌入式系统中SD卡的FAT32文件系统的设计[J].电声技术,2010(4):36?38.
[9] 戴士剑,涂彦辉.数据恢复技术[M].2版.北京:电子工业出版社,2007.
主程序在初始化之后首先计算出根目录下音乐格式歌曲的总数目,随后判断按键状态,播放所选择的歌曲。播放一首歌曲的程序流程图如图5所示:播放时,先利用FAT32函数Get_File_Info()解析文件信息结构体FileInfoStruct,找到这首歌曲文件的起始簇号、歌曲名称等信息。根据歌曲起始簇号调用SD函数SD_ReadDisk()按扇区读取数据512 B,分两次存入STM32F103RB中256 B大小的数据缓冲区,缓冲区数据随后立即发送给VS1003,控制器同时在OLED屏幕上实时显示当前歌曲的序号,歌曲名称等信息。当该簇所有扇区播放完毕,再利用FAT32函数GetNextCluster()在FAT表中继续寻找下一簇簇号,直到簇链结束,一首歌曲也就播放完毕[8]。
图5 播放歌曲程序流程图
4 结 语
本文提出一种基于STC12C5A60S2单片机和VS1003解码芯片的音乐播放器的硬件设计方法,并研究了在FAT32文件系统下音乐播放器的程序设计。经过调试,该音乐播放器连接耳机能流畅播放出SD卡中的多种格式的音乐文件,MP3格式、WMA格式以及MIDI格式的文件均可播放,同时歌曲名称、播放进度等均可正确显示至OLED屏幕。对于高采样率的MP3文件,由于单片机本身时钟频率的限制,播放有卡顿现象,这可利用采样率转换软件将采样率降低至64 kb/s即可正常播放。
参考文献
[1] 何立民.单片机高级教程[M].北京:北京航空航天大学出版社,2007.
[2] 刘军.例说STM32[M].北京:北京航空航天大学出版社,2011.
[3] 张天益.MP3播放器的设计[J].今日电子,2006(12):7?8.
[4] 唐继贤.51单片机应用系统开发实例精解[M].上海:科学技术出版社,2012.
[5] 李军.便携式MP3播放器的方案分析及其技术研究[J].电声技术,2004(7):27?29.
[6] 李宁.基于Cortex?M3的MP3播放器设计[J].单片机与嵌入式系统应用,2009(2):48?50.
[7] 刘伟.数据恢复技术深度揭秘[M].北京:电子工业出版社,2010.
[8] 杨明极.嵌入式系统中SD卡的FAT32文件系统的设计[J].电声技术,2010(4):36?38.
[9] 戴士剑,涂彦辉.数据恢复技术[M].2版.北京:电子工业出版社,2007.