DIY基于at89c51snd1c的mp3/cdrom 播放器

[复制链接]
 楼主| toplow 发表于 2008-9-6 22:44 | 显示全部楼层 |阅读模式
本播放器是一款基于ATMEL的MP3芯片AT89C51SND1C设计的,能支持MMC卡,硬盘读取并播放其中的MP3文件,同时能连接CDROM控制其作为一个CD转盘播放歌曲。<br />控制器的主要特性:<br />支持MMC卡播放MP3<br />支持硬盘播放MP3<br />支持CDROM播放CD<br />USB支持,连接MMC卡或者硬盘后作为U盘使用<br />24X2红色背光字符型LCD<br />CS4331-KS&nbsp;D/A转换<br />耳机放大电路<br />IDE接口,用来连接硬盘或者CDROM<br />RS232信号预留,用以调试软件或者串口控制播放器<br />DS18B20预留,用以方案中温度检测使用<br />IIC总线预留,用以扩展FM调谐器<br />4&nbsp;KEY作为控制<br />4&nbsp;LED作为电源,硬盘,CDROM工作状态指示<br />红外线遥控接收头<br />立体声音频输入口预留<br />USB下载程序,方便软件调试与固件升级<br /><br /><br />可以学习的内容大致有usb,文件系统,红外控制,硬盘,光驱,mmc卡驱动等。<br /><br /><br />原理图代码下载<br /><br /><br /> 相关链接:<a href='http://www.taihumicro.com/files/cdrom_mp3.pdf'>http://www.taihumicro.com/files/cdrom_mp3.pdf</a>
 楼主| toplow 发表于 2008-9-6 22:46 | 显示全部楼层
 楼主| toplow 发表于 2008-9-6 22:46 | 显示全部楼层

图片

 楼主| toplow 发表于 2008-9-6 22:47 | 显示全部楼层

代码

  <br /> 相关链接:<a href='http://www.taihumicro.com/files/atmel_LIB.rar'>http://www.taihumicro.com/files/atmel_LIB.rar</a>
armecos 发表于 2008-9-7 08:23 | 显示全部楼层

好,先看看

  
古道热肠 发表于 2008-9-7 12:34 | 显示全部楼层

东西是楼主做的吗?为何板子上印是微控电子

&quot;微控电子&quot;的ARM网站做得不错,上面好东东蛮多.<br />哈哈,您用的是哪个遥控器?能否把遥控部分相关资料整理整理.作为网站DIYPC遥控器的参考.
 楼主| toplow 发表于 2008-9-7 14:59 | 显示全部楼层

遥控器用得m50462芯片

采用中断方式,通过两个脉冲之间的间隔来确定0和1,用一个定时器来量两个脉冲之间的时间。<br /><br /><br /><br />#include&nbsp;&quot;config.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;lib&nbsp;configuration&nbsp;header&nbsp;*/<br />#include&nbsp;&quot;remote_drv.h&quot;<br />#include&nbsp;&quot;lib_mcu        imer        imer_drv.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;timer&nbsp;driver&nbsp;definition&nbsp;*/<br />#include&nbsp;&quot;lib_mculcdlcd_drv.h&quot;&nbsp;<br />#include&nbsp;&quot;lib_mcukbdkey_drv.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Keyboard&nbsp;driver&nbsp;definition&nbsp;*/<br />#include&nbsp;&ltstdio.h&gt<br /><br /><br />INT8U&nbsp;&nbsp;gl_rmt;<br />bit&nbsp;&nbsp;&nbsp;&nbsp;gl_rmt_ok;<br /><br />INT32U&nbsp;u32RmtValue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*用于存放接收到的遥控信号*/<br />INT8U&nbsp;&nbsp;u8BitPoint;<br />INT8U&nbsp;&nbsp;u8ReceiveEnd;<br /><br /><br /><br />/////////////////////////////////////////////////////////////////////////////<br />void&nbsp;&nbsp;remote_disable(void)&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;EX1&nbsp;=&nbsp;0;<br />}<br /><br /><br />/////////////////////////////////////////////////////////////////////////////<br />void&nbsp;&nbsp;remote_enable(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;u32RmtValue&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//32bit&nbsp;receive&nbsp;value&nbsp;=&nbsp;0<br />&nbsp;&nbsp;u8ReceiveEnd&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//not&nbsp;start&nbsp;to&nbsp;receive<br />&nbsp;&nbsp;u8BitPoint&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//bit&nbsp;point&nbsp;reset<br />&nbsp;&nbsp;gl_rmt&nbsp;=&nbsp;0xff;<br />&nbsp;&nbsp;gl_rmt_ok&nbsp;=&nbsp;FALSE;&nbsp;<br />&nbsp;&nbsp;EX1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//enable&nbsp;ext1&nbsp;interrupt<br />}<br /><br /><br />/////////////////////////////////////////////////////////////////////////////<br />void&nbsp;t1_remote_init(void)<br />{<br />&nbsp;&nbsp;T1_init(0,0,0x10);&nbsp;&nbsp;&nbsp;&nbsp;//T1工作于方式1,16BIT计数器<br />&nbsp;&nbsp;T1_start();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开计数器1,用于判断遥控脉冲周期<br />&nbsp;&nbsp;IT1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//外部中断INT1管脚电平下降沿触发中断<br />&nbsp;&nbsp;remote_enable();<br />}<br /><br /><br /><br />/////////////////////////////////////////////////////////////////////////////<br />INT8U&nbsp;remote_value(void)<br />{<br />&nbsp;&nbsp;&nbsp;INT8U&nbsp;u8Value;<br /><br />&nbsp;&nbsp;&nbsp;if(gl_rmt_ok&nbsp;==&nbsp;TRUE)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(gl_rmt)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x90:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x00:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x10:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x08:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x18:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x04:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x14:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0c:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_7;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x1c:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x80:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_9;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x50:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_CHUP;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x48:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_CHDN;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x4c:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_MUTE;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x40:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_POWN;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x44:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_VOUP;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x54:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_VODN;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xd8:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_CALL;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xcc:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_LUUP;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xdc:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_LUDN;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x88:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_10UP;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xe8:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_TIME;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xec:&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_NONE;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;:&nbsp;&nbsp;&nbsp;u8Value&nbsp;=&nbsp;REMOTE_NONE;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remote_disable();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(u8Value);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(0xff);<br />}&nbsp;<br /><br /><br /><br /><br />//////////////////////////////////////////////////////////////////////////////////<br />Interrupt(remote_int(void),&nbsp;IRQ_INT1)<br />{<br />&nbsp;&nbsp;INT8U&nbsp;&nbsp;bTbit;<br />&nbsp;&nbsp;INT8U&nbsp;&nbsp;i;<br />&nbsp;&nbsp;INT16U&nbsp;u16TimeValue;<br /><br />&nbsp;&nbsp;EX1&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关中断<br /><br />&nbsp;&nbsp;T1_stop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关定时器<br />&nbsp;&nbsp;u16TimeValue&nbsp;=&nbsp;TH1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//取定时器值<br />&nbsp;&nbsp;u16TimeValue&nbsp;&lt&lt=&nbsp;8;<br />&nbsp;&nbsp;u16TimeValue&nbsp;+=&nbsp;TL1;<br />&nbsp;&nbsp;TH1&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;TL1&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;T1_start();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开定时器&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;if((u16TimeValue&nbsp;&gt&nbsp;1800)&&(u16TimeValue&nbsp;&lt&nbsp;2200))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bTbit&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;else&nbsp;if((u16TimeValue&nbsp;&gt&nbsp;900)&&(u16TimeValue&nbsp;&lt&nbsp;1100))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bTbit&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//判断出得到的位是1还是0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;if(u8BitPoint&nbsp;&lt&nbsp;32)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;u32RmtValue&nbsp;+=&nbsp;bTbit;<br />&nbsp;&nbsp;&nbsp;&nbsp;u8BitPoint&nbsp;++;<br />&nbsp;&nbsp;&nbsp;&nbsp;u32RmtValue&nbsp;&lt&lt=&nbsp;1;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;u8ReceiveEnd&nbsp;=&nbsp;1;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;u8BitPoint&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;if(u8ReceiveEnd&nbsp;==&nbsp;1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//收满4个字节的数据后,进行字节内容判断<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt16;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((u32RmtValue&nbsp;&&nbsp;0xff000000)&nbsp;==&nbsp;0xe2000000)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gl_rmt&nbsp;=&nbsp;(u32RmtValue&nbsp;&gt&gt&nbsp;16);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gl_rmt_ok&nbsp;=&nbsp;TRUE;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u32RmtValue&nbsp;&lt&lt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;u8ReceiveEnd&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;u32RmtValue&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;EX1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;<br />}
古道热肠 发表于 2008-9-7 15:30 | 显示全部楼层

好的,谢谢楼主

现在已有网友提供了TC9012&nbsp;及NEC芯片的解码,再加上楼主的提供M50462,哈哈,好,常见的都有参照了.
wch16621 发表于 2008-9-21 11:02 | 显示全部楼层

学习中

  
tomystory 发表于 2008-9-22 22:29 | 显示全部楼层

楼主,有PCB和相关芯片卖不?

想整一个玩一下
suxiaobo64 发表于 2008-10-25 23:47 | 显示全部楼层

111

学一下
ecitapple 发表于 2008-11-4 16:38 | 显示全部楼层

这个想做啊

这个想做啊,长见识了
zcx11 发表于 2010-4-20 10:58 | 显示全部楼层
正在整这个,学习了。
enddy 发表于 2010-4-29 23:17 | 显示全部楼层
只有软的部分阿。硬的部分可以分享下吗?可以发到我邮箱:chga_1980@163.com  多谢多谢。
diylink 发表于 2010-6-17 17:18 | 显示全部楼层
好东西,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

94

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

30

主题

94

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部