zengwei 发表于 2011-10-20 12:29:52

关于单片机制作MP3的一些小问题

我用单片机做了一个MP3 CH375读写U盘 VS1003解码 STC12C5A60S2控制命令
现在已经可以听到歌曲的声音了,但是有几个问题还没解决
1.我用的STC12C5A60S2单片机控制VS1003和CH375 用的是24M的晶振 但是速度还是太慢 音质不是很好 后来我换成了32M但是效果还不如24M的(跟12M的差不多 而且我下载程序的时候竟然显示晶振是12M的 不知道是什么原因?
2.程序的一些问题
我想增加一些功能(上一曲,下一曲,暂停,播放) 不知道怎么修改程序。
例如我想加一个下一曲的功能 本来想用中断的 但是发现中断完成后还是会回到解码程序里面 这样还是会继续解码上一曲的歌曲,不能跳到下一曲(因为解码程序师一个循环)。
3.STC的片子还是比较慢了 大家推荐几款速度比较快的片子(DIP40封装的)。

谢谢了。

zengwei 发表于 2011-10-22 21:11:18

我用单片机做了一个MP3 CH375读写U盘 VS1003解码 STC12C5A60S2控制命令   
现在已经可以听到歌曲的声音了,但是有几个问题还没解决
1.我用的STC12C5A60S2单片机控制VS1003和CH375 用的是24M的晶振 但是速度还是太慢 音质不是很好 后来我换成了32M但是效果还不如24M的(跟12M的差不多 而且我下载程序的时候竟然显示晶振是12M的 不知道是什么原因?
2.程序的一些问题
我想增加一些功能(上一曲,下一曲,暂停,播放) 不知道怎么修改程序。
例如我想加一个下一曲的功能 本来想用中断的 但是发现中断完成后还是会回到解码程序里面 这样还是会继续解码上一曲的歌曲,不能跳到下一曲(因为解码程序师一个循环)。
3.STC的片子还是比较慢了 大家推荐几款速度比较快的片子(DIP40封装的)。

谢谢了。

Razor 发表于 2011-10-23 00:12:22

其实stc的片子不慢了,8位1T的MCU 都差不多啦,建议你好好优化一下数据传输的算法。在速度要求高的数据处理单元,能用寄存器的,最好用寄存器处理,数据能放在内部ram的尽量放在内部ram,少用xram

zengwei 发表于 2011-10-26 11:48:35

yk28981 发表于 2011-10-26 18:47:18

你买的24M晶振是倍频晶振,振在12M基波上了!

zengwei 发表于 2011-10-26 21:34:15

回复【4楼】yk28981
-----------------------------------------------------------------------

什么意思呢?不懂。

s200661524 发表于 2011-10-26 22:08:44

你的单片机不是一直在送数据到VS1003吧,VS1003有一个数据缓冲区(大小是32字节吗?这个忘记了)单片机一次可以送32多字节到VS1003,之后就不能送了,直到VS1003发出中断才能继续,或者查询VS1003相应的管脚。那么可以利用这个功能!比如用的中断送数据到VS1003,你可以在进中断的先查询标志位(这个标志位在控制上一首和下一首的按键中断里面控制),当标志位没有置位的时候继续上次的文件传送,如果置位了则根据标志重新读取新文件再送到VS1003同时将标志位清零。

renpeng009 发表于 2011-10-26 22:59:42

你买的32M晶振是泛音晶振,起振是有条件的,否则会起振在基频上。下次买时看清楚。
可以肯定的是,32M肯定比24M要快。
你的SPI是硬件驱动还是IO模拟?硬件驱动速度要快些
你的CH375是总线驱动的还是IO模拟的?总线驱动要快些
还有软件的优化
总之,STC的速度还是可以的,关键在于你的思路和设计

liuyipeng 发表于 2011-10-27 09:08:02

用ATMEGA8比较好,公认的

zengwei 发表于 2011-10-27 12:12:50

回复【7楼】renpeng009 大鹏集成
-----------------------------------------------------------------------

“32M晶振是泛音晶振,起振是有条件的,否则会起振在基频上”这个我还真不知道,还有CH375是IO模拟的。

projectbox 发表于 2011-10-27 12:17:10

正准备搞个MP3呢。个人认为还是软件上的问题,12放128kbps的应该没什么问题的

zengwei 发表于 2011-10-27 13:02:37

回复【6楼】s200661524
-----------------------------------------------------------------------

如果是查询VS1003相应的管脚进行数据传送呢 该怎么编写程序 谢谢了。

shz1234 发表于 2011-10-27 21:59:12

学习了

s200661524 发表于 2011-10-28 20:53:53

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修饰,否则默认优化级别都可能会出问题,原因你懂的!

zengwei 发表于 2011-10-29 18:36:46

回复【13楼】s200661524
-----------------------------------------------------------------------

非常感谢你 我试一下你的思路。

zengwei 发表于 2011-10-29 18:37:37

回复【13楼】s200661524
-----------------------------------------------------------------------

你是不是也用51做过MP3啊 你用的什么型号的单片机呀?

hkys_xxzh 发表于 2012-2-19 18:54:27

回复【15楼】zengwei
-----------------------------------------------------------------------

mark
页: [1]
查看完整版本: 关于单片机制作MP3的一些小问题