找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2707|回复: 2
收起左侧

开始MP3的制作!

[复制链接]
ID:83710 发表于 2015-6-23 16:47 | 显示全部楼层 |阅读模式
本帖最后由 hongniu 于 2015-6-23 16:48 编辑

MP3从今天下午开时做,到5点数据调整完毕,完整的播放一首《第一次爱的人》音质可以和我的P4媲美!那叫一个爽啊!现在我才知道SD卡的牛逼!只有玩过的人才会说:原来是这样!看程序!/*真是爽啊!今天下午我没去上班!把MP3搞定了!昨天搞定TFT9325 TFT液晶!现在播放那!!!!12月24日!!!!!用永生难忘!!!!!!*/



  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit p1_7=P1^7;
  5. sbit CS=P2^0; //片选信号(低电平有效)
  6. sbit DATEIN =P2^1;//主-从数据输入
  7. sbit SCLK=P2^2;//时钟信号
  8. sbit DATEOUT=P2^3;//从-主数据输出
  9. uint btime;
  10. uchar c;

  11. sbit led4=P1^0;
  12. sbit led3=P1^1;    //第一个自己编写的c程序,付出了太多,才换回这几行代码,源于热爱!2010年8月8日与天津开发区
  13. sbit led2=P1^2;
  14. sbit led1=P1^3;
  15. uchar g=0,s=0,bw=0,q=0; //显示单元 个位、十位、百位、千位
  16. uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//不带小数点显示0~9

  17. unsigned char bdata dat;
  18. sbit dat_0=dat^0;
  19. sbit dat_1=dat^1;
  20. sbit dat_2=dat^2;
  21. sbit dat_3=dat^3;
  22. sbit dat_4=dat^4;
  23. sbit dat_5=dat^5;
  24. sbit dat_6=dat^6;
  25. sbit dat_7=dat^7;

  26. bit is_init;//决定是否延时;
  27.   uchar lpp;
  28. unsigned char fhz;//返回值
  29. uchar fhz_buff; //读返回值中间量
  30. unsigned char xdata tab[512];

  31. ///*******************以上是SD卡
  32. /*
  33. VS1003mp3模块的接口定义

  34. */
  35. sbit XRST=P1^0;//复位
  36. sbit DREQ=P1^1; //数据请求
  37. sbit XDCS=P1^2;  //数据片选
  38. sbit XCS=P1^3; //命令片选
  39. /*
  40. /* VS1003mp3SPI通信接口定义
  41. */
  42. sbit SCK=P1^4; //时钟
  43. sbit SI=P1^5; //串行输入
  44. sbit SO=P1^6;  //串行输出










  45. void delay(uint time)
  46. {  while(time)
  47.   time--;
  48. }

  49. //**********************************************
  50. /*读sd卡子程序,无返回值,有参函数,参数为要写入DATEIN数据线的字节*/
  51. void write(unsigned char wr_)// 写入一个字节SD卡
  52. {
  53.            dat=wr_;
  54.         DATEIN=dat_7;
  55.    
  56.       SCLK=0;
  57.    if(is_init)delay(200);
  58.      if(!is_init)delay(2);
  59.       SCLK=1;
  60.       if(is_init) delay(200);
  61.        if(!is_init)delay(2);
  62.   
  63.       DATEIN=dat_6;
  64.    
  65.       SCLK=0;
  66.      if(!is_init)delay(2);
  67.     if(is_init)delay(200);
  68.       SCLK=1;
  69.       if(is_init) delay(200);
  70.      if(!is_init)delay(2);

  71.       DATEIN=dat_5;
  72.    
  73.       SCLK=0;
  74.     if(is_init)delay(200);
  75.      if(!is_init)delay(2);
  76.       SCLK=1;
  77.       if(is_init) delay(200);
  78.     if(!is_init)delay(2);

  79.       DATEIN=dat_4;
  80.    
  81.       SCLK=0;
  82.     if(is_init)delay(200);
  83.       if(!is_init)delay(2);
  84.       SCLK=1;
  85.       if(is_init) delay(200);
  86.      if(!is_init)delay(2);

  87.      DATEIN=dat_3;
  88.    
  89.       SCLK=0;
  90.     if(is_init)delay(200);
  91.       if(!is_init)delay(2);
  92.       SCLK=1;
  93.       if(is_init) delay(200);
  94.     if(!is_init)delay(2);

  95.      DATEIN=dat_2;
  96.    
  97.       SCLK=0;
  98.     if(is_init)delay(200);
  99.       if(!is_init)delay(2);
  100.       SCLK=1;
  101.       if(is_init) delay(200);
  102.       if(!is_init)delay(2);

  103.     DATEIN=dat_1;
  104.    
  105.       SCLK=0;
  106.     if(is_init)delay(200);
  107.      if(!is_init)delay(2);
  108.       SCLK=1;
  109.       if(is_init) delay(200);
  110.      if(!is_init)delay(2);

  111.     DATEIN=dat_0;
  112.    
  113.       SCLK=0;
  114.     if(is_init)delay(200);
  115.       if(!is_init)delay(2);
  116.       SCLK=1;
  117.       if(is_init) delay(200);
  118.      if(!is_init)delay(2);
  119. }
  120. unsigned char read()// 读取一个字节SD卡
  121. {
  122.           DATEOUT=1;
  123.          SCLK=1;
  124.    if(is_init)delay(200);
  125.      if(!is_init)delay(2);
  126.    SCLK=0;
  127.     if(is_init)delay(200);
  128.    if(!is_init)delay(2);
  129.     dat_7=DATEOUT;

  130.      SCLK=1;
  131.    if(is_init)delay(200);
  132.    if(!is_init)delay(2);
  133.    SCLK=0;
  134.     if(is_init)delay(200);
  135.      if(!is_init)delay(2);
  136.     dat_6=DATEOUT;

  137.     SCLK=1;
  138.    if(is_init)delay(200);
  139.     if(!is_init)delay(2);
  140.    SCLK=0;
  141.     if(is_init)delay(200);
  142.     if(!is_init)delay(2);
  143.     dat_5=DATEOUT;

  144.     SCLK=1;
  145.    if(is_init)delay(200);
  146.      if(!is_init)delay(2);
  147.    SCLK=0;
  148.     if(is_init)delay(200);
  149.    if(!is_init)delay(2);
  150.     dat_4=DATEOUT;

  151.      SCLK=1;
  152.    if(is_init)delay(200);
  153.     if(!is_init)delay(2);
  154.    SCLK=0;
  155.     if(is_init)delay(200);
  156.      if(!is_init)delay(2);
  157.     dat_3=DATEOUT;

  158.     SCLK=1;
  159.    if(is_init)delay(200);
  160.        if(!is_init)delay(2);
  161.    SCLK=0;
  162.     if(is_init)delay(200);
  163.        if(!is_init)delay(2);
  164.     dat_2=DATEOUT;

  165.      SCLK=1;
  166.    if(is_init)delay(200);
  167.         if(!is_init)delay(2);
  168.    SCLK=0;
  169.     if(is_init)delay(200);
  170.        if(!is_init)delay(2);
  171.     dat_1=DATEOUT;


  172.      SCLK=1;
  173.    if(is_init)delay(200);
  174.          if(!is_init)delay(2);
  175.    SCLK=0;
  176.     if(is_init)delay(200);
  177.           if(!is_init)delay(2);
  178.     dat_0=DATEOUT;


  179.    return (dat);

  180. }

  181. void restsd()//复位SD卡
  182. {  uchar i;
  183. uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
  184. is_init=1;

  185. CS=1;
  186. for(i=0;i<15;i++)
  187. {
  188.        //120时钟
  189.    write(0xff);
  190. }


  191.   
  192.   
  193.       CS=1;
  194.    write(0xff);//据说是提高兼容性
  195.    CS=0;//片选开

  196.    write( pcmd[0]);
  197.    write( pcmd[1]);
  198.    write( pcmd[2]);
  199.    write( pcmd[3]);
  200.    write( pcmd[4]);
  201.    write( pcmd[5]);

  202.    fhz=read();
  203. for(;;)
  204. {
  205.    fhz=read();
  206.    if(fhz==0x01)break;


  207. }

  208.   
  209.   CS=1;
  210.   write(0xff);

  211. }




  212. void initsd()//初始化
  213. {
  214. //
  215.    uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
  216. //

  217.       CS=1;
  218.    write(0xff);//据说是提高兼容性
  219.    CS=0;//片选开

  220.    write( pcmd[0]);
  221.    write( pcmd[1]);
  222.    write( pcmd[2]);
  223.    write( pcmd[3]);
  224.    write( pcmd[4]);
  225.    write( pcmd[5]);

  226.   
  227.    fhz=read();
  228. for(;;)
  229. {
  230.    fhz=read();
  231.    if(fhz==0x00)break;


  232. }

  233.   
  234.   CS=1;
  235.   write(0xff);








  236. }

  237. void readsd(unsigned long addstart)//读SD卡物理扇区
  238.    
  239. {  unsigned long sdbuff1,sdbuff2,sdbuff3,sdbuff4;  
  240.    uint j,n;
  241. uchar zh1,zh2,zh3,zh4;
  242.   sdbuff1=addstart;
  243.   sdbuff2=addstart;
  244.   sdbuff3=addstart;
  245.   sdbuff4=addstart;

  246.      zh1=(sdbuff1>>24)&0x000000ff;
  247.     zh2=(sdbuff2>>16)&0x000000ff;
  248.       zh3=(sdbuff3>>8)&0x000000ff;
  249.      zh4=sdbuff4&0x000000ff;
  250.    // uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原来这里是高地址字节在前地地址在后啊201012月14日逻辑扇区在253*512=0X0001fa00



  251.    CS=1;
  252.    write(0xff);//据说是提高兼容性
  253.    CS=0;//片选开

  254.    write( 0x51);
  255.    write( zh1);
  256.    write( zh2);
  257.    write( zh3);
  258.    write( zh4);
  259.    write( 0xff);
  260.    DATEOUT=1;
  261.   
  262. for(;;)
  263. {
  264.    fhz=read();
  265.    if(fhz==0x00)break;


  266. }
  267. DATEOUT=1;

  268.    for(;;)
  269. {
  270.    fhz=read();
  271.    if(fhz==0xfe)break;


  272. }

  273.   DATEOUT=1;
  274. n=0;
  275. for(j=512;j;j--)
  276. {  
  277.    tab[n]=read();
  278.     n++;

  279. }
  280. fhz=read();
  281. fhz=read();
  282. CS=1;
  283. write(0xff);








  284. }


  285. ////***************************************以上是SD主程序


  286. ///*************************************以下是MP3模块的程序

  287. void delay1ms(uint j)//延时100us
  288. {unsigned char i;

  289.    for(i=j;i;i--)
  290.    {
  291.    
  292.       


  293.   }
  294. }



  295. void spi_write_mp3(uchar h)//SPI写入一个字节,这里是最底层的数据发送!
  296. {
  297.   uchar i;

  298. SCLK=1;
  299. for(i=8;i;i--)
  300. {

  301.       SI=h&0x80;
  302.    h=h<<1;
  303.    SCK=0;
  304.    //delay1ms(1);  //这里不要加任何的延时!提高写入MP3模块的写入速度!
  305.       SCK=1;
  306.   // delay1ms(1);

  307. }






  308. }


  309. /*uchar spi_read_mp3()// SPI读取一个字节
  310. {
  311.     uchar i,read;
  312.    for(i=8;i;i--)
  313.    {
  314.     SCLK=1;
  315.        delay();
  316.        SCLK=0;
  317.     delay();
  318.        read=SO&0x80;
  319.        read=(read<<1);

  320.     }
  321.     SCLK=1;

  322.   return (read);
  323. }
  324. */
  325. void write_comd_mp3(uchar add,uint date)//写入控制命令add地址date是数据注意这里是16位的数据,内部做分开了处理
  326. {     
  327.     uchar h,l;
  328.     l=date;
  329.     h=(date>>8);

  330.         DREQ=1;
  331.        while(!DREQ); //检测MP3模块的忙状态
  332.   XCS=0;
  333.     spi_write_mp3(2); //表示写操作
  334.     spi_write_mp3(add);
  335.     spi_write_mp3(h);  //先写高8位
  336.     spi_write_mp3(l);
  337.     XCS=1;




  338. }

  339. void write_date_mp3(uchar dat)//写入音频数据信息这里还有一点是XDCS在此函数外拉低
  340. {

  341.    DREQ=1;
  342.        while(!DREQ);
  343.   spi_write_mp3(dat);



  344. }

  345. void init_mp3()  //初始化vs1003
  346. {
  347.   XRST=1;
  348.   delay1ms(100);
  349.   XRST=0;
  350.   delay1ms(100);
  351.   XRST=1;
  352.   delay1ms(100);

  353.     write_comd_mp3(0x00,0x0804);//模式设置
  354. write_comd_mp3(0x03,0x9800);//时钟控制
  355. write_comd_mp3(0x0b,0x0000);//声音控制 00是最大的!!!!!

  356. XDCS=0;//数据片选
  357. spi_write_mp3(0);
  358. spi_write_mp3(0);
  359. spi_write_mp3(0);
  360. spi_write_mp3(0);
  361. XDCS=1;


  362. }

  363. void sing(uchar fhz)//正选测试
  364. {
  365.   
  366.   
  367.    write_comd_mp3(0x00,0x0820);
  368.    DREQ=1;
  369.        while(!DREQ);
  370.     XDCS=0;
  371.     write_date_mp3(0x53);
  372.     write_date_mp3(0xef);
  373.     write_date_mp3(0x6e);//正选测试开启
  374.     write_date_mp3(fhz); //频率选择

  375.     write_date_mp3(0);
  376.     write_date_mp3(0);
  377.        write_date_mp3(0);
  378.     write_date_mp3(0);
  379.      delay1ms(60000);
  380.     write_date_mp3(0x45);   //正选关段
  381.     write_date_mp3(0x78);
  382.     write_date_mp3(0x69);
  383.     write_date_mp3(0x74);

  384.     write_date_mp3(0);
  385.     write_date_mp3(0);
  386.        write_date_mp3(0);
  387.     write_date_mp3(0);
  388.      XDCS=1;











  389. }

  390. //以上是MP3程序
  391. void main()
  392. { unsigned long numb,k;
  393. uint  i;
  394. uchar sd_mp3_buff;
  395.    while(1)
  396.    {
  397. init_mp3();//初始化MP3
  398. ////////////////
  399. is_init=1;
  400. restsd();
  401. initsd();
  402. is_init=0;//提高始终频率
  403. ///////////////




  404. sing(100);//正选测试
  405. XDCS=0;
  406.    numb=4327936;




  407. for(k=11388;k;k--)
  408. {
  409.      readsd(numb);//读物理扇区

  410.                 for(i=0;i<512;i++)  //一个扇区的数据送入MP3中
  411.                  {
  412.       
  413.    
  414.    
  415.                   sd_mp3_buff=tab[i];
  416.                  write_date_mp3( sd_mp3_buff);
  417.    
  418.    

  419.                     }

  420.      numb=(numb+512);





  421.   }
  422.    XDCS=1;





  423.     }


  424. }
复制代码




回复

使用道具 举报

ID:155785 发表于 2017-2-28 07:52 | 显示全部楼层
您好,能否分享电路,谢谢
回复

使用道具 举报

ID:171696 发表于 2017-3-19 17:20 | 显示全部楼层
请分享电路图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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