基于stc12c5a60s2的u盘mp3播放器.docx
《基于stc12c5a60s2的u盘mp3播放器.docx》由会员分享,可在线阅读,更多相关《基于stc12c5a60s2的u盘mp3播放器.docx(22页珍藏版)》请在冰豆网上搜索。
![基于stc12c5a60s2的u盘mp3播放器.docx](https://file1.bdocx.com/fileroot1/2023-1/21/8110c778-31be-47ef-85b0-7c745b95bb09/8110c778-31be-47ef-85b0-7c745b95bb091.gif)
基于stc12c5a60s2的u盘mp3播放器
一.目录
二.引言
2.1设计意义
2.2设计目标
2.3研究背景
三.方案设计
3.1方案选择
3.2.理论分析与方案论证
四.总体设计
4.1整体硬件连接框图
4.2设计流程图
4.3硬件电路与软件设计
4.4软件实现方法
五.总结
六.附录
附录1整体电路图
附录2部分程序代码
七.参考文献
二.引言
2.1设计意义
随着电子技术的发展,MP3播放器向着大容量,小型化发展。
但播放器与存储器一体化的设计使得MP3难以扩充容量以容纳更多的歌曲。
将播放器与存储器分离是MP3目前发展的另一方向。
本文介绍了一种利用STC12C5A60S2控制以HOSTUSB方式读取U盘的音乐文件并将其解码的播放的解决方案。
2.2设计目标
以STC12C5A60S2芯片作为主控制器,芬兰VLSI公司的VS1003作为音频解码芯片,南京沁恒公司的CH375作为USB设备接口芯片,以优盘作为媒体存储介质,NOKIA(诺基亚)5110液晶屏作为显示屏,来完成音乐播放器的功能。
该设计具有四按键操作界面,界面显示友好,支持MP3、WMA、WAV和MID四种音乐格式,同时支持文件夹和音乐文件的中文显示。
该系统支持FAT32文件系统,支持大容量优盘,支持高保真立体声耳机输出。
2.3研究背景
现有汽车收放机大多为带AM/FM功能的磁带机,CD/DVD机,而今,随着现代存储技术的飞速发展,便携的数字存储设备已经成为主流;同时廉价、高品质、档案小的MP3格式音乐的大量出现,再加上MP3很容易在Internet上散布,MP3将取代磁带和CD而成为新世纪的主流音乐格式,对汽车来说更是一个最完美的音乐格式。
MP3汽车音响的时代已经来临了,汽车音响业也纷纷推出具备MP3播放功能的汽车音响主机,快速接收CD在汽车内生存的空间。
特别是近期USBHOSTMP3解码模块产品的出现,完善了MP3播放功能的汽车音响主机在USB方向的空白。
该方案提供一个主USB接口,插上U盘即可播放U盘里的MP3文件、可广泛应用于家用音响/音箱,公共广播系统,车载CD,恶劣环境中需要播放音乐的场合等等。
三.方案设计
3.1.方案选择
方案一:
用转接器直接将MP3播放器的输出连接到录音座,然后从音响的喇叭播放出来.这种作法,音响面板接了好几条线,看起来就挺难受的,转接器硬体设备该怎么安置,也是个问题。
方案二:
一种蛮便宜的FM频道无线发射器,作法基本都很类似,将FM频道无线发射器插入您的MP3播放器的耳机插孔,找一个没有被占用的收音机频率,MP3播放器的输出便透过无线发射器传到任何音响系统的FM频道播放,像是自己架设了一个自制音乐节目,完全没有广告的电台一样。
使用这种方法播放MP3非常方便,特殊的一点是MP3播放器和FM发射器都是Portable可携带式的,对于旅行的朋友来说也十分方便。
找不到空余的FM频道也许会是个问题,音质对于非常讲究的音响迷而言也不是很好,收音机会受到外界的杂音干扰,静电的问题都会存在,这算是一个便宜方便虽然不太完美的解决方式。
方案三:
选用单片机作为主控芯片,以专门的音频解码芯片和通用的存储接口为主的MP3播放器。
这样实现存储和播放分离的一种解决方案。
这种方案使得MP3的容量不受限制,而且体积也可以进一步缩小,降低成本。
3.2.理论分析与方案论证
3.2.1理论分析
针对本MP3播放系统功能,要选择合适的控制芯片及外部芯片来实现,以下介绍一下选用芯片
(1)MP3解码
本播放系统是利用STC12C5A60S2高速单片机控制来实现歌曲播放功能的,但对单片机本身来说不能进行音频解码(速度与资源都不符合要求),所以只能利用外部解码芯片来实现歌曲播放功能。
MP3解码芯片常见的有VS100X系列和STA01X系列,VS系列自带DAC输出功能,而且能解码的音频格式也比较多;而STA系列需要外加DAC,使用起来多有不便,而且只能解码MP3一种格式的音乐文件。
经过对此比较,选用VS1003作为解码芯片,该芯片支持MP3、WMA、WAV、MIDI、等格式的解码,自带DAC输出;同时,还可以调节音量、高低音等,更重要的是它还具有MIC功能,如需要,还可以实现录音功能。
因此,选用此芯片作为解码芯片。
(2)方案中的USB设备接口芯片选用南京沁恒公司的CH375,CH375是一个USB总线的通用接口芯片,支持HOST主机方式和SLAVE设备方式。
在本地端,CH375具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DSP/MCU等控制器的系统总线上。
在USB主机方式下,CH375还提供了串行通信方式,通过串行输入、串行输出和中断输出与单片机/DSP/MCU等相连接。
CH375的USB主机方式支持各种常用的USB全速设备,外部单片/DSP/MCU可以通过CH375按照相应的USB协议与USB设备通信。
(3)液晶显示普通单色LCD来实现,这里考虑到音乐播放显示、同步歌词显示、音量显示等诸多功能,同时兼顾成本,故选用价格较为便宜的Nokia5110点阵LCD来实现。
该液晶屏本身不带有字库功能,所以,系统需要有外部字库文件,来实现曲目及歌词的汉字显示。
(4)存储媒介
作为MP3播放器,肯定需要很大的存储器来存放歌曲,可以选择Flash芯片存储、SD卡、U盘等。
如果选用Flash,则整个系统要求较多的I/O口来读取,更重要的一点是,这样做的后果就是整个系统的容量就被固定了,扩容存在困难。
而U盘和SD卡都是不错的选择,并且U盘和SD卡均容易购买到,并且价格较为低廉,所以,存储部分选用U盘或SD卡读取来实现。
3.2.2基本方案设计
通过以上的理论分析,对本系统的所有的主要芯片有了初步的了解。
本MP3播放系统以STC12C5A60S2为控制核心,不但要管理SD卡、CH375、解码芯片、液晶屏和键盘的驱动,同时还要管理SD卡和USB存储设备中的文件系统,查找文件等等。
存储器里的媒体文件首先被读取到MCU的RAM中,然后又被送到解码芯片中,解码后的音频数据被还原成模拟音频,由扬声器传出。
由于STC12C5A60S2本身不支持USB接口功能,所以MCU无法直接与电脑完成数据传输的功能,存储设备需要通过自身的接口与电脑相接。
对于其他的芯片则是通过普通I/O口连接的。
四.总体设计
4.1整体硬件连接框图(图3.1):
图3.1
4.2设计流程图
4.3硬件电路与软件设计
4.3.1音频解码电路基本电路图,如图4.3.1
图4.3.1
VS1003特性:
●能解码MPEG1和MPEG2音频层III(CBR+VBR+ABR);WMA4.0/4.1/7/8/95-384kbps所有流文件;WAV(PCM+IMAAD-PCM);产生MIDI/SP-MIDI文件。
●对话筒输入或线路输入的音频信号进行IMAADPCM编码
●支持MP3和WAV流
●高低音控制
●单时钟操作12..13MHz
●内部PLL锁相环时钟倍频器
●低功耗
●内含高性能片上立体声数模转换器,两声道间无相位差
●内含能驱动30欧负载的耳机驱动器
●模拟,数字,I/O单独供电
●为用户代码和数据准备的5.5KB片上RAM
●串行的控制,数据接口
●可被用作微处理器的从机
●特殊应用的SPIFlash引导
●供调试用途的UART接口
●新功能可以通过软件和4GPIO添加
VS1003概述:
●VS1003是一个单片MP3/WMA/MIDI音频解码器和ADPCM编码器。
它包含一个高性能,自主产权的低功耗DSP处理器核VS_DSP4,工作数据存储器,为用户应用提供5KB的指令RAM和0.5KB的数据RAM。
串行的控制和数据接口,4个常规用途的I/O口,一个UART,也有一个高品质可变采样率的ADC和立体声DAC,还有一个耳机放大器和地线缓冲器。
●VS1003通过一个串行接口来接收输入的比特流,它可以作为一个系统的从机。
输入的比特流被解码,然后通过一个数字音量控制器到达一个18位过采样多位ε-ΔDAC。
通过串行总线控制解码器。
除了基本的解码,在用户RAM中它还可以做其他特殊应用,例如DSP音效处理。
4.3.2U盘模块电路基本电路图,如图4.3.2
图4.3.2
CH375是一个USB总线的通用接口芯片,支持USB-HOST主机方式和USB-DEVICE/SLAVE设备方式。
在本地端,CH375具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DSP/MCU/MPU等控制器的系统总线上。
在USB主机方式下,CH375还提供了串行通讯方式,通过串行输入、串行输出和中断输出与单片机/DSP/MCU/MPU等相连接。
CH375的USB设备方式与CH372芯片完全兼容,CH375包含了CH372的全部功能。
CH375的USB主机方式支持常用的USB全速设备,外部单片机可以通过CH375按照相应的USB协议与USB设备通讯。
CH375还内置了处理Mass-Storage海量存储设备的专用通讯协议的固件外部单片机可以直接以扇区为基本单位读写常用的USB存储设备(包括USB硬盘/USB闪存盘/U盘)。
特点
●低速和全速USB-HOST主机接口,兼容USBV2.0,外围元器件只需要晶体和电容。
●低速和全速USB设备接口,完全兼容CH372芯片,支持动态切换主机与设备方式。
●主机端点输入和输出缓冲区各64字节,支持12Mbps全速USB设备和1.5Mbps低速设备。
●支持USB设备的控制传输、批量传输、中断传输。
●自动检测USB设备的连接和断开,提供设备连接和断开的事件通知。
●内置控制传输的协议处理器,简化常用的控制传输。
●内置固件处理海量存储设备的专用通讯协议,支持Bulk-Only传输协议和SCSI、UFI、RBC或
等效命令集的USB存储设备(包括USB硬盘/USB闪存盘/U盘/USB读卡器)。
●通过U盘文件级子程序库实现单片机读写USB存储设备中的文件。
●并行接口包含8位数据总线,4线控制:
读选通、写选通、片选输入、中断输出。
●串行接口包含串行输入、串行输出、中断输出,支持通讯波特率动态调整。
●支持5V电源电压和3.3V电源电压,支持低功耗模式。
●采用SOP-28无铅封装,兼容RoHS,提供SOP28到DIP28的转换板,引脚基本兼容CH374芯片。
4.3.3LCD液晶显示接口电路基本电路如图:
图4.3.3
图4.3.3
LPH7366是Nokia公司生产的可用于5110、6150、6100等系列移动电话的液晶显示模块,国内厂家也生产有类似的兼容产品。
该产品除应用于移动电话外,也可以广泛应用于各类便携式设备的现实系统。
与其它类产品相比,该模块具有以下特点:
●84×48的点阵LCD,可显示4行汉字
●采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线只有9条,支持多种串行通信协议(如AVR单片机的SPI、MCS51的串口模式0等),传输速率可高达4Mbps,可全速写入显示数据,无等待时间。
●可通过导电胶连接模块与印制板,而不用连接电缆用模块上的金属钩可将模块固定到印制板上面,因而非常便于安装和更换。
●LCD控制器/驱动芯片及绑定到LCD晶片上,模块的体积很小。
采用低电压供电,正常显示时的工作电流在200uA以下,且具有掉电模式。
4.3.4.电源模块(如图:
4.3.4)
图:
4.3.4
4.4软件实现方法
在整个设计方案中,较困难完成的就是软件的编程。
在整个软件编程中,不
但涉及到有关接口协议方面的驱动,同时还有FAT文件系统的编程,各种算法等
等。
总的说来程序量较大,在实现起来费了不少的功夫和时间。
程序主要包含以下几个模块:
1、CH375驱动。
这个模块由CH375接口读写驱动,初始化优盘程序,整个扇区读操作,从某个扇区读取字节操作四个子程序组成。
2、VS1003驱动。
这个模块由VS1003接口读写驱动,初始化程序,软件复位程序,解码时间读取程序,测试程序五个部分组成。
3、FAT文件系统。
这个模块是整个系统的核心部分,代码量也是最大的。
主要分为以下几个部分:
(1)文件系统初始化:
包括文件系统类型的区分,分区信息,根目录所在扇区等等。
(2)查找系统文件。
系统文件存放在SD卡或优盘中,由汉字字库文件和UNITCODE码转换文件组成。
两个文件均为BIN格式,存放路径为根目录。
如果SD卡或优盘中事先没有存放这两个文件,将不支持中文显示。
(3)在FAT表中查询下一个簇号。
(4)查找目录。
(5)查找音乐文件。
(6)数据区数据读取。
(7)UNITCODE码转换GB2313码。
5、5110液晶屏驱动。
这个模块包括输出ASCII字符,从字库中查找出字模,输出汉字,清屏,画图五个程序。
6、主程序。
主要由系统初始化,键盘操作,文件目录浏览,音乐播放,停止放音等组成。
五.总结
在此次论文完成的过程中,我查阅了大量的中、外文献资料,扩大了知识面。
通过反复实验,提高了动手能力及思维创新能力,对我的理论水平和工作水平都有很大的提升。
根据本人在调试中遇到的问题,特作如下说明:
1、VS1003由于采用超小型贴片44脚封装,给焊接及测试都带来一定的麻烦。
另外,VS1003内部是DSP核,如果操作不当,很容易使其损坏。
端口要加保护,电源要严格按照手册上来提供。
2、CH375的初始化很重要,要严格按照手册的步骤,这样可以提高U盘的兼容性。
3、CH375的读写时序中有几个很重要的延时,对延时应该做到大于或等于手册的提供的参数。
否则会在高速读写时出现错误。
4、不同厂家的U盘的参数并不是一样的,自己在写文件系统时,初始化后读取U盘的参数很重要,这样能让我们快速判断FAT文件的入口。
六.附录1
整体电路图
附录2
6.1VS1003解码程序
#include"vs1003.h"
//#include"patch.h"
#include"myfun.h"
unsignedcharbdatadat;//可位寻址的变量dat,用于优化SPI
sbitdat7=dat^7;//取出每一个位
sbitdat6=dat^6;
sbitdat5=dat^5;
sbitdat4=dat^4;
sbitdat3=dat^3;
sbitdat2=dat^2;
sbitdat1=dat^1;
sbitdat0=dat^0;
voidVS_spi_write(unsignedcharx)
{
dat=x;//将x赋值给可位寻址的变量dat
VS_SI=dat7;//从高位开始输出,从dat7一直到dat0
VS_SCK=0;//时钟的上升沿,位被写出
VS_SCK=1;
VS_SI=dat6;
VS_SCK=0;
VS_SCK=1;
VS_SI=dat5;
VS_SCK=0;
VS_SCK=1;
VS_SI=dat4;
VS_SCK=0;
VS_SCK=1;
VS_SI=dat3;
VS_SCK=0;
VS_SCK=1;
VS_SI=dat2;
VS_SCK=0;
VS_SCK=1;
VS_SI=dat1;
VS_SCK=0;
VS_SCK=1;
VS_SI=dat0;
VS_SCK=0;
VS_SCK=1;
}
voidVS_Write_Reg(unsignedcharaddr,unsignedcharhdat,unsignedcharldat)
{
VS_DREQ=1;//51单片机IO作输入时先置为1
while(!
VS_DREQ);//VS1003的DREQ为高电平时才接收数据
VS_XCS=0;//打开片选,SCI有效,这样才能对功能寄存器进行读写
VS_spi_write(0x02);//写入操作码0x0200000010(功能寄存器写操作)
VS_spi_write(addr);//写入寄存器地址
VS_spi_write(hdat);//写入高字节
VS_spi_write(ldat);//写入低字节
VS_XCS=1;//关闭片选,SCI无效
}
voidVS_Reset()
{
VS_XRESET=1;
delay(100);
VS_XRESET=0;
delay(100);
VS_XRESET=1;//硬件复位,XRESET低电平有效
delay(100);
VS_Write_Reg(0x00,0x08,0x04);//软件复位,向0号寄存器写入0x0804
VS_Write_Reg(0x03,0x98,0x00);//时钟设置,向3号寄存器写入0x9800SC_MULT
VS_Write_Reg(0x0b,0x00,0x00);//音量设置,左右声道均最大音量
VS_XDCS=0;//打开数据片选,注意此时XCS(片选)为高电平,SDI有效
VS_spi_write(0);//写入数据,这里写入4个0,是无关数据,用来启动数据输
VS_spi_write(0);
VS_spi_write(0);
VS_spi_write(0);
VS_XDCS=1;//关闭数据片选,SDI无效
}
voidVS_Send_Dat(unsignedchardat)
{
VS_DREQ=1;
while(!
VS_DREQ);//VS1003的DREQ为高才能写入数据
VS_spi_write(dat);//通过SPI向VS1003写入一个字节的音频数据
}
voidVS_Flush_Buffer()
{
unsignedinti;
VS_XDCS=0;//打开数据片选,即开启SDI传输
for(i=0;i<2048;i++)
{
VS_Send_Dat(0);
}
VS_XDCS=1;//关闭数据片选
}
6.2CH375B模块程序
#include"ch375.h"
#include"myfun.h"
voidCH375_Write_Cmd(unsignedcharcmd)//写命令
{
delay(DELAYTIME);//稍作延时
CH375_CS=0;//打开片选
CH375_A0=1;//命令模式
DATA_PORT=cmd;//输出命令码
CH375_WR=0;//打开写使能
delay(DELAYTIME);//稍作延时
CH375_WR=1;//关闭写使能
CH375_CS=1;//关闭片选
CH375_A0=1;//恢复A0为高电平
delay(DELAYTIME);//稍作延时
}
voidCH375_Write_Dat(unsignedchardat)//写数据
{
delay(DELAYTIME);//稍作延时
CH375_CS=0;//打开片选
CH375_A0=0;//数据模式
DATA_PORT=dat;//输出数据
CH375_WR=0;//打开写使能
delay(DELAYTIME);//稍作延时
CH375_WR=1;//关闭写使能
CH375_CS=1;//关闭片选
CH375_A0=1;//恢复A0为高电平
delay(DELAYTIME);//稍作延时
}
unsignedcharCH375_Read_Dat()//读数据
{
unsignedchartemp;
CH375_CS=0;//打开片选
CH375_A0=0;//数据模式
CH375_RD=0;//打开读使能
DATA_PORT=0xff;//51单片机IO作输入,先置高
delay(DELAYTIME);//稍作延时
temp=DATA_PORT;//读取端口上的数据
CH375_RD=1;//关闭读使能
CH375_CS=1;//关闭片选
CH375_A0=1;//恢复A0为高电平
returntemp;//返回读到的值
}
unsignedcharCH375_Wait_Int()//等待中断信号,即INT引脚上产生低电平,并获取中断状态码,获取后INT恢复高电平,以产生下一次中断信号
{
CH375_INT=1;//IO作输入先置高
while(CH375_INT);//等待中断
CH375_Write_Cmd(CMD_GET_STATUS);//产生操作完成中断,获取中断状态
returnCH375_Read_Dat();
}
unsignedcharCH375_Init()
{
unsignedchari=0;
CH375_Write_Cmd(CMD_GET_IC_VER);/*获取芯片及固件版本*/
i=CH375_Read_Dat();/*版本*/
if(i<0xA2)return1;/*不支持该芯片*/
CH375_Write_Cmd(CMD_SET_USB_MODE);/*设置USB工作模式*/
CH375_Write_Dat(6);/*模式代码,自动检测USB设备连接*/
for(i=0;i<250;i++)
{/*等待操作成功,通常需要等待10uS-20uS*/
delay(10);
if(CH375_Read_Dat()==CMD_RET_SUCCESS)
return0;/*操作成功*/
}
return1;/*CH375出错,例如芯片型号错或者处于串口方式或者不支持*/
}
unsignedcharCH375_InitDisk()
{
unsignedcharstatus,i,j=0;
status=CH375_Wait_Int();
if(status==USB_INT_DISCONNECT)return1;/*USB设备断开*/
while
(1)
{
CH375_Write_Cmd(CMD_DISK_INIT);/*初始化USB存储器*/
status=CH375_Wait_Int();/*等待中断并获取状态*/
if(status==USB_INT_SUCCESS)
break;
}
while
(1)//以下代码均源自沁恒的官方U盘初始化函数,借用它可以提的兼容性!
{
j++;
CH375_Write_Cmd(CMD_DISK_SIZE);/*获取USB存储器的容量*/
status=CH3