搜索
bottom↓
回复: 183

发布一个带完整歌词显示的mp3(基于本站的mp3板)_个人业余玩AVR暂告一段落

[复制链接]

出0入0汤圆

发表于 2007-11-14 00:44:15 | 显示全部楼层 |阅读模式
以前说过要写个带歌词显示的mp3,但是一直没有时间。前一阵子抽4个晚上写出来了,后来又陆续做了改进,现在正式出炉了!

硬件环境:
    是网站的mp3板,还是去年卖的缺陷板,当时是这个板第一次做板,但是有点小错误。当时我仔细看了看问题不大就购了一块。虽然贴了个标签说不可以用作mp3用途,但是我还是做了。
    这个板的问题就是ch375的接线搞成5v版本的了,还有ch375的晶振离芯片太远,并且离数据线太近,这会导致ch375工作不稳定。后来我通过改变晶振端的电容来稳定起工作。还有就是AVCC没有接VCC,还有个小毛病是232的RXD中少串了个电阻,直接接会导致无法isp下载。

    板子回来东西也是过了很久一个一个焊上去的,3310是从ppa2001那转让来的(在此表示感谢,他顺便还送了我很多PCB板)。最近从armok这里弄了些零件才算弄完整了。

软件平台:
    AVRSTudio4.13 + WinAVR20070525

    到了公司用起了source insight才觉得AVRSTudio的编辑器太滥了,所以我是用source insight编辑代码,直接命令行敲命令make,用avrdude + jtagice下载代码


功能描述:
    程序包含两部分bootloader+application

    bootloader是前一阵子在坛子里搜到的stk500的bootloader,我对它作了修改,以和我的程序匹配。
   
    bootloader需要配置成2Kbytes的,可以复位按住start/puse,或者在主程序中按VOL+建,另外复位后10秒如果没有操作则自动进入bootloader


    application部分完成的就是mp3的播放功能:
   
    5个按键,功能上我只对start/pause作了修改,这个按键是用作模式选择的,可以选择单曲重复,全曲重复,随几播放(shuffle)
    mp3文件可以存放在任意目录,但是总的文件夹数目受到限制(目前代码限制136个)。也可以采用以前的惯用方法,把文件放在特定目录下,这个需要修改程序fat.h文件中的一个宏定义FIX_DIRECTORY。
    歌词文件可以存放在歌曲所在的目录和一个默认目录下,代码中是\\lrc 即根目录下的lrc文件夹下。

    程序对歌词提供了完整的支持,支持标准的lrc文件规范。[XX:XX]&[XX:XX.XXX],可以多个时间tag共用一句歌词。
程序处理歌词的方法是,根据mp3文件的文件名(短/或长文件名)去寻找lrc后缀的文件。注意:文件名采用前段匹配的方式,即只要歌词文件前面的和音乐文件匹配即可。如:细说往事.mp3 和 细说往事-南方二重唱.lrc是可以对应起来的。另外对于文件名中的大小写是区分的,如may it be.mp3 和May it be.lrc是对应不起来的。

    找到歌词文件后程序会对其解析,然后对所有数据进行排序。将结果存到ram或eeprom中。程序中使用静态单向链表来描述各个时间tag,真正的歌词数据则放到一个数组里。目前这数组在内部ram中试640字节,eeprom中有1500字节。程序优先使用ram如果ram放步下则会存到eeprom中。eeprom剩下的空间用于存放文件夹的信息,用于支持文件的任意存放。

    由于部分歌词会存放到eeprom中,eeprom的操作很慢,所以歌词推荐那种使用多个tag公用一个歌词的形式,[xx:xx][yy:yy]XXXX  。当然不是这种也支持了。像这种歌词:

[ti: Bohemian Rhapsody (Mercury)]
[ar:Queen]
[al:A Night At The Opera (c)1975]

[00:01]Is this the real life
[00:04]Is this just fantasy
[00:07]Caught in a landslide
[00:10]No escape from reality
[00:15]Open your eyes
[00:18]Look up to the skies and see
[00:25]I'm just a poor boy, I need no sympathy
[00:31]Because I'm easy come, easy go,
[00:35]little high, little low,
[00:38]Anyway the wind blows, doesn't really matter to me,
[00:48]- to me -,

[00:55]Mama, just killed a man,
[01:01]Put a gun against his head,
[01:05]Pulled my trigger, now he's dead,
[01:09]Mama, life had just begun,
[01:15]But now I've gone and thrown it all away
[01:22]Mama, ooo,
[01:29]Didn't mean to make you cry
[01:32]If I'm not back again this time tomorrow
[01:37]Carry on, carry on, as if nothing really matters

[01:54]Too late, my time has come,
[02:01]Sends shivers down my spine,
[02:04]Body's aching all the time,
[02:08]Goodbye everybody - I've got to go
[02:14]Gotta leave you all behind and face the truth
[02:21]Mama, ooo
[02:28]I don't want to die,
[02:31]I sometimes wish I'd never been born at all

[03:05]I see a little silhouetto of a man,
[03:08]Scaramouche, scaramouche will you do the Fandango
[03:11]Thunderbolt and lightning - very very frightening me
[03:16]Galileo, Galileo,
[03:17]Galileo, Galileo
[03:19]Galileo figaro - Magnifico
[03:22]I'm just a poor boy and nobody loves me
[03:25]He's just a poor boy from a poor family
[03:29]Spare him his life from this monstrosity
[03:33]Easy come easy go -, will you let me go
[03:36]Bismillah! No -, we will not let you go - let him go
[03:40]Bismillah! We will not let you go - let him go
[03:43]Bismillah! We will not let you go - let me go
[03:46]Will not let you go - let me go
[03:48]Will not let you go - let me go
[03:50]No, no, no, no, no, no, no
[03:53]Mama mia, mama mia, mama mia let me go
[03:56]Beelzebub has a devil put aside for me, for me
[04:03]for me -

[04:14]So you think you can stone me and spit in my eye
[04:20]So you think you can love me and leave me to die
[04:25]Oh Baby - Can't do this to me baby -
[04:32]Just gotta get out - just gotta get right outta here

[05:10]Nothing really matters,
[05:14]Anyone can see,
[05:18]Nothing really matters -, nothing really matters to me

[05:40]Any way the wind blows...

这样程序至少要花10秒钟才能把多余的数据存到eeprom中

像这种:
[ti:细说往事]
[ar:南方二重唱]
[al:细说往事]
[by:炫网资讯 Liuxuan.com]
[00:00.00]细说往事 - 南方二重唱
[00:09.56]词/曲:李子恒
[00:12.24]
[02:55.60][00:14.89]蓝蓝的天
[02:58.17][00:17.31]往事一缕轻烟飘过你的眼廉
[03:05.12][00:23.89]沉默的眼
[03:07.19][00:25.75]请回答我还爱不爱我的从前
[03:13.56][00:32.82]我的从前
[03:16.06][00:35.03]有你陪伴的梦和一张疼爱的脸
[03:22.80][00:41.49]如今细说往事
[03:25.05][00:43.95]往事如烟
[03:26.61][00:45.65]我是否还算是你的誓言
[03:30.60][00:49.97]
[04:09.91][02:04.40][00:50.93]白云翩翩
[04:11.78][02:06.32][00:52.83]心事一面银幕飘过你的窗前
[04:18.63][02:13.12][00:59.79]寂寞的窗
[04:20.53][02:15.07][01:01.45]请开启我被岁月紧锁的思念
[04:27.54][02:22.02][01:08.45]我的思念
[04:29.58][02:24.00][01:10.63]有你牵挂的心和一首叫做誓言
[04:36.30][02:30.59][01:16.91]如今细说往事
[04:38.48][02:32.97][01:19.50]往事如烟
[04:40.13][02:34.51][01:21.09]我是否还算是你的从前
[04:46.16][02:39.20][01:26.58]
[03:34.05][01:28.01]往事从头
[03:35.59][01:30.17]轻轻细说梦的演变
[03:42.30][01:36.95]多年以后
[03:44.56][01:39.04]是否还有爱的容颜
[03:51.42][01:45.93]往事从头
[03:53.52][01:47.97]轻轻细说沧海桑田
[04:00.20][01:54.65]是否能够
[04:02.40][01:56.87]回到从前再走一遍
[04:08.67][02:02.68]

就比较好了,用不着eeprom了。


程序不仅在LCD上显示信息在串口也会show一些,





说说字库文件:
    总共有四个文件:st12.sys,st16.sys,gbk2uni.sys,uni2gbk。其中st12/16是12*12 和16*16点阵字库。其余两个为gbk和unicode互转的文件。
其中st16和gbk2uin.sys没有用到,但是我程序中没有去掉,如果想去调请在程序中改,在LCD_GBK.c文件的初始化中改。
    字库是GBK字库,不是GB2312,所以支持很多汉字,总共两万多个,所以再生僻的都可以正常显示,如下面的繁体:

[ti:失恋阵线联盟]
[ar:草蜢]
[al:]
[by:ZJM]
[00:00]失戀陣線聯盟
[00:10]演唱:草蜢

[00:14]
[01:43][00:16]她總是只留下電話號碼
[01:47][00:19]從不肯讓我送她回家
[01:50][00:23]聽說你也曾經愛上過她
[01:54][00:26]曾經也同樣無法自拔
[01:57][00:30]你說你學不會假裝瀟洒
[02:01][00:34]卻教我別太早放棄她
[02:05][00:37]把過去全說成一段神話
[02:08][00:41]然後笑彼此一樣的傻
[02:12][00:45]我們這麼在乎她卻被她全不抹煞
[02:16][00:48]越疼她越傷心永遠得不到回答
[02:19][00:52]到底她怎麼想應該繼續猜測嗎
[02:23][00:56]還是說好全忘了吧
[02:27][00:59]找一個承認失戀的方法
[02:30][01:03]讓心情好好的放個假
[02:34][01:06]當你我不小心又想起她
[02:45][02:41][02:37][01:10]就在記憶裡畫一個"X"
[01:14](Music)

该上程序了:

bootloader的hex文件:
(有了这个文件就可以直接使用avrstudio用了)
(注我板子用的14.7456M的晶振,如是其它请修改程序便以后再用)
点击此处下载ourdev_180798.zip(文件大小:2K)
主程序的hex:
点击此处下载ourdev_180799.zip(文件大小:34K)

放在SD卡或U盘中的文件:
(注意不要让这个四个文件有碎片,方法之一:格式化再放文件)
点击此处下载ourdev_180802.zip(文件大小:727K)

bootloader程序:
点击此处下载ourdev_180800.zip(文件大小:65K)
主程序:
(我的板子用14.7456的晶振,115200的波特率)
点击此处下载ourdev_180801.zip(文件大小:127K)



最近公司事特别多,所以业余玩AVR也该告一段落了。这个程序也是我一年来玩AVR的积累吧,99%的程序都是我自己写的,一个字一个字敲出来的,其间花的时间也是非常多。总共应该有近7000行。

最后上传一首好听的歌,以前收音机经常听到。《细说往事》,最近心情也许就是歌辞中描述的差不多:
歌词上面有,把它考下来保存为文本后缀lrc即可。
点击此处下载armok01180916.zip


这是原理图:
(是缺陷板的原理图,具体有哪些问题在上面已经说过了,谢谢armok!)
点击此处打开ourdev_180835.pdf(文件大小:43K)



趁编辑权限还没过期上点图片:










出0入0汤圆

 楼主| 发表于 2007-11-14 00:54:22 | 显示全部楼层
歌词要村到eeprom时的显示:


顺便介绍一个超强的软件:Procom
支持很多种通信协议,什么X/Y/Z modem阿,还有VT100等协议,可以用来构建菜单的,有兴趣的去搜用用。
串口调试只是其最基本的功能,比普通的串口调试软件强多了。

在贴子里的连接内有一个连接,在那个帖子里有这个软件最新版本的下载。

出0入0汤圆

 楼主| 发表于 2007-11-14 00:58:58 | 显示全部楼层
忘了说了,文件系统支持FAT16/32, FAT12不支持。字库制作方法我以前有帖子,unicode和gbk的转换也有帖子。可以以我的id搜索一下。

出0入0汤圆

发表于 2007-11-14 01:04:43 | 显示全部楼层
顶一个!
请问FAT部分支持文件夹访问吗?

出0入0汤圆

发表于 2007-11-14 07:46:54 | 显示全部楼层
去年卖的缺陷板的原理图我这里没有呀,能否上传一下????
头像被屏蔽

出0入0汤圆

发表于 2007-11-14 07:59:13 | 显示全部楼层
个人业余玩AVR暂告一段落?

哈哈,是不是商业性地玩AVR开始了?

出0入0汤圆

发表于 2007-11-14 07:59:17 | 显示全部楼层
强人,顶一个!

出0入0汤圆

发表于 2007-11-14 08:04:35 | 显示全部楼层
好强~!

顶你个肺啊 ~!

出0入0汤圆

发表于 2007-11-14 08:32:05 | 显示全部楼层
项一下,收藏起来,慢慢欣赏!谢谢!

出0入0汤圆

发表于 2007-11-14 08:46:20 | 显示全部楼层
强人,顶一个!

出0入0汤圆

 楼主| 发表于 2007-11-14 08:57:02 | 显示全部楼层
to 【3楼】 avruser:
    不明白你啥意思,这个FAT程序不是完整的FAT程序,fat.c这个文件中有很多函数都没用到,如果做为简单的验证的话这些函数可以完成fat的全部功能,如显示目录下的文件,创建/删除文件夹,创建/删除文件,读写文件等。不过这个fat.c程序还不完善。不建议去用它,建议去网上搜搜完整的fat程序。
    不过访问文件夹是可以的,至少文件可以存放在任意目录下。

to 【5楼】 armok 阿莫:
    没有,现在的工作跟avr没啥关系,工作又很忙,所以暂且放放。玩avr到现在就用13开发过一个产品。其余都是业余玩的,花的银子到现在也不少了。下面如果有空的话回去接触接触arm,mips,linux等东西,这是工作中用到的。

to 【4楼】 _yu-ming:
    这个需要征求一下armok的意见。不过原理图也不复杂,从程序中就可以看出到底该怎么接。

另外这个程序本来是用在另一个我自己焊板子上的,所以还有ks0108的和IDE的驱动,不过程序中并未用到了。

出0入0汤圆

发表于 2007-11-14 09:28:43 | 显示全部楼层
强烈支持一下。

出0入0汤圆

发表于 2007-11-14 09:43:25 | 显示全部楼层
谢谢【10楼】 bozai ,我就是看到你的IDE驱动的,你的这个功能比我的那个强很多,你的程序里有IDE、SD卡、U盘的驱动,如果全部使用到那功能就很强大了。向你学习了。

出0入0汤圆

 楼主| 发表于 2007-11-14 10:08:42 | 显示全部楼层
to 【12楼】 _yu-ming:
    原来我做的那块这些都支持的,而且CH375 LCD都是采用总线方式驱动的,不过那个没有移植歌词显示的程序。现在那块板被我扔在家里,就是我跑贪食蛇游戏的那块板子。如果需要的话,晚上回去把那块板的电路图发上来。
    armok的这块板如果想玩的话还可以做很多功能的,比如ch375还可以做u盘,坛子里有人做出来,可惜就是没有人发上来。
还有上次有人发帖通过串口记录文件,用这块板也很好。现在我的程序用掉了大概40KB的程序,所以还可以加很多功能。不过我是没时间了做。

出0入0汤圆

发表于 2007-11-14 10:30:02 | 显示全部楼层
我现在准备做一个能在SD卡里创建文件的的东东,可以像电子书那样的,用一块彩色的LCD显示文件内容,可以实时的记录一些信息。我现在还有好多地方没有搞明白,到时向您请教。原本想创建一个Excel的文件,考虑到文件结构比较复杂,最后还是准备采用TXT文件。

出0入0汤圆

发表于 2007-11-14 11:07:17 | 显示全部楼层
顶一下, 顺便,如果有ProCom软件的话, 不妨传到这来一下,这东西搜了一下, 不好找。

出0入0汤圆

发表于 2007-11-14 11:22:49 | 显示全部楼层
谢谢楼主!
楼主说的那个软件Procom,怎么搜不到?

出0入0汤圆

 楼主| 发表于 2007-11-14 11:27:39 | 显示全部楼层
不好意思,是procomm plus,刚才搜了一下没找到合适的下载地址。我用的是V4.7版本的,很老了还是98年的东西。网上都是4.8的,不过不好意思这东西不能传上来,这是公司买的软件,还请体谅。

PS:可以用电驴搜一下,那上面东西可全了。

出0入0汤圆

发表于 2007-11-14 11:49:10 | 显示全部楼层
呵呵,楼主太客气了,谢谢楼主讲的那么详细,我再用其它方法搜搜看^_^..
头像被屏蔽

出0入0汤圆

发表于 2007-11-14 11:51:52 | 显示全部楼层
【10楼】 bozai  ,

===================
to 【4楼】 _yu-ming:
    这个需要征求一下armok的意见
===================

当然没有问题,上传上来啊。

出0入0汤圆

 楼主| 发表于 2007-11-14 12:09:40 | 显示全部楼层
好的,谢谢!已上传了。

出0入0汤圆

发表于 2007-11-14 12:29:26 | 显示全部楼层
不错,非常好!

出0入0汤圆

发表于 2007-11-14 13:11:23 | 显示全部楼层
不错,佩服lz

出0入0汤圆

发表于 2007-11-14 14:14:45 | 显示全部楼层
谢谢 bozai 晚上回家我可以试试了。。。

出0入0汤圆

发表于 2007-11-14 15:04:15 | 显示全部楼层
你太猛了!羡慕哈!向你学习哈!!本来要学习FAT,和SD的,结果有时间却跑去看动画片了~汗~

出0入0汤圆

 楼主| 发表于 2007-11-14 21:29:01 | 显示全部楼层
LS啥动画片啊?我在公司的娱乐就等着每周二的prision break了,其它没啥看的了。

出0入0汤圆

发表于 2007-11-14 21:52:18 | 显示全部楼层
to bozai:

庆祝,庆祝,呵呵!祝贺一个不错的MP3诞生了。

我刚看到了你问歌词的事情,不好意思,工作忙,一时没有顾的上来。的确,RAM太小不好存歌词文件的。我使用AVR扩展了128KB内存,所以处理起来比较方便一些。如下是程序:

//**************************************************************
//search the whole LRC file to match time info
//Return: time matched: 1 and load it to buffer
//        Not matched : 0
byte load_LRC_file(byte minute, byte second, byte page, byte *buffer)
//**************************************************************
{
    word LRC_file_pos=0;
    byte minuteL, minuteH;
    byte secondL, secondH;
   
    //select buffer page
    switch(page)
    {
    case 1: xRAM_page_one(); break;
    case 2: xRAM_page_two(); break;
    };
    XRAM_Active();
    do {
    //search '[' and '0' in LRC file
    while(LRCFileBuffer[LRC_file_pos]!='[')
    {
        LRC_file_pos++;
    }
     
    //start to read time info
    LRC_file_pos++;
    //ASCII code to hex code
    minuteH = LRCFileBuffer[LRC_file_pos++] - 0x30;
    minuteL = LRCFileBuffer[LRC_file_pos++] - 0x30;
    LRC_file_pos++; //skip ':'
    secondH = LRCFileBuffer[LRC_file_pos++] - 0x30;
    secondL = LRCFileBuffer[LRC_file_pos++] - 0x30;
   
    //get minute and second, store them in minuteL, secondL
    minuteL = minuteH * 10 + minuteL;
    secondL = secondH * 10 + secondL;
    //check to see if time is full matched ?
    if((minute==minuteL)&&(second==secondL))
    {
        //skip time info string, start to copy txt string
        while(LRCFileBuffer[LRC_file_pos]!=']') LRC_file_pos++;
        LRC_file_pos++; //skip ']'
        
        //Skip the next time record, Exp:[04:12.34][02:42.14]...
        while(LRCFileBuffer[LRC_file_pos]=='[')
        {
        while(LRCFileBuffer[LRC_file_pos]!=']') LRC_file_pos++;
        LRC_file_pos++;
        }
               
        //0x0d, 0x0a are txt end signs.
        while(LRCFileBuffer[LRC_file_pos]!=0x0d)
        {//Copy txt string   
        *buffer++ = LRCFileBuffer[LRC_file_pos++];
        }
        *buffer = 0x00; //Set last char NULL
        XRAM_Invalid();
        return 1; //time is matched
    }
    }while(LRC_file_pos<LRCFileInfo.FileSize);
   
    XRAM_Invalid();
    return 0; //time is not matched      
}

注释:LRCFileBuffer存储的是LRC文件的起始地址。播放时,由中断服务程序启动load_LRC_file()函数,主循环完成搜索,歌词匹配后,调入显示缓冲区开始显示。

出0入0汤圆

发表于 2007-11-14 21:53:01 | 显示全部楼层
TO LZ
学校有个FTP4。上面全是动画片
我看了
有火影,死神,海贼王 不过还在连载
浪漫主义的~零之使魔,阿兹漫画大王,骇客时空,轻松的动画片
超现实主义的~速写者,绝对成人看的~

还看了个生化危机3,不过感觉不如前两部好了!没头没尾的~

你上班就辛苦多了~

出0入0汤圆

发表于 2007-11-14 21:58:59 | 显示全部楼层
我也传一些图片上来:







对应歌词:
[ti:无尽的爱]
[ar:成龙&金喜善]
[00:03.46]成龙--金喜善 - 无尽的爱(神话主题曲)
[00:17.18]成:解开我 最神秘的等待
[00:24.12]星星坠落 风在吹动
[00:31.56]终于再将你拥入怀中
[00:38.73]两颗心颤抖
[00:46.57]相信我 不变的真心
[00:53.77]千年等待 有我承诺
[01:01.26]无论经过多少的寒冬
[01:08.72]我决不放手
[01:15.98](韩)金:现在紧抓住我的手 闭上眼睛
[01:22.43]请你回想起过去我们恋爱的日子
[01:29.68]我们是因为太爱
[01:34.15]所以更使得我们痛苦
[01:37.07]我们连“爱你“这句话都无法讲
[01:45.29]音乐
[02:01.21]成:每一夜 被心痛穿越
[02:07.62]思念永没有终点
[02:16.08]早习惯了孤独像随
[02:23.51]我微笑面对
[02:30.93]相信我 我选择等待
[02:37.10]再多苦痛也不闪躲
[02:44.54]只有你的温柔能解救
[02:51.38]无边的冷漠
[02:58.76](韩)金:现在紧抓住我的手 闭上眼睛
[03:06.09]请你回想起过去我们恋爱的日子
[03:13.16]我们是因为太爱
[03:17.87]所以更使得我们痛苦
[03:20.76]我们连“爱你“这句话都无法讲
[03:27.90]合:让爱成为你我心中
[03:32.27]那永远盛开的花
[03:35.17]穿越时空绝不低头 永不放弃的梦
[03:42.45]我们是因为太爱
[03:48.25]所以更使得我们痛苦
[03:51.15]我们连“爱你“这句话都无法讲
[03:58.54]让爱成为你我心中
[04:03.08]那永远盛开的花
[04:06.06]我们千万不要忘记 我们的约定
[04:13.27]唯有真爱追随你我
[04:17.84]穿越无尽时空
[04:19.87]我们连“爱你“这句话都无法讲
[04:31.20]成:爱是心中唯一不变美丽的神话

照片比较土,呵呵!

出0入0汤圆

 楼主| 发表于 2007-11-14 22:01:37 | 显示全部楼层
呵呵项目挺多啊,
生化危机我看过,这边公司里也有nas服务器,不过有些下了没怎么看,偶尔看看小新。那个百家讲坛也很不错。
我以后有空会玩玩arm,到时候要向你请教请教阿。
AVR暂且放放,以后用得着再用,回家看哪个小弟弟(我爸兄弟4个)对这个有兴趣给他们玩。

出0入0汤圆

发表于 2007-11-14 22:06:21 | 显示全部楼层
公司事情多的跟啥一样,我们搞的是风力发电的变流器技术,老板都在催项目。

出0入0汤圆

 楼主| 发表于 2007-11-14 22:06:21 | 显示全部楼层
to 【29楼】 elefan:
    elefan来了,哈哈,至少照片很清楚。我手机拍得效果很差,待会回去传一下。
液晶是128*64的吧,如果是12*12的点阵可以显示更多的字。不过大液晶处理起来也有麻烦,ram空间会感到明显不足。

出0入0汤圆

发表于 2007-11-14 22:11:25 | 显示全部楼层
对的,是12864的ST7920液晶,还不用字库,也省得麻烦了。12*12 也可以用。我的上面那个程序中的分,秒计算都是计算出来的,这样时间信息比较准确。尤其对付VBR文件,计算时间要注意。否则音乐没到,歌词都跑的不见影了。

出0入0汤圆

 楼主| 发表于 2007-11-14 22:13:17 | 显示全部楼层
to 【27楼】 elefan:
    明白了!谢谢!有大容量的ram就是好啊,可以把整个歌词down下来,在ram中搜索快多了,就不会出现“卡”的情况了。
m64 4K的ram在这个程序中用起来太小了,呵呵

出0入0汤圆

发表于 2007-11-14 22:15:48 | 显示全部楼层
楼主别忘记了常来坐坐!

出0入0汤圆

 楼主| 发表于 2007-11-14 22:16:11 | 显示全部楼层
to 【33楼】 elefan:
    我用的vs1003芯片,vs1003芯片提供解码时间的,我歌词同步就是读vs1003内的解码时间来同步的。
对,如果时间不对就全显示了,我只要摸一下vs1003晶振的脚时间就乱了,所以我在晶振下贴了个胶布

出0入0汤圆

发表于 2007-11-14 22:18:55 | 显示全部楼层
对的啊,我先把歌词加载到内存,随我怎么处理都行,呵呵!在内存中作事情几乎不占用什么CPU资源。

出0入0汤圆

 楼主| 发表于 2007-11-14 22:22:17 | 显示全部楼层
用arm就好了,把m64换成m1281也就行了。可惜m1281国内都没找到卖的

出0入0汤圆

 楼主| 发表于 2007-11-14 22:27:42 | 显示全部楼层
to 【35楼】 haizhilan Mazp:
    呵呵! 我会爱上潜水的 偶尔可能会上来透透气

出0入0汤圆

发表于 2007-11-14 22:28:41 | 显示全部楼层
我这样计算时间:

//******************************************************************
//根据文件大小,文件比特率,计算时间
//返回时候,全局变量minute,second存储计算后的时间值
//返回: 1->success    0->failed(全局变量minute=0;second=0;)
byte calculate_time_info(dword file_size)
//******************************************************************
{   
    word bytes_per_second;
    word currentSeconds;
   
    //clear time info
    minute=0; second=0;
    if((mp3FileInfo.bitRate!=0)&&(isCBRFile==1))
    {
    //It is CBR file
    bytes_per_second = (mp3FileInfo.bitRate/8)*1000;
    currentSeconds = file_size/bytes_per_second;
    minute = currentSeconds/60;
    second = currentSeconds % 60;
    return 1;
    }
    return 0;
}

//-----------------------------------------------------------------
//26ms per frame for mp3
#define TIME_PER_FRAME  26
//******************************************************************
//从当前帧数中解码时间
//返回时: 全局变量minute和second有效
//但是如果帧数是0
void frame_number_get_time(void)
//******************************************************************
{   dword frame_number;
    word currentSeconds;

    frame_number = sta013GetFrameNumber();
    currentSeconds = (word)((frame_number * TIME_PER_FRAME)/1000);
    //global variable
    minute = currentSeconds / 60;
    //global variable
    second = currentSeconds % 60;
}

MP3文件一帧时间总是26ms,所以用这个计算就很准确。我测试过VBR和CBR文件,都没有问题。

出0入0汤圆

 楼主| 发表于 2007-11-14 22:33:42 | 显示全部楼层
哦,谢谢!
STA013提供解码帧数的是吧?,嗯一帧26ms很好计算。

请问做过计算文件总时间的程序吗?
对于CBR的好办,VBR的话,有的VBR文件有一个tag记录总共有多少帧的,这个也好办,有的VBR文件没这个tag,这个就难办了,我以前想做个进度条之类的,就是卡在这不知道如何解决。

出0入0汤圆

发表于 2007-11-14 22:39:18 | 显示全部楼层
VBR文件计算如果没有TAG的话,也不好办,呵呵!不过都可以读取到一个平均值,好像VBR文件有这个东西。

通过我上面的程序,因为我已经获取了VBR文件的准确时间,我只要知道了这个时间流过的数据流量,可以在最开始播放的1秒内计算,我就可以知道了很准确的平均比特率,呵呵!一样计算。

出0入0汤圆

 楼主| 发表于 2007-11-14 22:44:26 | 显示全部楼层
嗯,取平均值,可行,但是取最开始播放的1秒不太好,一般歌曲前面愣是没声音。
VBR的tag应该是XING,记得还有一种。不过我分析了我有的一个vbr文件,里面没找到这两种tag

出0入0汤圆

发表于 2007-11-14 22:48:00 | 显示全部楼层
你没有明白意思:

我先通过它计算时间:void frame_number_get_time(void) ,这个是很准确的。我以他为基准,假设流过了0.5秒的时间,我记住流过这个时间段的字节数,然后就知道了比特率,这个比特率就是很准确的VBR文件比特率。之后你就按照CBR文件处理就行了:)

出0入0汤圆

发表于 2007-11-14 22:51:42 | 显示全部楼层
呵呵,波仔的力作!一定要好好支持才行的!

不过,你有空还是要常上来看看哈~

出0入0汤圆

 楼主| 发表于 2007-11-14 22:56:00 | 显示全部楼层
to 【44楼】 elefan:
    好,谢谢!以后有空再试试。

to 【45楼】 benladn911 AVR猎手:
    谢谢!呵呵,有空会来的,工作是挺忙的,但是总要有休息的时间。
头像被屏蔽

出0入0汤圆

发表于 2007-11-15 07:30:29 | 显示全部楼层
bozai强人啊。我们有近200块缺陷板低价处理了,利用我们的缺陷板做成功了,这是我第一次听说。

出0入0汤圆

发表于 2007-11-15 07:43:46 | 显示全部楼层
请问坛主邮购部现在出售的MP3板是否还存在缺陷?此MP3板是否带SD卡?本人想购买一块.
头像被屏蔽

出0入0汤圆

发表于 2007-11-15 07:52:12 | 显示全部楼层
这是一年前的缺陷板了。目前供应的版,是一年前已经修正了所有缺陷并且已经定型的板。带SD卡座。SD卡需要自行购买。

出0入0汤圆

发表于 2007-11-15 08:57:14 | 显示全部楼层
LZ是85年的?真是前途大大的无限啊~~~HOHO
顶呀!

出0入0汤圆

发表于 2007-11-15 12:41:41 | 显示全部楼层
bozai 用最新的V3版应该可以运行你的程序吧。

出0入0汤圆

 楼主| 发表于 2007-11-15 13:12:15 | 显示全部楼层
to 【51楼】 _yu-ming:
    不清楚后来的板子各个芯片的引脚是否改变了。
如果改变了就不可以,不过没关系,把vs1003b.h ch375.h lcd.h 和主文件涉及管脚的宏定义改一下就行了

出0入0汤圆

 楼主| 发表于 2007-11-15 13:18:51 | 显示全部楼层
ch375的:
#define CH375_PORT PORTD
#define CH375_DDR  DDRD
#define CH375_PIN  PIND

#define CH375_WR_PORT PORTC
#define CH375_WR_DDR  DDRC
#define CH375_WR_PIN  PINC
#define CH375_WR_BIT  PC5

#define CH375_RD_PORT PORTC
#define CH375_RD_DDR  DDRC
#define CH375_RD_PIN  PINC
#define CH375_RD_BIT  PC4

#define CH375_A0_PORT PORTC
#define CH375_A0_DDR  DDRC
#define CH375_A0_PIN  PINC
#define CH375_A0_BIT  PC3

#define CH375_CS_PORT PORTC
#define CH375_CS_DDR  DDRC
#define CH375_CS_PIN  PINC
#define CH375_CS_BIT  PC7

#define CH375_INT_PORT PORTC
#define CH375_INT_DDR  DDRC
#define CH375_INT_PIN  PINC
#define CH375_INT_BIT  PC6

VS1003的

#define VS1003B_XCS_DDR  DDRB
#define VS1003B_XCS_PORT PORTB
#define VS1003B_XCS_BIT  4

#define VS1003B_DREQ_DDR  DDRB
#define VS1003B_DREQ_PORT PORTB
#define VS1003B_DREQ_PIN  PINB
#define VS1003B_DREQ_BIT  6

#define VS1003B_XDCS_DDR  DDRB
#define VS1003B_XDCS_PORT PORTB
#define VS1003B_XDCS_BIT  7

#define VS1003B_XRESET_DDR  DDRB
#define VS1003B_XRESET_PORT PORTB
#define VS1003B_XRESET_BIT  5

#define VS1003B_SCK_DDR  DDRB
#define VS1003B_SCK_PORT PORTB
#define VS1003B_SCK_BIT  1

#define VS1003B_MOSI_DDR  DDRB
#define VS1003B_MOSI_PORT PORTB
#define VS1003B_MOSI_BIT  2

#define VS1003B_MISO_DDR  DDRB
#define VS1003B_MISO_PORT PORTB
#define VS1003B_MISO_BIT  3

SD卡的:
#define MMC_SD_CS_DDR  DDRB
#define MMC_SD_CS_PORT PORTB
#define MMC_SD_CS_BIT  0

#define MMC_SD_SCK_DDR  DDRB
#define MMC_SD_SCK_PORT PORTB
#define MMC_SD_SCK_BIT  1

#define MMC_SD_MOSI_DDR  DDRB
#define MMC_SD_MOSI_PORT PORTB
#define MMC_SD_MOSI_BIT  2

#define MMC_SD_MISO_DDR  DDRB
#define MMC_SD_MISO_PORT PORTB
#define MMC_SD_MISO_BIT  3

LCD的:
/************************* SPI ***********************************/
/* 1: means use hardware SPI, while 0 means use GPIO to simulate SPI       */
#define HW_SPI 1

/******************* Hardware pins definition **********************/
#define LCD_RS_DDR  DDRF
#define LCD_RS_PORT PORTF
#define LCD_RS_BIT  0

#define LCD_E_DDR  DDRF
#define LCD_E_PORT PORTF
#define LCD_E_BIT  2

#define LCD_RST_DDR  DDRF
#define LCD_RST_PORT PORTF
#define LCD_RST_BIT  3

#define LCD_SCK_DDR  DDRB
#define LCD_SCK_PORT PORTB
#define LCD_SCK_BIT  1

#define LCD_MOSI_DDR  DDRB
#define LCD_MOSI_PORT PORTB
#define LCD_MOSI_BIT  2
/********************************************************************/

主程序中的:

#define MODE _BV(PE6)
#define STOP _BV(PE7)
#define NEXT _BV(PE3)
#define UP   _BV(PE5)
#define DOWN _BV(PE4)
#define PREV _BV(PE2)


UART的:

//#define FOSC   7372800
#define FOSC   F_CPU
//#define BAUD   115200
#define BAUD   115200



其中sd卡的只有cs脚可以动,因为必须用spi,同样vs1003只有xcs xdcs,dreq,reset等可以变
主程序中的定义的不好,如果是非prote端口则要修改安健处理的部分,不过可以全局替换porte
uart部分,只要跟该工程芯片的频率即可。
lcd部分,spi为0时管脚可以任意改
lcd,ch375不需要改变。

出0入0汤圆

发表于 2007-11-15 13:57:50 | 显示全部楼层
谢谢了!我正在学习

出0入0汤圆

 楼主| 发表于 2007-11-15 14:14:43 | 显示全部楼层
to 【51楼】 _yu-ming:
    刚才我看了一下另一个人发的程序,至少除了ch375(程序中没有)外,管脚定义是和缺陷板是一样的,因此程序可以直接使用。
唯一要改的就是bootloader程序的晶振,主程序如果要115200的波特率也可以重新选下频率,重新编译即可。因为我用的是14.7456的晶振。这样处理起歌词会快些。

出0入0汤圆

发表于 2007-11-15 14:22:19 | 显示全部楼层
好的,谢谢bozai,我昨晚回去看了一下我那块板子,3310的液晶上次被我弄坏了,我这个周末去买一个换上就可以用了。。

出0入0汤圆

 楼主| 发表于 2007-11-15 14:39:07 | 显示全部楼层
你可以通过串口调试工具来看看能不能用
如果直接烧得话,7.3728的晶振就是57600的波特率。修改频率重新编译,或换14.7456的就可以使用115200的波特率,同样如果用bootloader也要把 bootloader程序重新编译,或换14.7456的晶振。

出0入0汤圆

发表于 2007-11-15 15:51:52 | 显示全部楼层
路过,Thanks

出0入0汤圆

发表于 2007-11-15 16:40:51 | 显示全部楼层
我打算去买块来玩玩,顺便学学读SD卡,今天已经下单了,周末应该就可以拿到,我在东莞应该很快

出0入50汤圆

发表于 2007-11-17 12:29:20 | 显示全部楼层
我的第800分就给这个帖子吧,正好也给这个帖子顶到60帖。

正在准备打算用SD卡存储数据,谢谢波仔了!以后记得常来,既然转到ARM了,多到ARM区发发帖子,在那里等你的精华帖!

出0入0汤圆

发表于 2007-11-17 14:05:47 | 显示全部楼层



请BOZAI解答一下VS1003的外围电路的问题,可否省略重复的线!

出0入0汤圆

发表于 2007-11-17 22:52:33 | 显示全部楼层
回楼上,我前段时间疯狂了两个星期,也做了个MP3,不过只支持硬盘,1602显示,我就没有焊那些重复的线,工作很稳定,在播放MP3文件时没有任何杂音,但128KBPS以上的MP3就有一点杂音了,而在放WMA时速度倒是正常,不过就是有滋拉的杂音,关于这个问题,我以前在论坛上问过,不过没有得到合适的回答,现在估计不是接线的问题,可能是SPI速度太慢,虽然从硬盘读取比较快,但从AVR传到VS1003就比较慢 了,我用的16L,只能上到8M,我没有超频.
   我的音质比很多低价国产货都好,开了重低音之后很爽,比我女朋友的400元的歌美MP3要好,不过个人觉得都接上应该更好,因为电流可以从不同的端口流出,这样一方面可以降低对地压降(因为我觉得任何导线都有电阻,电流越大,压降越大,不过我觉得实际中应该不会造成什么大的问题),另一方面可以减轻芯片上的电流负担.业务条件下为了DIY方便,不接完全没有问题.正规产品还是老实点好

出0入0汤圆

发表于 2007-11-17 23:19:00 | 显示全部楼层
楼主说的那个软件procomm plus,怎么找不到,在那里可下载?

出0入0汤圆

 楼主| 发表于 2007-11-22 13:20:40 | 显示全部楼层
请问大家用这个代码的都可以正常工作吗?
昨晚测试另一块3310lcd时发现一个问题:
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=856019&bbs_page_no=1&bbs_id=9999
如果碰到类似问题,请按照上面连接中的帖子里的方法修改。

回 【63楼】 gdgmlzw :
    抱歉,再找找吧

出0入0汤圆

发表于 2007-11-28 19:49:14 | 显示全部楼层
to 【29楼】 elefan
请问elefan兄能否提供一下你这个图片里的源代码与原理图,我很想DIY一个,在这里也要感谢你提供的串口控制VS1003的那个程序,谢谢你!

出0入0汤圆

发表于 2007-12-12 18:56:52 | 显示全部楼层
顺便补充一下CBR,ABR,VBR文件的意思,呵呵,网上找来的,方便大家看上面的帖子,LZ与elefan的确利害的,elefan的回复很有参考价值,要特别感谢他,
(1)VBR(Variable Bitrate)动态比特率。也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率,这是以质量为前提兼顾文件大小的方式,推荐编码模式;  
(2)ABR(Average Bitrate)平均比特率,是VBR的一种插值参数。LAME针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。ABR在指定的文件大小内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量,可以做为VBR和CBR的一种折衷选择。  
(3)CBR(Constant Bitrate),常数比特率,指文件从头到尾都是一种位速率。相对于VBR和ABR来讲,它压缩出来的文件体积很大,而且音质相对于VBR和ABR不会有明显的提高

出0入0汤圆

发表于 2008-2-10 19:40:47 | 显示全部楼层
我的天啊  刚发现的帖子

早就说na  375电路有缺陷    那默默搪塞我

他就是不承认


加根带磁环的延长线(可以凑或用)

出0入0汤圆

发表于 2008-2-10 20:15:15 | 显示全部楼层
有几天没上来啦,强!

出0入0汤圆

发表于 2008-2-23 10:44:05 | 显示全部楼层
收藏

出0入0汤圆

发表于 2008-2-23 21:25:23 | 显示全部楼层
LZ真强,程序下载了,研究下,正巧前两天刚买了MP3学习板

出0入0汤圆

发表于 2008-2-24 13:17:18 | 显示全部楼层
强!谢谢先!

出0入0汤圆

发表于 2008-2-29 09:13:20 | 显示全部楼层
楼主,问个小问题,SD卡读的时候问什么,要往SPDR写入0XFF,谢谢了

出0入0汤圆

发表于 2008-2-29 21:16:56 | 显示全部楼层
顶下.

出0入0汤圆

发表于 2008-3-28 11:06:20 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-3-30 10:19:55 | 显示全部楼层
顶起来,非常棒,bozai我也有这块板,如果用你的程序,就直接烧这个进去对吗?
主程序的hex:
点击此处下载ourdev_180799.zip(文件大小:34K)

版上晶振本来是7.3728 要改成14.7456的晶振对吗

出0入0汤圆

 楼主| 发表于 2008-3-30 13:20:21 | 显示全部楼层

出0入0汤圆

发表于 2008-4-6 17:46:01 | 显示全部楼层
bozai大哥,我是新手,想用你的程序来做个MP3,我用的U盘是联想智存卡3.0 杀毒版,里面有个装杀毒软件的分区是不能格式华的,另外一个分区就可以,请问下这种U盘可以用吗。还有你上面提到要用你这个“主程序的hex”程序,晶振要改成14.多的对吗?
你用什么软件下载到单片机里的,熔丝怎么配置的。
谢谢

出0入0汤圆

发表于 2008-4-6 18:15:44 | 显示全部楼层
TO 65楼,我已经开源了VS1003的代码了,你修改移植一下就可以用,我能开源的我都开源了,没有想保留什么。

出0入0汤圆

发表于 2008-4-7 09:15:54 | 显示全部楼层
bozai大哥,我是新手,想用你的程序来做个MP3,我用的U盘是联想智存卡3.0 杀毒版,里面有个装杀毒软件的分区是不能格式华的,另外一个分区就可以,请问下这种U盘可以用吗。还有你上面提到要用你这个“主程序的hex”程序,晶振要改成14.多的对吗?
你用什么软件下载到单片机里的,熔丝怎么配置的。
谢谢

出0入0汤圆

 楼主| 发表于 2008-4-7 09:35:30 | 显示全部楼层
to 【79楼】 csjy
    不好意思,前几天休假,没上来看看。
   
    那个u盘,只要第一个分区是存放数据的分区就可以用,如果不是则要改程序才可以。
   
    下面两个问题相信我在楼主位都说过。用什么下载软件,看个人喜好,我用mcuisp

出0入0汤圆

发表于 2008-4-7 11:50:30 | 显示全部楼层
很好,程序很好

出0入0汤圆

发表于 2008-4-7 11:50:54 | 显示全部楼层
to bozai 大哥







就是图里这样的分区,可以吗?那个H盘是个杀毒软件 (原文件名:未命名.gif)

出0入0汤圆

发表于 2008-5-7 09:18:59 | 显示全部楼层
请问 bozai 章其波,这个程序在放320Kbps的MP3、同步显示歌词,播放会不会一卡一卡的?我自己做的MP3用的是硬盘,昨天测试了一下,用我自己写的程序显示一个汉字要大约要3ms多(编码存放在RAM中,字库在硬盘上,屏是T6963);测试时每秒显示30个汉字,这时如果播放的是320Kbps的MP3就会一卡一卡的。是不是SD卡寻址比硬盘快啊?

出0入0汤圆

 楼主| 发表于 2008-5-7 17:21:08 | 显示全部楼层
to 【82楼】 csjy
    不好意思,一直忘了看了。 从图上看,貌似不行。 要改程序的

to 【83楼】 314forever
    我以前做过读硬盘的,貌似不会,再用USB - IDE转一下就会有。 目前程序在8M时读SD卡,播放320kbps时,歌词超过20个字时 会卡的。 到了12M以上就不会了。 所以我都是用14.7456或者内部8M然后设OSSCAL为0xff
    我觉得从响应时间来看,sd卡响应要快些。 硬盘的话要等磁头转到那个地方呢。

出0入0汤圆

发表于 2008-5-8 11:04:40 | 显示全部楼层
看来是我的程序写得不好,谢谢bozai了。

出0入0汤圆

发表于 2008-5-8 15:19:09 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-5-10 12:20:34 | 显示全部楼层
记号,谢谢!!

出0入0汤圆

发表于 2008-5-10 15:40:10 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2008-5-29 08:46:13 | 显示全部楼层
jihao

出0入0汤圆

发表于 2008-5-29 08:49:03 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-7-2 20:19:50 | 显示全部楼层
bozai,请问可以只烧主程序就可以完成所有功能吗?还有可以用m128完全代替否?

出0入0汤圆

发表于 2008-7-2 22:57:39 | 显示全部楼层
Armok是否可以再做200个板子卖,感兴趣者甚众,至少我要1块

出0入0汤圆

发表于 2008-7-6 09:32:02 | 显示全部楼层
bozai太猛了,我也想试试MP3。

出0入0汤圆

发表于 2008-7-14 16:25:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-7-27 18:53:30 | 显示全部楼层
仿制成功,都是自己用万用板焊的,谢谢bozai朋友,很爽,不过就PrComm这个软件我在帖子的连接下载,支持不了中文,不知道是不是设置问题,如何设置,谢谢大家!

出0入0汤圆

发表于 2008-7-29 10:01:04 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-7-29 19:55:28 | 显示全部楼层
好帖子,留个名字。

出0入0汤圆

发表于 2008-8-6 14:47:41 | 显示全部楼层
bozai,我使用2005版本的gcc编译,修改一些配置后,发现编译成功,能运行,但到查找歌词文件那就会引起软件复位(此时按键没有作用)或者是停留在死机处。
但烧录你给出的hex就可以播放。
不知道是编译器版本问题还是其他问题?

出0入0汤圆

发表于 2008-8-7 12:05:14 | 显示全部楼层
下了个最新200806版本,ok了,谢谢bozai的开源

出0入0汤圆

发表于 2008-9-3 12:53:10 | 显示全部楼层
我想用射频信号控制mp3的歌曲播放,但是不知道m64的按键端口地址是什么?怎么用高低电平控制?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 09:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表