打印

出个51单片机的题目考考大家

[复制链接]
2730|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
俗话说"到了那山唱那歌",应朋友要求搞个"到了那时唱那曲"的MP3样机去广播.要求精确到秒,即在歌曲播放中随时监测当前时间,时间一到,立即换上与其对应的歌曲.
样机采用MP3学习板(P89LV51RD2+PCF8563+SD卡+VS1003B)的平台来实现.前提时定时与播放必须近似双线程,否则实时性不强,要不歌曲不流畅,要不该换曲时不换曲反应迟钝.
呵呵,大家说说您会采用哪些方式来实现,先说吧,你能找到最佳解决方法吗?此问题已经解决,主要是借题与大家交流将现实问题转化成单片机模型的思想.

备注:单片机为24M晶振,6时钟周期,等同于48M的AT89S52速度,PCF8563的中断输出已接单片机的中断引脚,定时监测过程中,能少干扰MCU要小干扰,MCU的任务很重的哟!

相关帖子

沙发
古道热肠|  楼主 | 2009-12-5 22:16 | 只看该作者
再补充一下,单片机在音乐播放过程中有少量空闲时间,但不够读取PCF8563然后进行实时比较的哟,简单的查询比较是效率最为低下的方式.

使用特权

评论回复
板凳
hotpower| | 2009-12-6 06:49 | 只看该作者

俺玩不了这么高的科技~~~不过俺可以告诉大家TTS的一些诀窍

本帖最后由 hotpower 于 2009-12-6 07:02 编辑

菜农玩语音从1992年玩到2006年实在玩腻了~~~

下面的带语音识别的CRC运算器的TTS功能即“文本到语音”和语音模块一样,
对于一些用串口控制的MP3某块的控制最好做到:

放音后,若执行声音文件的切换,最好先关闭再打开。
若想关闭时处于暂停状态,就应该先执行继续放音功能后延时数毫秒后在关闭。

否则,模块可能被锁死。

用微软的SAPI的TTS例程几下就会被玩死~~~因为编写应用的人“忽略了这些小节”
菜农认为“产品的按键是应该让用户像玩钢琴一样同时拍打而不会死机的”

不知古道热肠教主的模块是否满足菜农这些“非份要求”~~~




最新版的HotWC3网上在线CRC运算器V5.01





使用特权

评论回复
地板
古道热肠|  楼主 | 2009-12-6 14:15 | 只看该作者
呵呵,俺的模块还是比较皮实的,每次更换文件时软件复位解码芯片,不会死机,至于播放中的按键处理,俺潜心研究了VS1003B的特性,播放过程中无论如何乱按,决不死机。老Hot如果有兴趣,俺可送一个下面这个模块给您检验检验。

不过您得按说明书来发串口命令,因为成本受限,代码受限,无法做比较完善的容错处理。
涛行MP3模块V21使用说明书.pdf (701.12 KB)

使用特权

评论回复
5
古道热肠|  楼主 | 2009-12-6 14:20 | 只看该作者
呵呵,提示一下,因为这个应用要用精确到秒的比较,所以首先想到用秒中断方式来实现,于是满怀信心地去翻看PCF8563的闹钟功能......熟悉PCF8563的朋友应该能续上后面的事情了。

使用特权

评论回复
6
ningling_21| | 2009-12-6 15:02 | 只看该作者
对MP3解码还不熟悉....

使用特权

评论回复
7
xwj| | 2009-12-6 15:46 | 只看该作者
没必要双线程,简单的非阻塞写法的前后台即可

使用特权

评论回复
8
cqwangsf| | 2009-12-6 16:09 | 只看该作者
广告?

使用特权

评论回复
9
zjswuyunbo| | 2009-12-6 18:24 | 只看该作者
用内部定时器?外部作为较准?是这样吗?

使用特权

评论回复
10
古道热肠|  楼主 | 2009-12-7 22:15 | 只看该作者
呵呵,楼上的网友算是说到关键点了.
因为PCF8563只能精确分钟的闹钟功能,因而满足不了秒比较的精度,于是想到先计算出设定时间与当前时间的秒差值,然后用MCU的内部定时器执行倒计时功能.由于MCS-51单片机的定时器的时钟输入没有预分频器,即使用16位定时模式,仍然无法满足秒延时的需求,
程序如下:
        void SystemTimerMangement(void)
        {

                if(TF1)
                {
                        TH1 = c_TH0_ReloadValue;
                        TL1 = c_TL0_ReloadValue;

                        TF1= 0;
                        ucTime0Count--;       
                        if(ucTime0Count == 0)
                        {
                                ucTime0Count = 100;
                                if(ulTotlePlaySecond > 0)
                                {
                                        ulTotlePlaySecond--;
                                }
                        }
                       
                }
        }

如用毫秒级累加,则影响到MCU执行播放音乐的进程,后根据P89V51RD2的特性,可以用PCA定时器来实现定时 ,且PCA的时钟可由定时器0的溢出来计数,则定时器0等效于预分频器.1S定时功能通过两者配合即可完成.定时器0完成50us溢出,PCA用20000计数终值,两者相乘,刚好为1秒
程序如下:
void InitSystemTimer(void)
{
//                TMOD &= 0x0F;
//                TMOD |= 0x10;                //定时器1工作在模式1
        TMOD = 0x12;                //定时器1工作在模式1,定时器0工作在模式2
        TH1 = c_TH0_ReloadValue;        //定时10mS的初始化装载值
        TL1 = c_TL0_ReloadValue;
       
        TH0 = 0x38;                        //初始值为56
        TL0 = 0x38;               

        TR0 = 1;
        TR1 = 1;

        CMOD = 0x04;        //由定时器0的溢出来触发PCA计数
        InitiateDelay(20000);
}


        void SystemTimerMangement(void)
        {
                if((CCON & 0x80))
                {
                        InitiateDelay(20000);                //20K Counts
                        if(ulTotlePlaySecond > 0)
                        {
                                ulTotlePlaySecond--;
                        }

                }
        }

唉,貌似现在喜欢思考的人不多了.

使用特权

评论回复
11
hotpower| | 2009-12-7 22:47 | 只看该作者
俺的弟子以前做过这个参加NXP大赛,GPS+MP3,不过是用ARM7做的。
俺认为MP3就不该用51~~~恕菜农直言~~~

使用特权

评论回复
12
精益求精| | 2009-12-8 08:25 | 只看该作者
顶菜农啊。
古版主,应该换你以前用的AT ARM7 ...
现在芯片多,都喜欢用更快的,软件省事。

使用特权

评论回复
13
inter_zhou| | 2009-12-8 13:53 | 只看该作者
现在我用的都是单芯片的软件解码,根本不需要VS1003。
软解MP3格式,8051内核。96M,单周期

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以VS1003B和山景SOC芯片为背景,倾心研制数字化语音录放产品. 排忧邮箱:xg_2004_sy@126.com 得意之作是做了个AVR高压编程器,用起来爽歪歪, 串口MP3录放音模块,全面进入数字录放音时代

284

主题

6411

帖子

16

粉丝