打印

DIY基于at89c51snd1c的mp3/cdrom 播放器

[复制链接]
4819|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
toplow|  楼主 | 2008-9-6 22:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本播放器是一款基于ATMEL的MP3芯片AT89C51SND1C设计的,能支持MMC卡,硬盘读取并播放其中的MP3文件,同时能连接CDROM控制其作为一个CD转盘播放歌曲。
控制器的主要特性:
支持MMC卡播放MP3
支持硬盘播放MP3
支持CDROM播放CD
USB支持,连接MMC卡或者硬盘后作为U盘使用
24X2红色背光字符型LCD
CS4331-KS D/A转换
耳机放大电路
IDE接口,用来连接硬盘或者CDROM
RS232信号预留,用以调试软件或者串口控制播放器
DS18B20预留,用以方案中温度检测使用
IIC总线预留,用以扩展FM调谐器
4 KEY作为控制
4 LED作为电源,硬盘,CDROM工作状态指示
红外线遥控接收头
立体声音频输入口预留
USB下载程序,方便软件调试与固件升级


可以学习的内容大致有usb,文件系统,红外控制,硬盘,光驱,mmc卡驱动等。


原理图代码下载


相关链接:http://www.taihumicro.com/files/cdrom_mp3.pdf

相关帖子

沙发
toplow|  楼主 | 2008-9-6 22:46 | 只看该作者

pic

使用特权

评论回复
板凳
toplow|  楼主 | 2008-9-6 22:46 | 只看该作者

图片

使用特权

评论回复
地板
toplow|  楼主 | 2008-9-6 22:47 | 只看该作者

代码

使用特权

评论回复
5
armecos| | 2008-9-7 08:23 | 只看该作者

好,先看看

使用特权

评论回复
6
古道热肠| | 2008-9-7 12:34 | 只看该作者

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

"微控电子"的ARM网站做得不错,上面好东东蛮多.
哈哈,您用的是哪个遥控器?能否把遥控部分相关资料整理整理.作为网站DIYPC遥控器的参考.

使用特权

评论回复
7
toplow|  楼主 | 2008-9-7 14:59 | 只看该作者

遥控器用得m50462芯片

采用中断方式,通过两个脉冲之间的间隔来确定0和1,用一个定时器来量两个脉冲之间的时间。



#include "config.h"                         /* lib configuration header */
#include "remote_drv.h"
#include "lib_mcu imer imer_drv.h"        /* timer driver definition */
#include "lib_mculcdlcd_drv.h" 
#include "lib_mcukbdkey_drv.h"            /* Keyboard driver definition */
#include <stdio.h>


INT8U  gl_rmt;
bit    gl_rmt_ok;

INT32U u32RmtValue;           /*用于存放接收到的遥控信号*/
INT8U  u8BitPoint;
INT8U  u8ReceiveEnd;



/////////////////////////////////////////////////////////////////////////////
void  remote_disable(void)    
{
  EX1 = 0;
}


/////////////////////////////////////////////////////////////////////////////
void  remote_enable(void)     
{
  u32RmtValue = 0;      //32bit receive value = 0
  u8ReceiveEnd = 0;     //not start to receive
  u8BitPoint = 0;       //bit point reset
  gl_rmt = 0xff;
  gl_rmt_ok = FALSE; 
  EX1 = 1;              //enable ext1 interrupt
}


/////////////////////////////////////////////////////////////////////////////
void t1_remote_init(void)
{
  T1_init(0,0,0x10);    //T1工作于方式1,16BIT计数器
  T1_start();           //开计数器1,用于判断遥控脉冲周期
  IT1 = 1;              //外部中断INT1管脚电平下降沿触发中断
  remote_enable();
}



/////////////////////////////////////////////////////////////////////////////
INT8U remote_value(void)
{
   INT8U u8Value;

   if(gl_rmt_ok == TRUE)
   {
      switch(gl_rmt)
      {
         case 0x90:  u8Value = REMOTE_0;      break;  
         case 0x00:  u8Value = REMOTE_1;      break;
         case 0x10:  u8Value = REMOTE_2;      break;
         case 0x08:  u8Value = REMOTE_3;      break;
         case 0x18:  u8Value = REMOTE_4;      break;
         case 0x04:  u8Value = REMOTE_5;      break;
         case 0x14:  u8Value = REMOTE_6;      break;
         case 0x0c:  u8Value = REMOTE_7;      break;
         case 0x1c:  u8Value = REMOTE_8;      break;
         case 0x80:  u8Value = REMOTE_9;      break;
         case 0x50:  u8Value = REMOTE_CHUP;   break;
         case 0x48:  u8Value = REMOTE_CHDN;   break;
         case 0x4c:  u8Value = REMOTE_MUTE;   break;
         case 0x40:  u8Value = REMOTE_POWN;   break;
         case 0x44:  u8Value = REMOTE_VOUP;   break;
         case 0x54:  u8Value = REMOTE_VODN;   break;
         case 0xd8:  u8Value = REMOTE_CALL;   break;
         case 0xcc:  u8Value = REMOTE_LUUP;   break;
         case 0xdc:  u8Value = REMOTE_LUDN;   break;
         case 0x88:  u8Value = REMOTE_10UP;   break;
         case 0xe8:  u8Value = REMOTE_TIME;   break;
         case 0xec:  u8Value = REMOTE_NONE;   break;
         default :   u8Value = REMOTE_NONE;   break;
      }
      remote_disable();
      return (u8Value);
   }
   else
      return (0xff);





//////////////////////////////////////////////////////////////////////////////////
Interrupt(remote_int(void), IRQ_INT1)
{
  INT8U  bTbit;
  INT8U  i;
  INT16U u16TimeValue;

  EX1 = 0;                  //关中断

  T1_stop();                //关定时器
  u16TimeValue = TH1;       //取定时器值
  u16TimeValue <<= 8;
  u16TimeValue += TL1;
  TH1 = 0x00;
  TL1 = 0x00;
  T1_start();               //开定时器  

  if((u16TimeValue > 1800)&&(u16TimeValue < 2200))
     bTbit = 1;
  else if((u16TimeValue > 900)&&(u16TimeValue < 1100))
     bTbit = 0;             //判断出得到的位是1还是0
     
  if(u8BitPoint < 32)
  {
    u32RmtValue += bTbit;
    u8BitPoint ++;
    u32RmtValue <<= 1;
  }
  else 
  {
    u8ReceiveEnd = 1; 
    u8BitPoint = 0;
  }

  if(u8ReceiveEnd == 1)     //收满4个字节的数据后,进行字节内容判断
  {
    for(i=0; i<16; i++)
    {
       if((u32RmtValue & 0xff000000) == 0xe2000000)
       {
          gl_rmt = (u32RmtValue >> 16);
          gl_rmt_ok = TRUE; 
          break;
       }
       else
       {
          u32RmtValue <<= 1;
       }
     } 
    u8ReceiveEnd = 0;
    u32RmtValue = 0;
  }

  EX1 = 1;    
}

使用特权

评论回复
8
古道热肠| | 2008-9-7 15:30 | 只看该作者

好的,谢谢楼主

现在已有网友提供了TC9012 及NEC芯片的解码,再加上楼主的提供M50462,哈哈,好,常见的都有参照了.

使用特权

评论回复
9
wch16621| | 2008-9-21 11:02 | 只看该作者

学习中

使用特权

评论回复
10
tomystory| | 2008-9-22 22:29 | 只看该作者

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

想整一个玩一下

使用特权

评论回复
11
suxiaobo64| | 2008-10-25 23:47 | 只看该作者

111

学一下

使用特权

评论回复
12
ecitapple| | 2008-11-4 16:38 | 只看该作者

这个想做啊

这个想做啊,长见识了

使用特权

评论回复
13
zcx11| | 2010-4-20 10:58 | 只看该作者
正在整这个,学习了。

使用特权

评论回复
14
enddy| | 2010-4-29 23:17 | 只看该作者
只有软的部分阿。硬的部分可以分享下吗?可以发到我邮箱:chga_1980@163.com  多谢多谢。

使用特权

评论回复
15
diylink| | 2010-6-17 17:18 | 只看该作者
好东西,学习了

使用特权

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

本版积分规则

30

主题

94

帖子

3

粉丝