单片机+CH375+VS1003制作MP3原理图+程序.docx
- 文档编号:6133487
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:13
- 大小:20.99KB
单片机+CH375+VS1003制作MP3原理图+程序.docx
《单片机+CH375+VS1003制作MP3原理图+程序.docx》由会员分享,可在线阅读,更多相关《单片机+CH375+VS1003制作MP3原理图+程序.docx(13页珍藏版)》请在冰豆网上搜索。
单片机+CH375+VS1003制作MP3原理图+程序
单片机+CH375+VS1003制作MP3原理图+程序
#include\mian.cxdataFILETMPFILE;voidmain(){
UARTsendstr(\初始化SPI接口\\r\\n\InitSPi();//初始化SPI接口UartSendStr(\初始化VS1003\\r\\n\rstvs1003();
UartSendStr(\正弦测试\\r\\n\//Sintest();德莱姆斯(300);
UartSendStr(\退出正弦测试\\r\\n\softrstvs1003();
UARTsendstr(\initializech375\\r\\n\nitch375();
//初始化液晶UINT32LBA=0;uint16I;UartInit();
//初始化串行端口
UARTSendstr(\UARTSendstr(\UARTSendstr(\播放器演示**********\\r\\n\UARTSEnstr(\UARTSEnstr(\UARTSEnstr//显示徽标
液晶显示器_设置_光标(1,1);打印(\mp3播放器\液晶显示器_设置_光标(2,1);
print(\stuelab\
while
(1)
UARTSendstr(\在根目录中查找第一个MP3文件\\r\\n\SearchFile(2,1,\UartSendStr(\开始播放\\r\\n\//UARTSendstr(tmpfile.short_name));LBA=ClusToLba(TMPfile.start_clus);I=statfilenam(2,\
sprintf(sectionbuf),根目录下的文件夹数为%d,\\r\\n\UARTsendstr(sectionbuf);
i=statfilenam
(2)。
\
sprintf(扇区buf)。
\根目录中WMA文件的数量是%d,\\r\\n\uartsendstr(扇区buf);UARTsendstr(\statisticsfileinformation\\r\\n\I=statfilenam(2,
sprintf(sectorbuf,根目录中MP3文件的数量为%d),\\r\\n\UARTsenstr(sectorbuf);
SPI_高速();//高速SPI接口UartSendStr(\初始化文件系统\\r\\n\InitFat(扇区缓冲器);
}
{}
RDSdBlock(lba++,扇区BuF);PlaySector();
#包括p1;p1;p1;voidInitSPi(void){}
voidSPiSendByte(无符号字符dat){}
无符号字符SpireCvbyte(void){
SDAT=dat;
while(!
(SPSR//等待传输完成SPSR=0;//清除中断标志SCK=1;SO=1;SI=1;
SPCR=0xdc+3;//主机模式,允许中断,时钟通常为高电平,除以4ES=0;
//允许串行端口中断串行接口和异步收发器共享同一个中断。
EA=0;//中断主控制位
无符号字符dat
}
SDAT=0XFF;
while(!
(SPSR//等待传输完成SPSR=0;//清除中断标志dat=SDAT;返回dat//返回SDAT;在
//传输期间,
voidspisendbyte2(无符号chartemp)//软件模拟spi传输接口{}/*
无符号SpirechTbyte2(void)//软件模拟SPI接收接口{
charI;
无符号字符温度;对于(I=0;I返回(临时);
temp>8));SPIsendByte2((无符号字符)cmd);
复位)
}
softwrvs1003cmd(0,0x0804);delayms(10);
SoftWrVs1003Cmd(2,0x00F6);//低音延迟
(1);
SoftWrVs1003Cmd(3,0x9800);//倍频延迟(10);
SoftWrVs1003Cmd(5,0xbb81);//采样速率和通道延迟数
(1);
SoftWrVs1003Cmd(0x0b,0x2020);//卷延迟
(1);
voidRStVS1003(void){}
softRStVS1003();
WrVs1003Cmd(0x0b,0xffff);//卷延迟
(1);选择rstvs1003();delayms(10);SPIsendByte(0xff);releaserstvs1003();delayms(10);
//硬件复位
/*
voidsintest(void){}*/
voidplaysector(void){
uint16i;
selectdatvs1003();
for(I=0;I>8));CH375_WR_DAT_端口((无符号字符)(IL巴斯塔>>16));
CH375_WR_DAT_PORT((无符号字符)(IL巴斯塔>>24));
/*LBA*的最高8位/
ch375_wr_dat_port(isectorcount);/*扇区数量*/MBufferPoint=DATA_BUFFER;/*指向缓冲区起始地址*/for(MBeckcount=isectorcount*ch375_blk_per_sec;
块计数!
=0。
Mbock计数-)/*块计数*/
{
mintstatus=mwaitinterrupt();/*等待中断并获取状态*/中频(Minstatus==USB_INT_DISK_READ)
/*USB内存读取数据块,
请求数据读取*/
{
通道375_WR_CMD_端口(CMD_RD_USB_DATA);/*从CH375
缓冲区读取数据块*/
mlengine=ch375_rd_dat_port();/*后续数据长度*/while(最大长度)/*根据长度读取数据*/
{
SBUF=CH375_RD_DAT_PORT();同时(!
TI);TI=0;
//*缓冲点=CH375_RD_DAT_PORT();/*读取数据并保存在
*/
}
CH375_WR_CMD_PORT(CMD_DISK_RD_GO)处;/*继续使用
//Mbufferpoint+;mLength-;delay2us();
通用串行总线存储器*/
}
}
}
}
}
其他中断的读取操作;/*返回错误状态*/
if(mblock计数==0){}
return(minstatus);/*操作失败*/
minstatus=mwaitinterrupt();/*等待中断和获取状态*/
中频(最小状态==USB_INT_SUCCESS)返回(0);/*操作成功*/
struct_HD_MBR_DPT{};
/*初始化用于printf和getkey输入和输出的串行端口*/void{
//定时器1。
定时器1工作在模式2,8位自动重载模式TMOD=(TMODSCON=0x50;
PCON|=0x80;//双倍波特率TH1=0xff
TL1=0xff。
//12M晶振,12T模式,波特率115200
ministdio()无符号charpartstate无符号字符开始标题;无符号int
startsec;
无符号字符部分类型;无符号字符头;无符号int
Endsec;
无符号长开始扇区;无符号长TotalSector
TR1=1;”}main(){
printf(\do/*等待USB驱动器连接*/{}
while(MinStatus!
=通用串行总线接口连接);/*未连接u盘或
minstatus=mwaitinterrupt();/*等待中断并获取状态*/ministio();
发光二极管_输出_激活();/*启动后,发光二极管亮起,显示工作状态*/mdela100毫秒();/*100毫秒的延迟*/发光二极管_发光二极管_不发光二极管();
printf(\
c=McH375Init();/*初始化ch375*/if(c){
printf(\}
unsignedcharc,mintstatusTI=1;
out*/
printf(\
mdelay100ms();/*等待u盘进入正常工作状态的延迟*/mdelay100毫秒();
°c=MinitDisk();/*初始化u盘实际上可以识别u盘的类型,不会影响u盘中的
数据。
此步骤*/
/*必须在所有读写操作之前执行。
大多数u盘不需要此步骤,但有些u盘必须执行此步骤才能工作*///DO{///////////
m延迟100毫秒();printf(\
i=Ch375DiskReady();/*查询磁盘是否准备好。
如果省略此子程序“如果(c){
打印(\}
发光二极管_输出_动作()”;
可以节省近1KB的程序代码*//}而(I!
=ERR_SUCCESS);
/*CH375DiskReady存储在CH375的u盘文件的子程序库中,因为有许多代码,所以*/
printf(\c=mreadsector(4110,1)在此省略;
/*if(c)printf(\
if(data_buffer[0x01ff]==0xaa){/*有效磁盘分区*/
/*printf(\c=mwritesector(1,1);
if(c)printf(\
memset(DATA_BUFFER,0,512);/*清空数据缓冲区以替换原始的
信息*/
/*printf(\c=mwritesector(0,1);
if(c)printf(\
}else{}*/
printf(\while
(1)
printf(\c=MReadSector(1,1);
if(c)printf(\printf(\c=MWritesector(0,1);
if(c)printf(\
{
MintStatus=MWaitInterrupt();/*等待中断并获取状态*/
IF(Mintstatus==USB_INT_Disconnect)/*U磁盘未连接或
已被拔出*/}
#包含\Uart.cvoidUartinit(void){
//参数配置
{}
}
其他if(Mintstatus==USB_INT_connect)/。
printf(\LED_OUT_INACT();
#definedclk22118400l//定义中央处理器主频率(Hz)
//设置波特率
#definedbaud_rate19200l}
rxd=1;TXD=1;
SCON=0x50;//串行端口模式1(8位Uart),允许PCON|=0x80;//波特率加倍TMODTMOD|=0x20;
TH1=256-(MCLK/12)/(16*波特率);TL1=TH1TR1=1;//ES=1;//EA=1;
//允许串行端口中断//允许中断//波特率设置
voiduartsendbyte(无符号chardat){}
voidUARTsendtr(char*str){}
while(*str!
=‘\\0‘){}
SBUF=dat;同时(!
TI);TI=0;
UARTsend字节(*字符串);str++;
#include\lcd.c延迟(无符号充电时间){
while(-时间);}
//液晶状态检测,根据最高位判断液晶是否忙,无符号字符液晶_忙(空){
延时(20);//在//Protus仿真环境中,如果需要(((位)(液晶显示_彩色显示否则返回(0))则延迟;}
//将要显示的字符写入液晶屏
空隙打印(无符号字符*字符串,无符号字符n){
无符号字符I;
(I=0;I100)//按键时间超过一秒,长按键代码{
//key=key_old+0x80;//长键码等于普通键码加0x80}
否则,如果(key_pressed_time>1){
key=key_old;//键值}
key_old=0;}
返回;+
else//按{
key_new=0;
if(BEGIN_KEY)KEY_new=KEY_BEGIN;如果(向下键)新键=向下键;如果(向上键)新键=向上键;如果(音量向下键)键_新=键_向下;下限
if(volup_key)key_new=key_up;
if(key_new==key_old)10ms{
if(key_pressed_time>80){
key_pressed_time-=5;每隔50毫秒按键=键_新;返回;}否则{
key_pressed_time++;}}否则{
key_pressed_time=0;//开始键按下//向下键按下//向上键按下//向下键按下//向上键按下//如果键按下时间长于//如果键按下时间超过1s//则键按下将自动进行这相当于每按一次//键就增加一个。
//如果此按键与之前的
按键不同,按键的按下时间将重置为
key_old=key_new;//保存此键值}}
#include\unsignedlongintdosbootSect或;//操作系统引导扇区
无符号charsectorperclus//每个群集的扇区数量(通常非常小,2-64个)无符号长整型fatstart检测器;//FAT表开始扇区无符号长整型数据开始扇区;//数据起始扇区
/*读取主引导记录***********/无效rdMBR(无符号字符*buf){读取_扇区(0,buf);dossbootstorque=buf[454]+buf[455]*
buf[456]*65536
+buf[457]*65536*256;
}
/****读取操作系统引导记录扇区***dos引导记录**************voidrddbr(无符号char*buf){
idata无符号长整型fat_size//文件分配表Idata无符号长整型保留扇区的大小;
READ_SECTOR(DosBootSECTOR,buf);
fat.c
sectorPerClus=buf[13];//每个集群的扇区数量
保留_扇区=BUF[14];//保留扇区通常为32,但有些不是。
soreadout}
//群集号到逻辑扇区号
无符号长整型数clustola(无符号长整型数clus)//ok{
return(无符号长整型数)((clus-2)*(无符号长整型数)SectorPerCLus+DataStartSector);}
//查找下一个群集
无符号长整型搜索下一个俱乐部(无符号长整型this_clubs,无符号char*buf){
if(buf[4*offset+3]==0x0f)通过当前群集返回0;//结束读取扇区(FatStartSector+fat_offset,buf);
fat_offset=this_clus/128;//每个扇区偏移存储128个FAT条目=this_clus%128无符号长整型fat_offset无符号字符偏移量;fat_size=buf[36]
+buf[37]*256
+buf[38]*65536+buf[39]*65536*256;
fat_size=fat_size*2;
FatstartSector=DosBootSector+reserved_sector;数据起始扇区=fatstart扇区+fat_size;
}//
return(无符号长整型)(buf[4*offset)
+buf[4*offset+1]*256
+buf[4*offset+2]*65536+buf[4*offset+3]*65536*
voidInitFat(无符号字符*buf){
RDMBr(buf);//读取主引导扇区RDDbr(buf);
//读取操作系统的引导扇区并获得分区
sprintf(buf)的文件系统信息。
\UARTsendstr(buf);
sprintf(buf,\
int)sectorPerClus);}
#include\file.c
//查找按索引编制索引的文件
无符号字符搜索文件(无符号长整型项)。
{
无符号int索引,char*类型,无符号char*buf,FILE*pfile)
UARTsendstr(buf);
sprintf(buf,\Uartsendstr(buf);
sprintf(buf,\Uartsendstr(buf);
无符号字符I;
无符号intfile_num=0;无符号字符扇区计数=0;
无符号char*pdir无符号字符dir_count
无符号长整型addr=ClusToLba(条目);
while
(1){
if(SECTOR_count++READ_SECTOR(addr++,buf);
}其他{}
搜索下一个包含(条目++,buf);addr=ClusToLba(条目);扇区计数=1;
READ_SECTOR(addr++,buf);
for(dir_count=0;dir_countpdir=
if(pdir[0]==0){//end,
return0未找到;
}否则如果((pdir[0)!
=0xe5)Ipfile->简称[I]=pdir[I];
}
}
}
pfile->short_name[11]=‘\\0‘;pfile->attr=pdir[11];//属性字节pfile->start_clubs=pdir[20]*65536
+pdir[21]*256*65536
+pdir[26]+pdir[27]*256;
pfile->size=pdir[30]*65536+pdir[31]*256*65536
+pdir[28]+pdir[29]*256;
UARTsendstr(\UARTsendstr(pfile->short_name);
}
}
}
}
//查找目录中指定文件的数量
无符号intstatfilenum(无符号长int条目,//条目簇{
while
(1){256idata无符号字符扇区计数=0;
无符号char*pdiridata无符号字符dir_count
idata无符号长整型addr=ClusToLba(条目);
char*type,//findtypeunsignedchar*buf)//扇区缓冲区
read_sector(addr++,buf);
}其他{}
搜索下一个包含(条目++,buf);addr=ClusToLba(条目);扇区计数=1;
READ_SECTOR(addr++,buf);
for(dir_count=0;dir_countPDIR=
IF(PDIR[0]==0){//搜索结束。
返回文件数
}
}
returnfile_num;
}否则如果((pdir[0)!
=0xe5)//找到的文件继续;
1234+5vs1rxdds2txdt2/p1.0t2ex/p1.1p1.2p1.3p1.4p1.5p1.6p1.7RSTRXD/p3.0EATXD/p3.1ale/PROGINT0/p3.2PHENINT1/p3.3t0/p3.4t1/p3.5wr/p3.6RD/p3.7STAL2XTAL1GNDSTC89c58p2.7/A15P2.6/A14P2.6A0V3UD+UD-GNDXIXOVCCCS#RST#RSTAC#GNDD7D6D5d4d3d2d1D01234567891011121314+5v282726252423221201918171615+3.3V464544gBuf4342rig41ht40393837U2agnd3ledftav2D2aarVDDP1Buaggnd1rightAvA0V3UD+UD-GNDXIXOVCCCS#RST#RSTAC#GNDD7D6D5d4d3d2d1d01234567891011121314+5v282726252423221201918171615+3.3V464544gBuf4342rig41ht40393837U2agnd3ledftav2D2aarVDDP1Buaggnd1rightAv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 CH375 VS1003 制作 MP3 原理图 程序