找回密码
 立即注册

QQ登录

只需一步,快速开始

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

突破340Kbps的MP3码流实现!!!

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-23 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天是个值得纪念的日子!终于实现了340Kbps码速率意味着我的MP3将和市场上买的一样了!当然在界面和其他的方面我不完善!但是音质决对的好!!!!程序一次又一次的压缩执行时间!今天用指针来替代位移操作!通过汇编码校正C语言的正确性!现在我开始庆幸当时我从汇编开始的了!要不然是看不懂得!把主循环内的函数调用全改成循序执行!把SD卡的缓冲区删除,直接在内存里调用!实现SD与解码器的无缝连接!把晶振提高到12MHZ!我的水平就这么大了,在向上,只能体改晶振了!

源代码:


  1. #include <reg52.h>
  2. #define  uchar unsigned char
  3. #define uint unsigned int
  4. uchar xdata tab[512];
  5. //******************
  6. sbit p1_7=P1^7;
  7. sbit CS=P2^0; //片选信号(低电平有效)
  8. sbit DATEIN =P2^1;//主-从数据输入
  9. sbit SCLK=P2^2;//时钟信号
  10. sbit DATEOUT=P2^3;//从-主数据输出
  11. unsigned char bdata dat;
  12. sbit dat_0=dat^0;
  13. sbit dat_1=dat^1;
  14. sbit dat_2=dat^2;
  15. sbit dat_3=dat^3;
  16. sbit dat_4=dat^4;
  17. sbit dat_5=dat^5;
  18. sbit dat_6=dat^6;
  19. sbit dat_7=dat^7;

  20. bit is_init;//决定是否延时;
  21. uchar lpp;
  22. unsigned char fhz;//返回值
  23. uchar fhz_buff; //读返回值中间量
  24. //unsigned char xdata tab[512];

  25. ///*******************以上是SD卡
  26. /*
  27. VS1003mp3模块的接口定义

  28. */
  29. sbit XRST=P1^0;//复位
  30. sbit DREQ=P1^1; //数据请求
  31. sbit XDCS=P1^2;  //数据片选
  32. sbit XCS=P1^3; //命令片选
  33. /*
  34. /* VS1003mp3SPI通信接口定义
  35. */
  36. sbit SCK=P1^4; //时钟
  37. sbit SI=P1^5; //串行输入
  38. sbit SO=P1^6;  //串行输出
  39. //*******************************
  40. void delay(uint time)
  41. {  while(time)
  42.   time--;
  43. }
  44. //***************************
  45. unsigned char bdata datmp3;
  46. sbit datmp3_0=datmp3^0;
  47. sbit datmp3_1=datmp3^1;
  48. sbit datmp3_2=datmp3^2;
  49. sbit datmp3_3=datmp3^3;
  50. sbit datmp3_4=datmp3^4;
  51. sbit datmp3_5=datmp3^5;
  52. sbit datmp3_6=datmp3^6;
  53. sbit datmp3_7=datmp3^7;




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

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

  57.    for(i=j;i;i--)
  58.    {
  59.   }
  60. }


  61. void spi_write_mp3_1(uchar h)//SPI写入一个字节,这里是最底层的数据发送!
  62. {
  63.   datmp3=h;



  64.            SI=datmp3_7;
  65.          //为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
  66.       SCK=0;   //从SD读取和MP3写数据流下手
  67.       SCK=1;
  68.    
  69.       SI=datmp3_6;
  70.    
  71.       SCK=0;
  72.       SCK=1;
  73.    

  74.       SI=datmp3_5;
  75.    
  76.       SCK=0;
  77.       SCK=1;
  78.    

  79.       SI=datmp3_4;
  80.    
  81.       SCK=0;
  82.       SCK=1;
  83.      

  84.       SI=datmp3_3;
  85.    
  86.       SCK=0;
  87.       SCK=1;
  88.      

  89.      SI=datmp3_2;
  90.    
  91.       SCK=0;
  92.       SCK=1;


  93.     SI=datmp3_1;
  94.    
  95.       SCK=0;
  96.       SCK=1;
  97.      

  98.     SI=datmp3_0;
  99.    
  100.       SCK=0;
  101.       SCK=1;
  102.      
  103.    
  104.      
  105.      
  106.       
  107.      




  108. }


  109. /*uchar spi_read_mp3()// SPI读取一个字节
  110. {
  111.     uchar i,read;
  112.    for(i=8;i;i--)
  113.    {
  114.     SCLK=1;
  115.        delay();
  116.        SCLK=0;
  117.     delay();
  118.        read=SO&0x80;
  119.        read=(read<<1);

  120.     }
  121.     SCLK=1;

  122.   return (read);
  123. }
  124. */
  125. void write_comd_mp3(uchar add,uint date)//写入控制命令add地址date是数据注意这里是16位的数据,内部做分开了处理
  126. {     
  127.     uchar h,l;
  128.     l=date;
  129.     h=(date>>8);

  130.         DREQ=1;
  131.        while(!DREQ); //检测MP3模块的忙状态
  132.   XCS=0;
  133.     spi_write_mp3_1(2); //表示写操作
  134.     spi_write_mp3_1(add);
  135.     spi_write_mp3_1(h);  //先写高8位
  136.     spi_write_mp3_1(l);
  137.     XCS=1;




  138. }

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

  141.    DREQ=1;
  142.        while(!DREQ);
  143.   datmp3=dat;


  144.            SI=datmp3_7;
  145.          //为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
  146.       SCK=0;   //从SD读取和MP3写数据流下手
  147.       SCK=1;
  148.    
  149.       SI=datmp3_6;
  150.    
  151.       SCK=0;
  152.       SCK=1;
  153.    

  154.       SI=datmp3_5;
  155.    
  156.       SCK=0;
  157.       SCK=1;
  158.    

  159.       SI=datmp3_4;
  160.    
  161.       SCK=0;
  162.       SCK=1;
  163.      

  164.       SI=datmp3_3;
  165.    
  166.       SCK=0;
  167.       SCK=1;
  168.      

  169.      SI=datmp3_2;
  170.    
  171.       SCK=0;
  172.       SCK=1;


  173.     SI=datmp3_1;
  174.    
  175.       SCK=0;
  176.       SCK=1;
  177.      

  178.     SI=datmp3_0;
  179.    
  180.       SCK=0;
  181.       SCK=1;
  182.      
  183.    
  184.      
  185.      
  186.       
  187.      




  188. }

  189. void init_mp3()  //初始化vs1003
  190. {
  191.   XRST=1;
  192.   delay1ms(100);
  193.   XRST=0;
  194.   delay1ms(100);
  195.   XRST=1;
  196.   delay1ms(100);

  197.     write_comd_mp3(0x00,0x0804);//模式设置
  198. write_comd_mp3(0x03,0x9800);//时钟控制
  199. write_comd_mp3(0x0b,15000);//声音音量控制 00是最大的!!!!!这里也是十六位的!

  200. XDCS=0;//数据片选
  201. spi_write_mp3_1(0);
  202. spi_write_mp3_1(0);
  203. spi_write_mp3_1(0);
  204. spi_write_mp3_1(0);
  205. XDCS=1;


  206. }

  207. void sing(uchar fhz)//正选测试
  208. {
  209.   
  210.   
  211.    write_comd_mp3(0x00,0x0820);
  212.    DREQ=1;
  213.        while(!DREQ);
  214.     XDCS=0;
  215.     write_date_mp3(0x53);
  216.     write_date_mp3(0xef);
  217.     write_date_mp3(0x6e);//正选测试开启
  218.     write_date_mp3(fhz); //频率选择

  219.     write_date_mp3(0);
  220.     write_date_mp3(0);
  221.        write_date_mp3(0);
  222.     write_date_mp3(0);
  223.      delay1ms(60000);
  224.     write_date_mp3(0x45);   //正选关段
  225.     write_date_mp3(0x78);
  226.     write_date_mp3(0x69);
  227.     write_date_mp3(0x74);

  228.     write_date_mp3(0);
  229.     write_date_mp3(0);
  230.        write_date_mp3(0);
  231.     write_date_mp3(0);
  232.      XDCS=1;











  233. }

  234. //以上是MP3程序
  235. //*//**********************************************



  236. /*读sd卡子程序,无返回值,有参函数,参数为要写入DATEIN数据线的字节*/
  237. void write(unsigned char wr_)// 写入一个字节SD卡
  238. {
  239.            dat=wr_;
  240.         DATEIN=dat_7;
  241.    
  242.       SCLK=0;
  243.    if(is_init)delay(200);
  244.     //if(!is_init)delay(1);
  245.       SCLK=1;
  246.       if(is_init) delay(200);
  247.       // if(!is_init)delay(1);
  248.   
  249.       DATEIN=dat_6;
  250.    
  251.       SCLK=0;
  252.      //if(!is_init)delay(1);
  253.     if(is_init)delay(200);
  254.       SCLK=1;
  255.       if(is_init) delay(200);
  256.     // if(!is_init)delay(1);

  257.       DATEIN=dat_5;
  258.    
  259.       SCLK=0;
  260.     if(is_init)delay(200);
  261.     // if(!is_init)delay(1);
  262.       SCLK=1;
  263.       if(is_init) delay(200);
  264.     //if(!is_init)delay(1);

  265.       DATEIN=dat_4;
  266.    
  267.       SCLK=0;
  268.     if(is_init)delay(200);
  269.      // if(!is_init)delay(1);
  270.       SCLK=1;
  271.       if(is_init) delay(200);
  272.     // if(!is_init)delay(1);

  273.      DATEIN=dat_3;
  274.    
  275.       SCLK=0;
  276.     if(is_init)delay(200);
  277.       //if(!is_init)delay(1);
  278.       SCLK=1;
  279.       if(is_init) delay(200);
  280.    // if(!is_init)delay(1);

  281.      DATEIN=dat_2;
  282.    
  283.       SCLK=0;
  284.     if(is_init)delay(200);
  285.      // if(!is_init)delay(1);
  286.       SCLK=1;
  287.       if(is_init) delay(200);
  288.      // if(!is_init)delay(1);

  289.     DATEIN=dat_1;
  290.    
  291.       SCLK=0;
  292.     if(is_init)delay(200);
  293.     // if(!is_init)delay(1);
  294.       SCLK=1;
  295.       if(is_init) delay(200);
  296.     // if(!is_init)delay(1);

  297.     DATEIN=dat_0;
  298.    
  299.       SCLK=0;
  300.     if(is_init)delay(200);
  301.       //if(!is_init)delay(1);
  302.       SCLK=1;
  303.       if(is_init) delay(200);
  304.      //if(!is_init)delay(1);
  305. }
  306. unsigned char read()// 读取一个字节SD卡
  307. {
  308.           DATEOUT=1;
  309.          SCLK=1;
  310.    if(is_init)delay(200);
  311.      //if(!is_init)delay(1);
  312.    SCLK=0;
  313.     if(is_init)delay(200);
  314.    //if(!is_init)delay(1);
  315.     dat_7=DATEOUT;

  316.      SCLK=1;
  317.    if(is_init)delay(200);
  318.    //if(!is_init)delay(1);
  319.    SCLK=0;
  320.     if(is_init)delay(200);
  321.      //if(!is_init)delay(1);
  322.     dat_6=DATEOUT;

  323.     SCLK=1;
  324.    if(is_init)delay(200);
  325.    // if(!is_init)delay(1);
  326.    SCLK=0;
  327.     if(is_init)delay(200);
  328.    // if(!is_init)delay(1);
  329.     dat_5=DATEOUT;

  330.     SCLK=1;
  331.    if(is_init)delay(200);
  332.     // if(!is_init)delay(1);
  333.    SCLK=0;
  334.     if(is_init)delay(200);
  335.   // if(!is_init)delay(1);
  336.     dat_4=DATEOUT;

  337.      SCLK=1;
  338.    if(is_init)delay(200);
  339.    // if(!is_init)delay(1);
  340.    SCLK=0;
  341.     if(is_init)delay(200);
  342.     // if(!is_init)delay(1);
  343.     dat_3=DATEOUT;

  344.     SCLK=1;
  345.    if(is_init)delay(200);
  346.       // if(!is_init)delay(1);
  347.    SCLK=0;
  348.     if(is_init)delay(200);
  349.       // if(!is_init)delay(1);
  350.     dat_2=DATEOUT;

  351.      SCLK=1;
  352.    if(is_init)delay(200);
  353.        // if(!is_init)delay(1);
  354.    SCLK=0;
  355.     if(is_init)delay(200);
  356.      //  if(!is_init)delay(1);
  357.     dat_1=DATEOUT;


  358.      SCLK=1;
  359.    if(is_init)delay(200);
  360.         // if(!is_init)delay(1);
  361.    SCLK=0;
  362.     if(is_init)delay(200);
  363.          // if(!is_init)delay(1);
  364.     dat_0=DATEOUT;


  365.    return (dat);

  366. }
  367. //****************************
  368. void write1(unsigned char wr_)// 写入一个字节SD卡
  369. {
  370.            dat=wr_;
  371.         DATEIN=dat_7;
  372.    
  373.       SCLK=0;
  374.   
  375.   
  376.       SCLK=1;
  377.    
  378.    
  379.   
  380.       DATEIN=dat_6;
  381.    
  382.       SCLK=0;
  383.    
  384.    
  385.       SCLK=1;
  386.    
  387.    

  388.       DATEIN=dat_5;
  389.    
  390.       SCLK=0;
  391.    
  392.       SCLK=1;
  393.    
  394.   

  395.       DATEIN=dat_4;
  396.    
  397.       SCLK=0;
  398.    
  399.   
  400.       SCLK=1;
  401.    
  402.   

  403.      DATEIN=dat_3;
  404.    
  405.       SCLK=0;
  406.   
  407.       SCLK=1;
  408.   


  409.      DATEIN=dat_2;
  410.    
  411.       SCLK=0;
  412.    
  413.   
  414.       SCLK=1;
  415.   
  416.    

  417.     DATEIN=dat_1;
  418.    
  419.       SCLK=0;
  420.   
  421.       SCLK=1;
  422.   

  423.     DATEIN=dat_0;
  424.    
  425.       SCLK=0;
  426.    
  427.       SCLK=1;
  428.    
  429.   
  430. }
  431. unsigned char read1()// 读取一个字节SD卡
  432. {
  433.           DATEOUT=1;
  434.          SCLK=1;
  435.      //if(!is_init)delay(1);
  436.    SCLK=0;
  437.    //if(!is_init)delay(1);
  438.     dat_7=DATEOUT;

  439.      SCLK=1;

  440.    //if(!is_init)delay(1);
  441.    SCLK=0;

  442.      //if(!is_init)delay(1);
  443.     dat_6=DATEOUT;

  444.     SCLK=1;

  445.    // if(!is_init)delay(1);
  446.    SCLK=0;

  447.    // if(!is_init)delay(1);
  448.     dat_5=DATEOUT;

  449.     SCLK=1;

  450.     // if(!is_init)delay(1);
  451.    SCLK=0;

  452.   // if(!is_init)delay(1);
  453.     dat_4=DATEOUT;

  454.      SCLK=1;

  455.    // if(!is_init)delay(1);
  456.    SCLK=0;

  457.     // if(!is_init)delay(1);
  458.     dat_3=DATEOUT;

  459.     SCLK=1;

  460.       // if(!is_init)delay(1);
  461.    SCLK=0;
  462.   
  463.       // if(!is_init)delay(1);
  464.     dat_2=DATEOUT;

  465.      SCLK=1;

  466.        // if(!is_init)delay(1);
  467.    SCLK=0;
  468.   
  469.      //  if(!is_init)delay(1);
  470.     dat_1=DATEOUT;


  471.      SCLK=1;

  472.         // if(!is_init)delay(1);
  473.    SCLK=0;

  474.          // if(!is_init)delay(1);
  475.     dat_0=DATEOUT;


  476.    return (dat);

  477. }
  478. //******************************8

  479. void restsd()//复位SD卡
  480. {  uchar i;
  481. uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
  482. is_init=1;

  483. CS=1;
  484. for(i=0;i<15;i++)
  485. {
  486.        //120时钟
  487.    write(0xff);
  488. }


  489.   
  490.   
  491.       CS=1;
  492.    write(0xff);//据说是提高兼容性
  493.    CS=0;//片选开

  494.    write( pcmd[0]);
  495.    write( pcmd[1]);
  496.    write( pcmd[2]);
  497.    write( pcmd[3]);
  498.    write( pcmd[4]);
  499.    write( pcmd[5]);

  500.    fhz=read();
  501. for(;;)
  502. {
  503.    fhz=read();
  504.    if(fhz==0x01)break;


  505. }

  506.   
  507.   CS=1;
  508.   write(0xff);

  509. }




  510. void initsd()//初始化SD
  511. {
  512. //
  513.    uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
  514. //

  515.       CS=1;
  516.    write(0xff);//据说是提高兼容性
  517.    CS=0;//片选开

  518.    write( pcmd[0]);
  519.    write( pcmd[1]);
  520.    write( pcmd[2]);
  521.    write( pcmd[3]);
  522.    write( pcmd[4]);
  523.    write( pcmd[5]);

  524.   
  525.    fhz=read();
  526. for(;;)
  527. {
  528.    fhz=read();
  529.    if(fhz==0x00)break;


  530. }

  531.   
  532.   CS=1;
  533.   write(0xff);








  534. }
  535. void readsd(unsigned long addstart)//读SD卡物理一扇区的值送TAB表中
  536.    
  537. {   
  538.      uint k,n;
  539.      uchar zh2,zh3,zh4;
  540.      uchar *p;
  541.             



  542.                          p=&addstart; //取出存放Numb的地址的最高位!详细请看汇编!!
  543.        p++;  //由于最高位不用所以这里舍去小于2G
  544.        zh2=*p;//从高到底的地第二字节  、、
  545.        p++;
  546.        zh3=*p; //从高到底的地第三字节
  547.         p++;
  548.        zh4=*p; //从高到底的地第四字节
  549.                    //readsd(numb);//读物理扇区
  550.         //**************
  551.    CS=0;//片选开

  552.    write1( 0x51);
  553.    write1( 0x00);//这里是2G以下可以为00
  554.    write1( zh2);
  555.    write1( zh3);
  556.    write1( zh4);
  557.    write1( 0xff);
  558.    DATEOUT=1;
  559.   
  560. for(;;)
  561. {
  562.    fhz=read1();
  563.    if(fhz==0x00)break;


  564. }
  565. DATEOUT=1;

  566.    for(;;)
  567. {
  568.    fhz=read1();
  569.    if(fhz==0xfe)break;


  570. }

  571.   DATEOUT=1;
  572. n=0;
  573. for(k=512;k;k--)
  574. {  
  575.   tab[n]=read1();
  576.    n++;

  577. }
  578. fhz=read1();
  579. fhz=read1();
  580. CS=1;
  581. write1(0xff);








  582. }
  583. void readsd_mp3(unsigned long numbs) //读一扇区的数据送MP3解码!!!
  584. {
  585.      uchar *p;
  586.      uchar zh2,zh3,zh4;
  587.                  uint  j;

  588.      

  589.                          p=&numbs; //取出存放Numb的地址的最高位!详细请看汇编!!
  590.        p++;  //由于最高位不用所以这里舍去小于2G
  591.        zh2=*p;//从高到底的地第二字节  、、
  592.        p++;
  593.        zh3=*p; //从高到底的地第三字节
  594.         p++;
  595.        zh4=*p; //从高到底的地第四字节
  596.                    //readsd(numb);//读物理扇区
  597.         //**************
  598.    
  599.            XDCS=0;
  600.                     CS=0;//片选开
  601.              dat=0x51;
  602.         DATEIN=dat_7;
  603.    
  604.       SCLK=0;
  605.   
  606.   
  607.       SCLK=1;
  608.    
  609.    
  610.   
  611.       DATEIN=dat_6;
  612.    
  613.       SCLK=0;
  614.    
  615.    
  616.       SCLK=1;
  617.    
  618.    

  619.       DATEIN=dat_5;
  620.    
  621.       SCLK=0;
  622.    
  623.       SCLK=1;
  624.    
  625.   

  626.       DATEIN=dat_4;
  627.    
  628.       SCLK=0;
  629.    
  630.   
  631.       SCLK=1;
  632.    
  633.   

  634.      DATEIN=dat_3;
  635.    
  636.       SCLK=0;
  637.   
  638.       SCLK=1;
  639.   


  640.      DATEIN=dat_2;
  641.    
  642.       SCLK=0;
  643.    
  644.   
  645.       SCLK=1;
  646.   
  647.    

  648.     DATEIN=dat_1;
  649.    
  650.       SCLK=0;
  651.   
  652.       SCLK=1;
  653.   

  654.     DATEIN=dat_0;
  655.    
  656.       SCLK=0;
  657.    
  658.       SCLK=1;       //fhz=read1(); 以上是写SD卡
  659.    //write1( 0x00);//这里是2G以下可以为00   //fhz=read1(); 以下是写SD卡
  660.   dat=0x00;
  661.         DATEIN=dat_7;
  662.    
  663.       SCLK=0;
  664.   
  665.   
  666.       SCLK=1;
  667.    
  668.    
  669.   
  670.       DATEIN=dat_6;
  671.    
  672.       SCLK=0;
  673.    
  674.    
  675.       SCLK=1;
  676.    
  677.    

  678.       DATEIN=dat_5;
  679.    
  680.       SCLK=0;
  681.    
  682.       SCLK=1;
  683.    
  684.   

  685.       DATEIN=dat_4;
  686.    
  687.       SCLK=0;
  688.    
  689.   
  690.       SCLK=1;
  691.    
  692.   

  693.      DATEIN=dat_3;
  694.    
  695.       SCLK=0;
  696.   
  697.       SCLK=1;
  698.   


  699.      DATEIN=dat_2;
  700.    
  701.       SCLK=0;
  702.    
  703.   
  704.       SCLK=1;
  705.   
  706.    

  707.     DATEIN=dat_1;
  708.    
  709.       SCLK=0;
  710.   
  711.       SCLK=1;
  712.   

  713.     DATEIN=dat_0;
  714.    
  715.       SCLK=0;
  716.    
  717.       SCLK=1;     //fhz=read1(); 以上是写SD卡
  718.    //write1( zh2);    //fhz=read1(); 以下是写SD卡
  719.     dat=zh2;
  720.         DATEIN=dat_7;
  721.    
  722.       SCLK=0;
  723.   
  724.   
  725.       SCLK=1;
  726.    
  727.    
  728.   
  729.       DATEIN=dat_6;
  730.    
  731.       SCLK=0;
  732.    
  733.    
  734.       SCLK=1;
  735.    
  736.    

  737.       DATEIN=dat_5;
  738.    
  739.       SCLK=0;
  740.    
  741.       SCLK=1;
  742.    
  743.   

  744.       DATEIN=dat_4;
  745.    
  746.       SCLK=0;
  747.    
  748.   
  749.       SCLK=1;
  750.    
  751.   

  752.      DATEIN=dat_3;
  753.    
  754.       SCLK=0;
  755.   
  756.       SCLK=1;
  757.   


  758.      DATEIN=dat_2;
  759.    
  760.       SCLK=0;
  761.    
  762.   
  763.       SCLK=1;
  764.   
  765.    

  766.     DATEIN=dat_1;
  767.    
  768.       SCLK=0;
  769.   
  770.       SCLK=1;
  771.   

  772.     DATEIN=dat_0;
  773.    
  774.       SCLK=0;
  775.    
  776.       SCLK=1;   //fhz=read1(); 以上是写SD卡
  777.   // write1( zh3);    //fhz=read1(); 以下是写SD卡
  778.   dat=zh3;
  779.         DATEIN=dat_7;
  780.    
  781.       SCLK=0;
  782.   
  783.   
  784.       SCLK=1;
  785.    
  786.    
  787.   
  788.       DATEIN=dat_6;
  789.    
  790.       SCLK=0;
  791.    
  792.    
  793.       SCLK=1;
  794.    
  795.    

  796.       DATEIN=dat_5;
  797.    
  798.       SCLK=0;
  799.    
  800.       SCLK=1;
  801.    
  802.   

  803.       DATEIN=dat_4;
  804.    
  805.       SCLK=0;
  806.    
  807.   
  808.       SCLK=1;
  809.    
  810.   

  811.      DATEIN=dat_3;
  812.    
  813.       SCLK=0;
  814.   
  815.       SCLK=1;
  816.   


  817.      DATEIN=dat_2;
  818.    
  819.       SCLK=0;
  820.    
  821.   
  822.       SCLK=1;
  823.   
  824.    

  825.     DATEIN=dat_1;
  826.    
  827.       SCLK=0;
  828.   
  829.       SCLK=1;
  830.   

  831.     DATEIN=dat_0;
  832.    
  833.       SCLK=0;
  834.    
  835.       SCLK=1;     //fhz=read1(); 以上是写SD卡
  836.    //write1( zh4);    //fhz=read1(); 以下是写SD卡
  837.    dat=zh4;
  838.         DATEIN=dat_7;
  839.    
  840.       SCLK=0;
  841.   
  842.   
  843.       SCLK=1;
  844.    
  845.    
  846.   
  847.       DATEIN=dat_6;
  848.    
  849.       SCLK=0;
  850.    
  851.    
  852.       SCLK=1;
  853.    
  854.    

  855.       DATEIN=dat_5;
  856.    
  857.       SCLK=0;
  858.    
  859.       SCLK=1;
  860.    
  861.   

  862.       DATEIN=dat_4;
  863.    
  864.       SCLK=0;
  865.    
  866.   
  867.       SCLK=1;
  868.    
  869.   

  870.      DATEIN=dat_3;
  871.    
  872.       SCLK=0;
  873.   
  874.       SCLK=1;
  875.   


  876.      DATEIN=dat_2;
  877.    
  878.       SCLK=0;
  879.    
  880.   
  881.       SCLK=1;
  882.   
  883.    

  884.     DATEIN=dat_1;
  885.    
  886.       SCLK=0;
  887.   
  888.       SCLK=1;
  889.   

  890.     DATEIN=dat_0;
  891.    
  892.       SCLK=0;
  893.    
  894.       SCLK=1;    //fhz=read1(); 以上是写SD卡
  895.   // write1( 0xff);    //fhz=read1(); 以下是写SD卡
  896.   dat=0xff;
  897.         DATEIN=dat_7;
  898.    
  899.       SCLK=0;
  900.   
  901.   
  902.       SCLK=1;
  903.    
  904.    
  905.   
  906.       DATEIN=dat_6;
  907.    
  908.       SCLK=0;
  909.    
  910.    
  911.       SCLK=1;
  912.    
  913.    

  914.       DATEIN=dat_5;
  915.    
  916.       SCLK=0;
  917.    
  918.       SCLK=1;
  919.    
  920.   

  921.       DATEIN=dat_4;
  922.    
  923.       SCLK=0;
  924.    
  925.   
  926.       SCLK=1;
  927.    
  928.   

  929.      DATEIN=dat_3;
  930.    
  931.       SCLK=0;
  932.   
  933.       SCLK=1;
  934.   


  935.      DATEIN=dat_2;
  936.    
  937.       SCLK=0;
  938.    
  939.   
  940.       SCLK=1;
  941.   
  942.    

  943.     DATEIN=dat_1;
  944.    
  945.       SCLK=0;
  946.   
  947.       SCLK=1;
  948.   

  949.     DATEIN=dat_0;
  950.    
  951.       SCLK=0;
  952.    
  953.       SCLK=1;
  954.    DATEOUT=1;     // 以上是写SD卡
  955.   
  956. for(;;)
  957. {
  958.         //fhz=read1(); 以下是读SD卡
  959.    DATEOUT=1;
  960.          SCLK=1;
  961.      //if(!is_init)delay(1);
  962.    SCLK=0;
  963.    //if(!is_init)delay(1);
  964.     dat_7=DATEOUT;

  965.      SCLK=1;

  966.    //if(!is_init)delay(1);
  967.    SCLK=0;

  968.      //if(!is_init)delay(1);
  969.     dat_6=DATEOUT;

  970.     SCLK=1;

  971.    // if(!is_init)delay(1);
  972.    SCLK=0;

  973.    // if(!is_init)delay(1);
  974.     dat_5=DATEOUT;

  975.     SCLK=1;

  976.     // if(!is_init)delay(1);
  977.    SCLK=0;

  978.   // if(!is_init)delay(1);
  979.     dat_4=DATEOUT;

  980.      SCLK=1;

  981.    // if(!is_init)delay(1);
  982.    SCLK=0;

  983.     // if(!is_init)delay(1);
  984.     dat_3=DATEOUT;

  985.     SCLK=1;

  986.       // if(!is_init)delay(1);
  987.    SCLK=0;
  988.   
  989.       // if(!is_init)delay(1);
  990.     dat_2=DATEOUT;

  991.      SCLK=1;

  992.        // if(!is_init)delay(1);
  993.    SCLK=0;
  994.   
  995.      //  if(!is_init)delay(1);
  996.     dat_1=DATEOUT;


  997.      SCLK=1;

  998.         // if(!is_init)delay(1);
  999.    SCLK=0;

  1000.          // if(!is_init)delay(1);
  1001.     dat_0=DATEOUT;

  1002.       fhz=dat;    // 以上是读SD卡

  1003.    if(fhz==0x00)break;


  1004. }
  1005. DATEOUT=1;

  1006.    for(;;)
  1007. {
  1008.   // fhz=read1();    以下是读SD卡
  1009.   DATEOUT=1;
  1010.          SCLK=1;
  1011.      //if(!is_init)delay(1);
  1012.    SCLK=0;
  1013.    //if(!is_init)delay(1);
  1014.     dat_7=DATEOUT;

  1015.      SCLK=1;

  1016.    //if(!is_init)delay(1);
  1017.    SCLK=0;

  1018.      //if(!is_init)delay(1);
  1019.     dat_6=DATEOUT;

  1020.     SCLK=1;

  1021.    // if(!is_init)delay(1);
  1022.    SCLK=0;

  1023.    // if(!is_init)delay(1);
  1024.     dat_5=DATEOUT;

  1025.     SCLK=1;

  1026.     // if(!is_init)delay(1);
  1027.    SCLK=0;

  1028.   // if(!is_init)delay(1);
  1029.     dat_4=DATEOUT;

  1030.      SCLK=1;

  1031.    // if(!is_init)delay(1);
  1032.    SCLK=0;

  1033.     // if(!is_init)delay(1);
  1034.     dat_3=DATEOUT;

  1035.     SCLK=1;

  1036.       // if(!is_init)delay(1);
  1037.    SCLK=0;
  1038.   
  1039.       // if(!is_init)delay(1);
  1040.     dat_2=DATEOUT;

  1041.      SCLK=1;

  1042.        // if(!is_init)delay(1);
  1043.    SCLK=0;
  1044.   
  1045.      //  if(!is_init)delay(1);
  1046.     dat_1=DATEOUT;


  1047.      SCLK=1;

  1048.         // if(!is_init)delay(1);
  1049.    SCLK=0;

  1050.          // if(!is_init)delay(1);
  1051.     dat_0=DATEOUT;

  1052.       fhz=dat;    //fhz=read1(); 以上是读SD卡
  1053.    if(fhz==0xfe)break;


  1054. }

  1055.   DATEOUT=1;
  1056. // n=0;     
  1057. for(j=512;j;j--)
  1058. {  
  1059.         DATEOUT=1;     //fhz=read1(); 以下是读SD卡
  1060.          SCLK=1;
  1061.      //if(!is_init)delay(1);
  1062.    SCLK=0;
  1063.    //if(!is_init)delay(1);
  1064.     dat_7=DATEOUT;

  1065.      SCLK=1;

  1066.    //if(!is_init)delay(1);
  1067.    SCLK=0;

  1068.      //if(!is_init)delay(1);
  1069.     dat_6=DATEOUT;

  1070.     SCLK=1;

  1071.    // if(!is_init)delay(1);
  1072.    SCLK=0;

  1073.    // if(!is_init)delay(1);
  1074.     dat_5=DATEOUT;

  1075.     SCLK=1;

  1076.     // if(!is_init)delay(1);
  1077.    SCLK=0;

  1078.   // if(!is_init)delay(1);
  1079.     dat_4=DATEOUT;

  1080.      SCLK=1;

  1081.    // if(!is_init)delay(1);
  1082.    SCLK=0;

  1083.     // if(!is_init)delay(1);
  1084.     dat_3=DATEOUT;

  1085.     SCLK=1;

  1086.       // if(!is_init)delay(1);
  1087.    SCLK=0;
  1088.   
  1089.       // if(!is_init)delay(1);
  1090.     dat_2=DATEOUT;

  1091.      SCLK=1;

  1092.        // if(!is_init)delay(1);
  1093.    SCLK=0;
  1094.   
  1095.      //  if(!is_init)delay(1);
  1096.     dat_1=DATEOUT;


  1097.      SCLK=1;

  1098.         // if(!is_init)delay(1);
  1099.    SCLK=0;

  1100.          // if(!is_init)delay(1);      
  1101.     dat_0=DATEOUT;          //fhz=read1(); 以上是读SD卡

  1102.       datmp3=dat;    //fhz=read1(); 以下是写mp3bit流
  1103.          DREQ=1;
  1104.          while(!DREQ);



  1105.            SI=datmp3_7;
  1106.          //为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
  1107.       SCK=0;   //从SD读取和MP3写数据流下手
  1108.       SCK=1;
  1109.    
  1110.       SI=datmp3_6;
  1111.    
  1112.       SCK=0;
  1113.       SCK=1;
  1114.    

  1115.       SI=datmp3_5;
  1116.    
  1117.       SCK=0;
  1118.       SCK=1;
  1119.    

  1120.       SI=datmp3_4;
  1121.    
  1122.       SCK=0;
  1123.       SCK=1;
  1124.      

  1125.       SI=datmp3_3;
  1126.    
  1127.       SCK=0;
  1128.       SCK=1;
  1129.      

  1130.      SI=datmp3_2;
  1131.    
  1132.       SCK=0;
  1133.       SCK=1;


  1134.     SI=datmp3_1;
  1135.    
  1136.       SCK=0;
  1137.       SCK=1;
  1138.      

  1139.     SI=datmp3_0;
  1140.    
  1141.       SCK=0;
  1142.       SCK=1;
  1143.      
  1144.    
  1145.      
  1146.      
  1147.       
  1148.      




  1149.              //以上是写mp3bit流
  1150. }

  1151. //**********************以下是读CRC*****
  1152.            DATEOUT=1;
  1153.             SCLK=1;
  1154.      SCLK=0;
  1155.     dat_7=DATEOUT;

  1156.      SCLK=1;

  1157.    SCLK=0;

  1158.     dat_6=DATEOUT;

  1159.     SCLK=1;

  1160.    SCLK=0;

  1161.     dat_5=DATEOUT;

  1162.     SCLK=1;

  1163.    SCLK=0;

  1164.     dat_4=DATEOUT;

  1165.      SCLK=1;
  1166.    SCLK=0;

  1167.     dat_3=DATEOUT;

  1168.     SCLK=1;

  1169.    SCLK=0;
  1170.     dat_2=DATEOUT;

  1171.      SCLK=1;

  1172.    SCLK=0;
  1173.   
  1174.     dat_1=DATEOUT;


  1175.      SCLK=1;
  1176.    SCLK=0;
  1177.     dat_0=DATEOUT;

  1178. DATEOUT=1;
  1179.          SCLK=1;
  1180.    SCLK=0;
  1181.     dat_7=DATEOUT;

  1182.      SCLK=1;
  1183.    SCLK=0;
  1184.     dat_6=DATEOUT;
  1185.     SCLK=1;
  1186.    SCLK=0;

  1187.     dat_5=DATEOUT;
  1188.     SCLK=1;
  1189.    SCLK=0;

  1190.     dat_4=DATEOUT;
  1191.      SCLK=1;
  1192.    SCLK=0;

  1193.     dat_3=DATEOUT;
  1194.     SCLK=1;
  1195.    SCLK=0;
  1196.   

  1197.     dat_2=DATEOUT;
  1198.         SCLK=1;
  1199.      SCLK=0;
  1200.     dat_1=DATEOUT;
  1201.        SCLK=1;
  1202.     SCLK=0;
  1203.     dat_0=DATEOUT;

  1204.                 CS=1;
  1205.              dat=0xff;

  1206.         DATEIN=dat_7;
  1207.       SCLK=0;
  1208.       SCLK=1;
  1209.    
  1210.       DATEIN=dat_6;
  1211.       SCLK=0;
  1212.       SCLK=1;
  1213.    
  1214.       DATEIN=dat_5;
  1215.       SCLK=0;
  1216.       SCLK=1;
  1217.   
  1218.       DATEIN=dat_4;
  1219.       SCLK=0;
  1220.       SCLK=1;
  1221.   
  1222.       DATEIN=dat_3;
  1223.       SCLK=0;
  1224.       SCLK=1;
  1225.   
  1226.       DATEIN=dat_2;
  1227.       SCLK=0;
  1228.       SCLK=1;

  1229.       DATEIN=dat_1;
  1230.       SCLK=0;
  1231.       SCLK=1;
  1232.   
  1233.           DATEIN=dat_0;
  1234.       SCLK=0;
  1235.       SCLK=1;

  1236.    
  1237.       XDCS=1;
  1238. //**********************以上是读CRC*****          //**************
  1239. }
  1240.                         

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


  1242. /*


  1243. FAT32文件系统是用来寻找歌曲文件的手段!必须的 ////////////////////////////////////////////////////////////////////////////////////////////////////
  1244. 下面是了
  1245. */





  1246. /*****************************************************************
  1247. /*    函数名:unsigned long find_sd_type();        *
  1248. /*   作用:FAT32系统中用来寻找根目录中的MP3文件       *
  1249. /*   输入:无            *
  1250. /*   输出:返回一个长整形作为找到的MP3文件的开始地址   *
  1251. /*                 *
  1252. /*                 *
  1253. /*                 *
  1254. /*                 *
  1255. /*****************************************************************
  1256. */
  1257. unsigned long find_sd_type()
  1258.   {    uchar i,n,a,m;
  1259.    unsigned long h1,h2,h3,h4,startadd;
  1260.    readsd(4323840);//把根目录中的第一扇区数据读入tab中!!!

  1261. for(;;)
  1262. {
  1263.    n=tab[8+(16*i)];
  1264. a=tab[9+(16*i)];
  1265. m=tab[10+(16*i)];
  1266.   i++;
  1267.    if((n==0x4d)&(a==0x50)&(m==0x33)){i--;break;} //如果有mp3文件名的话退出,没有就一直找!
  1268.   }
  1269.   h1=tab[21+(16*i)];
  1270.   h2=tab[22+(16*i)];
  1271.   h3=tab[27+(16*i)];
  1272.   h4=tab[28+(16*i)];
  1273.   h1=(h1<<24);
  1274.   h2=(h2<<16);
  1275.     h3=(h3<<8);
  1276.     startadd=h1+h2+h3+h4;

  1277.    return(startadd);//返回文件的开始簇开始
  1278.   }


  1279. /*****************************************************************
  1280. /*    函数名:unsigned long find_sd_fat(unsigned long startadd1);        *
  1281. /*   作用:FAT32系统中用来查找FAT是否有下一簇的开始地址  *
  1282. /*          如有则返回,没有则退出      *
  1283. /*   输入:已经执行完的的或前一个簇地址     *
  1284. /*   输出:返回一个长整形作为找到的MP3文件的下一簇开始地址*
  1285. /*                 *
  1286. /*                 *
  1287. /*                 *
  1288. /*                 *
  1289. /*****************************************************************
  1290. */
  1291. unsigned long find_sd_fat(unsigned long startadd1)
  1292. {
  1293.      unsigned long a,b,c,d,startadd;
  1294.     uchar snumb;
  1295.     snumb=((startadd1*4)/512);//占得扇区数
  1296.     readsd(2363904+(snumb*512));//读fat表放入tab中
  1297.     a=tab[(startadd1*4)-(snumb*512)];//最低字节
  1298.     b=tab[(startadd1*4)-(snumb*512)+1];
  1299.     c=tab[(startadd1*4)-(snumb*512)+2];
  1300.      d=tab[(startadd1*4)-(snumb*512)+3];//最高字节

  1301.      d=(d<<24);
  1302.           c=(c<<16);
  1303.             b=(b<<8);
  1304.          startadd=a+b+c+d;
  1305.     if(startadd==0x0fffffff){while(1);}
  1306.     return (startadd);
  1307. }
  1308. void main() //主程序
  1309. {


  1310. unsigned long  numb,f;
  1311. uchar d;
  1312. init_mp3();//初始化MP3
  1313. ////////////////
  1314. is_init=1;
  1315. restsd();
  1316. initsd();
  1317. is_init=0;//提高始终频率
  1318. ///////////////
  1319. sing(100);//正选测试      
  1320.   while(1)
  1321.   {
  1322.      

  1323.    // numb=4327936; //从4327936物理地址开始读歌曲!


  1324.          
  1325.         numb=find_sd_type();
  1326.                      while(1)  
  1327.                         {  
  1328.       
  1329.        f=(4323840+(numb-2)*4096);
  1330.       
  1331.        for(d=4;d;d--)
  1332.            {
  1333.            readsd_mp3(f);
  1334.         delay(28000);


  1335.                                f=(f+0x200);
  1336.            }

  1337.         numb=find_sd_fat(numb);



  1338.                        }
  1339.   

  1340.         }

  1341.   



  1342. }
复制代码



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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