找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 43181|回复: 155
打印 上一主题 下一主题
收起左侧

2051单片机+SD卡+3310LCD=音乐播放器(附全套制作资料)

  [复制链接]
跳转到指定楼层
楼主
ID:51654 发表于 2013-7-10 01:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhu123 于 2013-7-11 07:24 编辑

   本作品是参考了51hei论坛上几位强人的帖子才完工,把他们的程序给整合了了一下为我所有呵呵,这个小玩意,采用 ATMEL 的传统51MCU作主控制芯片,加上SD卡和显示屏,就可以作简单的音乐播放器了,虽然音质不怎么样,不过作为DIY还是蛮有乐趣,希望大家喜欢。
没有采用FAT文件系统,只是按扇区读取SD卡,由于2051资源有限,改为4051有望可以操作FAT,但目前程序还在不断完善中。
128byte怎样读取512byte的扇区数据?可以采用边读边播放的方式,就能解决。音乐文件是32KHz取样率的WAV文件,所以和HIFI就沾不上边了。
程序是用C来编写,以方便交流,资料整理中,完善后再上传。



还是有就视频文件,顺便听听音质。

无法在线观看的话点击此处下载视频:http://www.51hei.com/f/bofangqi.avi


  下面是测试用的HEX文件,由于部分显示数据在SD卡中,所以SD卡需要存入一个特别的文件,然后把格式为32KHZ,8bit,单声的WAV文件存入即可。
点击此处下载: sdka.rar (2.45 KB, 下载次数: 544)

添加内容:
播放器升级预告,增加FAT32文件系统,也就是可以随意增减音乐文件,不必按连续的储存空间存放文件,允许有文件碎片,同时也不再需要在SD卡内存放一个经特殊制作系统文件。
硬件没改变,只是软件升级,虽然增加了FAT32部分代码,但总代码量仍在2K以内,89C2051能装得下。
测试基本通过,上传升级版的整套工程文件,以及SD内的示范文件: 播放器源码 SD卡内示范文件.rar (429.28 KB, 下载次数: 889)

  由于水平有限,程序可能还有很多不完善的地方,希望51hei论坛的坛友多提意见。特别是SD卡驱动和FAT32文件系统,本人理解并不深入,程序对各种SD卡的兼容性未作详细测试,有可能出现某些SD卡不能播放的情况。对SD卡的基本要求是 文件系统为FAT32格式,暂不支持FAT16;SDHC高速卡也不支持。

评分

参与人数 7威望 +11 黑币 +41 收起 理由
穿着安踏去拉萨 + 7 这设计很给力
onefrog + 5 赞一个!
absflash + 11 很给力!
liunk + 5 + 5
qzsulin + 1 + 1 很给力!
admin + 10 赞一个!
wangyin + 5 + 2 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏25 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:51024 发表于 2013-7-10 08:25 | 只看该作者
这确实很强悍,希望能解释一下电路
回复

使用道具 举报

板凳
ID:51654 发表于 2013-7-10 08:33 | 只看该作者
wangyin 发表于 2013-7-10 08:25
这确实很强悍,希望能解释一下电路

R1、C1 组成LCD的上电复位电路。
R2~R4是上拉电阻,虽然2051的IO有内部的弱上拉,但这三个IO是LCD接口与键盘接口复用,需要上拉强一点。
R5、R6、Q1组成OC输出的反相器,当SCE为高电平时,三极管导通,键盘使能,LCD通信中止;当SCE为低电平时,LCD通信使能,键盘断开。需要注意的是图中左右两键没加隔离二极管,不要同时按下,否则引起显示错乱。
R2~R6的参数不要大幅度改动,这些参数是经过计算得到一个比较合适的值。
晶振、C3、C5没什么好说,这些都单片机系统必需的。
R7、R8是P1.0和P1.1的上拉电阻,因为这两个口是开漏输出。
R9~R24组成R2R型DAC,选取50K/100K是因为2051输出高电平的带载能力差,电阻太小将导致DAC线性变差。这里的电阻最好用1%的金属膜电阻,以改善DAC的线性度。50K电阻是非标电阻,这里用51K和2.7M电阻并联代替。
C6是高频滤波电容,以减少DAC输出的高频噪声。
C7是输出耦合电容,连接LINE OUT输出端子,输出阻抗较高,50K,只能接功放机或有源音箱。如果接耳机,需加一级放大,可以用运放做跟随器,或用TDA2822功放IC,能带个小嗽叭。
回复

使用道具 举报

地板
ID:51663 发表于 2013-7-10 08:35 | 只看该作者
//由于部分显示数据在sd卡中,所以sd卡需要存入一个特别的文件//
那个是特别文件还不明白你的意思
回复

使用道具 举报

5#
ID:51654 发表于 2013-7-10 08:48 | 只看该作者
longdi 发表于 2013-7-10 08:35
//由于部分显示数据在sd卡中,所以sd卡需要存入一个特别的文件//
那个是特别文件还不明白你的意思

是一个存放歌曲名称、歌手名称、歌曲首址和长度的文件,2051只有2K ROM,不可能把整个中文字库存进ROM内,只能存在SD卡中,以图片形式存贮,需要时读入。哪位能用VB或VC做一个转换工具自动生成一个playlist.dat就方便了。
回复

使用道具 举报

6#
ID:51663 发表于 2013-7-10 08:49 | 只看该作者
请问,老大,你这个屏多少钱买的啊???
回复

使用道具 举报

7#
ID:51654 发表于 2013-7-10 08:50 | 只看该作者
longdi 发表于 2013-7-10 08:49
请问,老大,你这个屏多少钱买的啊???

这是旧手机上拆的,淘宝大约10元以下。
回复

使用道具 举报

8#
ID:51024 发表于 2013-7-10 08:50 | 只看该作者
楼主,我想问一下你之前说的用电源线驱动595然后带3个数码管。
我现在已经知道如何用单线驱动595,然后用QH脚驱动三极管控制2个数码管,再用595的QH'脚控制第3个数码管(刚焊电路,还没验证,但原理是这样的吧?)。
我想知道的是如何把这些信号加到电源上,谢谢了。
还有,我现在是3个数码管,2个按键,能用1个IO实现吗?我用2个可以,1个想不出来。
回复

使用道具 举报

9#
ID:37685 发表于 2013-7-11 07:04 | 只看该作者
本帖最后由 a119 于 2013-7-11 07:46 编辑

楼主,用你提供的SD卡内示范文件也是一样,就是一开始时出现了一秒钟一约而过的杂音,
显示的时间在走。郁闷啊我搭了整天的电路白搞了
回复

使用道具 举报

10#
ID:51654 发表于 2013-7-11 07:25 | 只看该作者
a119 发表于 2013-7-11 07:04
楼主,用你提供的SD卡内示范文件也是一样,就是一开始时出现了一秒钟一约而过的杂音,
显示的时间在走。

能走时能显示画面说明基本上访问文件OK了,是不是没接功放机?或功放输入阻抗不够高?由于DAC后没放大,因而输出信号很微弱。
可以连接到电脑的LINE IN输入端,用声卡放音。
回复

使用道具 举报

11#
ID:37685 发表于 2013-7-11 07:46 | 只看该作者
已接了功放,情况如下:
SD卡是FAT32,将《SD卡内示范文件》全持拷入SD卡中,接上功放,打开播放器,可以显示“255.BMP”画面,按下播放键后,显示“001.BMP”-----001,绝恋,的画面,在此开始一刻发出“坑--坑”二声,频普有显示起伏,不到一秒,之后就没有声音,频普也静止了,只是时间地走,9秒后转入第二首时,进入“002.BMP”----002-陳慧嫻 - 逝去的諾言  画面,频普不动,时间在走,没有声音,进入第三首“003-張宇 - 用心良苦”时一样,画面仍能正常显示,时间也在走动,开始一刻发出“坑--坑”二声,频普有显示起伏,不到一秒,之后就有持续的“沙沙”声,频普也有起伏,直到歌曲结束。“沙沙”声也停止。
DAC电路严格按照一楼的电路。
回复

使用道具 举报

12#
ID:51654 发表于 2013-7-11 07:59 | 只看该作者
按照你说的情况,很有可能是访问文件分区表时,链表计算出差错了,只有第一个簇地址计算正确。我检查了程序,没发现计算有什么问题。不我知道你的SD卡实际情况,如果你有WINHEX这个软件,可以打开SD卡的盘符查看其详细内容,对比着程序进行检查。
回复

使用道具 举报

13#
ID:37685 发表于 2013-7-11 08:09 | 只看该作者
楼主,可能就是你说这个原因吧,我测试用的是2G的SD卡,我换用了另外一张512M的TF卡,同样是你那测试文件,效果却不一样,不过仍然放不出声音,只是三首歌都有“沙沙”声出现,再者就是我用2G的TF卡测试,先法读取TF卡,只显示“E1”的错误代码,看你的程序应该是初始化失败吧,不过我对FAT32未看懂,所以无从下手,希望楼主多换几张卡试下
回复

使用道具 举报

14#
ID:51024 发表于 2013-7-11 08:11 | 只看该作者

LZ真的很强啊 上一个汇编写的VGA方块游戏 我已经搭出来了 并且小改一下 加了 红 黄 绿 黑 白 全屏测试图 一直懒得发帖
我自己也用洞洞板 C编程 做了个FM收音机 也懒得发帖...LZ强人 膜拜
不知道 LZ能不能用 摄像头 + 51 + SD 做出超轻录像装置?可以用在航模航拍上
回复

使用道具 举报

15#
ID:51654 发表于 2013-7-11 09:31 | 只看该作者
本帖最后由 zhu123 于 2013-7-11 09:33 编辑

回复a119:
我找来了一些SD卡测试,分别测试了 128M 3张,256M 张,512M 1张,1G 1张,4G 1张,8G 1张,16G 2张。
其中 1G 以下的都能正常放音;
1G 的一张出现 E1 错误代码,原因未明;
1G 以上的都是 SDHC,由于程序尚未支持,均显示 E1。

按照你测试512M情况,有沙沙声,能正确走时,能显示画面,很可能已是正常放音状态,仔细检测一下硬件,DAC电阻网络是否有错,阻值是否正确,音频输出是否与其它控制线短路。

不知道你下载程序后有没有重新编译?偿试重新下载,不要编译,直接烧录 SD_player.hex 试试。
由于不同版本编译器,不同的优化级别,可能产生大于2K代码,大于2051的容量,可能会导致程序跑飞。
回复

使用道具 举报

16#
ID:37685 发表于 2013-7-11 09:34 | 只看该作者
终于搞定了 爽啊 谢谢楼主热心回复我这种菜鸟.
回复

使用道具 举报

17#
ID:2318 发表于 2013-7-11 10:45 | 只看该作者
楼主:


与你讨论一个问题:你的播放器应该是播放8位精度的WAV吧。


现在PC上的音乐一般都是16位精度的,使用商业软件将16位的数字音频转换成8位精度后,效果都不是太好,主要是转换成8位后,有比较大的背静噪声,大大影响播放的质量(这个已经不是播放器本身的问题了,各位可以直接在PC上做测试)。


图1:16bit提示音的WAVE波形图




图2:转换成8BIT的WAVE图,可以看出,在16BIT图中前面静音部分,转换成8位后变粗了,产生了噪声




下面是这2个WAV文件,各位可以下载测试。
提示音8bit.rar (38.51 KB, 下载次数: 31)
提示音16bit.rar (137.25 KB, 下载次数: 18)

LZ是否考虑这个问题,如何解决?


其它各位有好的算法或处理方法吗?

回复

使用道具 举报

18#
ID:51654 发表于 2013-7-11 11:46 | 只看该作者
你好,对于你所提及的问题,在我转换过的声音文件中也有同样体现。究其原因,主要是8BIT取样深度不够,声音电平在接近零点时,由于随机噪声的影响,导致取样值在0x80,0x79,0x81这间变化,以产生噪声。我认为这种噪声一直都存在,只是其它声音较大时掩蔽了而矣。
    解决方法,可参考类似杜比动态降噪技术,作这样的处理:检测当前声音幅度,如果在持续的一段时间内(比如0.2秒)声音幅度小于一定值(比如0x80 正负1),那么都过滤为0x80,即可解决此问题。
    我记得有些音频处理软件可以进行这种变换,我回去找找。即使没有,编个小程序转一下也不难。
回复

使用道具 举报

19#
ID:51654 发表于 2013-7-11 11:46 | 只看该作者

听过你所提供的8BIT声音样本,发现其噪声很大,估计所用的商业软件在转换算法上有问题。我用WINDOWS XP附件自带的录音机,打开原始16BIT声音文件,然后另存为44KHz 8BIT,效果也比你的好得多。
回复

使用道具 举报

20#
ID:2318 发表于 2013-7-11 12:02 | 只看该作者
谢谢!

我使用过几个商业软件,如上图中的AUDITION、天天静听等,都是如此。自己写了一个转换程序,就是直接简单的采用除256的方法,直接把16位降成8位,这样处理后,静音部分可以完全转换为静音,而且总的噪声比这些商业软件小了许多(-3db左右),但是还有,还是可以比较清晰的听到,尤其是当调节音量输出比较大的时候。

我会试一下WINDOWNS的附件,听听效果。

现在手头的项目,需要语音提示。考虑到存储容量,使用8K、8位的WAV数据,应该可以达到电话的语音质量,对于一般应用够了。其它都可以,成本也不高,就是转换数据本声的噪声。想找一种简单的处理办法。

后面我还会继续提供一些我使用过的处理办法。

另外是否其它的朋友有这方面的经验,软件或算法,只要提供一个思路就可以了,先表示感谢。
回复

使用道具 举报

21#
ID:1 发表于 2013-7-11 12:10 | 只看该作者
点击此处下载:http://www.51hei.com/f/goldwave v5.23.rar 汉化版
用这个转换成8Bit单声道PCM文件,效果很好。16Bit转8Bit不会改变采样频率,故需先转成32KHz的其它格式再转成PCM
回复

使用道具 举报

22#
ID:1 发表于 2013-7-11 12:12 | 只看该作者
hkccd:我提个建议吧。我做过类似的项目,是用PWM直接接一功放驱动喇叭。没有加低通滤波,当使用20K以下的采样频率WAV文件时有啸声,使用20K以上时人就听不到了。这里应该是由PWM的高低电平跳动引起的,使用DA应该没有类似问题。
所以我就没有采用8K的采样,而是使用24K采样,8:2的ADPCM编码方式。对比下文件大小:8KHz 8Bit的PCM格式64Kbps, 24KHz 8Bit ADPCM为 24*8/4 = 48Kbps,只有8K的3/4大小。而音质上压缩的肯定比降低采样频率更好一些。
这里也有一个小问题,我使用这个软件编8:4 ADPCM再解码时有很大噪音,这里是因为其码表可能与我用的不同。网上8bit的ADPCM基本上没有,我是将16位的改成8位的,所以码表是可能不同。我的解决办法是自己编码再自己解码,8:2也能达到较好的效果,听歌尚可,语音更不用说,用DA的话效果肯定更好,而加滤波的话有些音色会变。
回复

使用道具 举报

23#
ID:1 发表于 2013-7-11 13:13 | 只看该作者
播放BUF和读取BUF我是分开的,开辟了两个数据区A,B,这样就不用读一个播放一个。播放完BUF_A再播放BUF_B,同时BUF_A从FLASH中读取相应数据,依此循环。
回复

使用道具 举报

24#
ID:2318 发表于 2013-7-11 14:14 | 只看该作者
谢谢您了,我会用你建议的goldwave v5.23.rar试一下的。

压缩编码的方式我知道,做过图象的压缩,JPEG,H26x等。在这个项目上,不想使用这么复杂的东西。我设计是提供一个DS卡,和规定的文件名,然后给的PC程序给用户。用户自己需要什么语音自己在PC上做,然后转换成8位的,考入SD卡就可以了。

另外,系统使用8位MCU,时钟也就10M左右,还要做其它的事情,ADPCM解码,还是不做的好。

另外,你的解释是不对的。我提供的两个文件与系统播放无关,就是在PC上转换,然后在PC上播放,采样率为44.1k。仅用PC转换,在PC播放,沙沙的噪声非常明显。与什么PWM没有关系。
回复

使用道具 举报

25#
ID:1 发表于 2013-7-11 15:37 | 只看该作者
嗯,我所说的是针对用单片机PWM来驱动喇叭的,而你所说的沙沙楼主说的很对
回复

使用道具 举报

26#
ID:2318 发表于 2013-7-11 15:51 | 只看该作者
本帖最后由 hkccd 于 2013-7-11 15:53 编辑

网上有个软件,叫WAVclean。

用它可以把8BIT带沙沙声的WAVE转换成无沙沙声的WAVE,但是又回到16bit了,但是,的确沙沙声没有了(其它软件将8BIT沙沙的WAV转换成16bit,沙沙声是去不掉的)。

但用它转换成8BIT的,不管原来是16位的,还是8位的,都没有用,沙沙声仍然存在。
所以我就没有采用8K的采样,而是使用24K采样,8:2的ADPCM编码方式。对比下文件大小:8KHz 8Bit的PCM格式64Kbps, 24KHz 8Bit ADPCM为 24*8/4 = 48Kbps,只有8K的3/4大小。而音质上压缩的肯定比降低采样频率更好一些。
这里也有一个小问题,我使用这个软件编8:4 ADPCM再解码时有很大噪音,这里是因为其码表可能与我用的不同。网上8bit的ADPCM基本上没有,我是将16位的改成8位的,所以码表是可能不同。我的解决办法是自己编码再自己解码,8:2也能达到较好的效果,听歌尚可,语音更不用说,用DA的话效果肯定更好,而加滤波的话有些音色会变。
--------------------------------------------------------------------------------------
我都是使用44.1K做测试的,所以应该与采样频率关系不大了。
WAVE的PCM是最原始的编码,然后在此基础上再进行ADPCM压缩。如果16位PCM转到8位PCM后,已经有沙沙声了,ADPCM压缩好象是去不掉的。不知道你的方法是如何处理的。
回复

使用道具 举报

27#
ID:51654 发表于 2013-7-11 15:55 | 只看该作者
看来51hei论坛的交流气氛还是不错的.
  三个工具软件转换后的效果基本一致,都比18楼的效果好,但背景沙沙声还是有,这可能已是8BIT取样深度的极限,不是通过降噪软件可以处理的。
    下面是我对降噪的一些见解,不一定正确,马老师看看是否能用得上:
    为了提高信噪比,既然噪声没法减弱,我们可以采用增强信号的方法,即把原来的声音放大。我用工具软件可以检测到,原始的声音文件录电电平只是-5dB左右,还没有达到最大幅度,因而可以把声音规格化到0dB后再作8BIT变换,这样处理可以使转换后的声音文件信噪比提高5dB.
    另外,硬件上的低通滤波器也很重要。背景噪声的频率绝大部分都是1/2取样频率以上,可以通过高阶低通滤波器滤除。常规的RC滤波器滚降率太小,一般不能满足要求,用运放构成的二阶滤波器效果较好,适当调节阻容参数,使Q值稍高,可以达到较陡峭的滤波特征,高频衰减滚降较快。电脑声卡为了兼容各种不同取样率的音频,输出级的低通滤波器不一定做得很好。
回复

使用道具 举报

28#
ID:51025 发表于 2013-7-11 17:58 | 只看该作者
小弟不才,
请问楼主
void timer0 (void) interrupt 1 using 1
{
    if (TL0 & 1) _nop_(); //消除中断响应时间不一致,造成的频率抖动
    P1  = pbuf[++p & 63]; //输出一个声音数据
}

这其中的" & 63"的作用是什么呢?
回复

使用道具 举报

29#
ID:51654 发表于 2013-7-11 19:02 | 只看该作者
lizi 发表于 2013-7-11 17:58
小弟不才,
请问楼主
void timer0 (void) interrupt 1 using 1

p & 63 是取8位“p”中的低6位,舍弃高2位,由于缓冲区只有64字节,“++p & 63”正好循环指向pbuf[0]至pbuf[63]。
回复

使用道具 举报

30#
ID:51479 发表于 2013-7-19 12:20 | 只看该作者
楼主,我也在做这个,前一个程序下载进去是只显示00:00 ||按下播放再按下暂停,声音也没有,图片也没显示,要怎么弄呢?示范文件跟你的一样,要怎么改程序、原理图?
回复

使用道具 举报

31#
ID:52972 发表于 2013-8-13 09:05 | 只看该作者
回复

使用道具 举报

32#
ID:48075 发表于 2013-8-14 04:25 来自手机 | 只看该作者
留名备用。。。。。
回复

使用道具 举报

33#
ID:51540 发表于 2013-8-21 08:19 | 只看该作者
不错
回复

使用道具 举报

34#
ID:53823 发表于 2013-8-31 10:27 | 只看该作者
请问你那个分时间片显示时间或标志是怎么回事啊?我看你的视频中,他不是同时显示的吗?
回复

使用道具 举报

35#
ID:55734 发表于 2013-10-9 02:09 | 只看该作者
看看学习学习。。
回复

使用道具 举报

36#
ID:56209 发表于 2013-10-22 15:49 | 只看该作者
楼主在么?请问我要做一个这种播放器,不要显示屏,该怎么处理啊?另外你能不能把你的程序改下,发给我,我着急做一个送人,谢谢,请看到了尽快和我联系,632033558这是我的QQ号码。
回复

使用道具 举报

37#
ID:56893 发表于 2013-11-14 20:24 | 只看该作者
想问一句,楼主还在么
回复

使用道具 举报

38#
ID:33668 发表于 2013-11-20 20:56 | 只看该作者
谢谢楼主分享!!!!!!!!!!!!!
回复

使用道具 举报

39#
ID:52919 发表于 2013-11-22 15:40 | 只看该作者
顶,学习一下
回复

使用道具 举报

40#
ID:56523 发表于 2013-11-22 23:02 | 只看该作者
感谢楼主了! 已下载,作个参考资料很不错的. 请多多提供这方面的东西, 以吸引更多初学无经验的爱好者们/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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