关于单片机制作MP3的一些小问题
我用单片机做了一个MP3 CH375读写U盘 VS1003解码 STC12C5A60S2控制命令现在已经可以听到歌曲的声音了,但是有几个问题还没解决
1.我用的STC12C5A60S2单片机控制VS1003和CH375 用的是24M的晶振 但是速度还是太慢 音质不是很好 后来我换成了32M但是效果还不如24M的(跟12M的差不多 而且我下载程序的时候竟然显示晶振是12M的 不知道是什么原因?
2.程序的一些问题
我想增加一些功能(上一曲,下一曲,暂停,播放) 不知道怎么修改程序。
例如我想加一个下一曲的功能 本来想用中断的 但是发现中断完成后还是会回到解码程序里面 这样还是会继续解码上一曲的歌曲,不能跳到下一曲(因为解码程序师一个循环)。
3.STC的片子还是比较慢了 大家推荐几款速度比较快的片子(DIP40封装的)。
谢谢了。 我用单片机做了一个MP3 CH375读写U盘 VS1003解码 STC12C5A60S2控制命令
现在已经可以听到歌曲的声音了,但是有几个问题还没解决
1.我用的STC12C5A60S2单片机控制VS1003和CH375 用的是24M的晶振 但是速度还是太慢 音质不是很好 后来我换成了32M但是效果还不如24M的(跟12M的差不多 而且我下载程序的时候竟然显示晶振是12M的 不知道是什么原因?
2.程序的一些问题
我想增加一些功能(上一曲,下一曲,暂停,播放) 不知道怎么修改程序。
例如我想加一个下一曲的功能 本来想用中断的 但是发现中断完成后还是会回到解码程序里面 这样还是会继续解码上一曲的歌曲,不能跳到下一曲(因为解码程序师一个循环)。
3.STC的片子还是比较慢了 大家推荐几款速度比较快的片子(DIP40封装的)。
谢谢了。 其实stc的片子不慢了,8位1T的MCU 都差不多啦,建议你好好优化一下数据传输的算法。在速度要求高的数据处理单元,能用寄存器的,最好用寄存器处理,数据能放在内部ram的尽量放在内部ram,少用xram 顶 你买的24M晶振是倍频晶振,振在12M基波上了! 回复【4楼】yk28981
-----------------------------------------------------------------------
什么意思呢?不懂。 你的单片机不是一直在送数据到VS1003吧,VS1003有一个数据缓冲区(大小是32字节吗?这个忘记了)单片机一次可以送32多字节到VS1003,之后就不能送了,直到VS1003发出中断才能继续,或者查询VS1003相应的管脚。那么可以利用这个功能!比如用的中断送数据到VS1003,你可以在进中断的先查询标志位(这个标志位在控制上一首和下一首的按键中断里面控制),当标志位没有置位的时候继续上次的文件传送,如果置位了则根据标志重新读取新文件再送到VS1003同时将标志位清零。 你买的32M晶振是泛音晶振,起振是有条件的,否则会起振在基频上。下次买时看清楚。
可以肯定的是,32M肯定比24M要快。
你的SPI是硬件驱动还是IO模拟?硬件驱动速度要快些
你的CH375是总线驱动的还是IO模拟的?总线驱动要快些
还有软件的优化
总之,STC的速度还是可以的,关键在于你的思路和设计 用ATMEGA8比较好,公认的 回复【7楼】renpeng009 大鹏集成
-----------------------------------------------------------------------
“32M晶振是泛音晶振,起振是有条件的,否则会起振在基频上”这个我还真不知道,还有CH375是IO模拟的。 正准备搞个MP3呢。个人认为还是软件上的问题,12放128kbps的应该没什么问题的 回复【6楼】s200661524
-----------------------------------------------------------------------
如果是查询VS1003相应的管脚进行数据传送呢 该怎么编写程序 谢谢了。 学习了 vs1003解码MP3数据,你只要把MP3数据送给它,它就能自动识别MP3码率,然后按照这个解码速率进行解码。vs1003有0.5k的数据RAM做为音频数据的缓冲,为了确定数据缓冲区里是否有数据,芯片设定了一个中断脚DREQ,当DREQ变高时,外部可以至少向vs1003发送 32字节的数据,当vs1003收到32字节的数据之后DREQ脚变为低,如果数据缓冲区内再次少于32字节的数据,那么vs1003又将DREQ置为高电平。之前说数据缓冲区是0.5k,这里又说每次送32个数据,vs1003只是设置了一个32byte为标准,你可以当在检测到DREQ脚变高时,往里边一次性发送少于0.5k的字节(这个我没验证,有网友说可以,但是一次送32字节肯定没错,这是官方的说法),然后再去检测DREQ的状态。
所以程序中可以这样写(可以定义#define DREQ P2.0,keyup,keydown分别对应上一首和下一首按键,在中断里面改变)
while(true){
while(DREQ )
{
send_to_vs1003(32);
//这里可以检查单片机内部缓冲区是否空,如果是则在这里去读SD卡或者U盘上的文件到缓冲区,如果不用内部缓冲区就可以省了这一步,你用的STC12C5A60S2单片机,内部RAM应该够用了吧!
}
if(keyup)//上一首按键按下
{
keyup=0;
sd_read_prev();
}
if(keydown)//下一首按键按下
{
keydown=0;
sd_read_next();
}
}
其中send_to_vs1003是从单片机的数据缓冲区读取数据到vs1003,而sd_read_next,sd_read_prev则是从外部存储器(U盘,SD卡)读取下一首(上一首)歌曲数据数据到单片机的内部缓冲区,如果单片机内部没有足够的RAM来做缓冲区(一般大小为一个扇区512字节)则send_to_vs1003可以直接从U盘,SD卡读取到vs1003,而sd_read_prev,sd_read_next则只是打开对应的文件。
修改:特别注意keyup,keydown定义为全局变量,必须加上volatile修饰,否则默认优化级别都可能会出问题,原因你懂的! 回复【13楼】s200661524
-----------------------------------------------------------------------
非常感谢你 我试一下你的思路。 回复【13楼】s200661524
-----------------------------------------------------------------------
你是不是也用51做过MP3啊 你用的什么型号的单片机呀? 回复【15楼】zengwei
-----------------------------------------------------------------------
mark
页:
[1]