找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3600|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于FAT32文件系統(tǒng)上的MP3播放器!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:83710 發(fā)表于 2015-6-23 16:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  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; //片選信號(hào)(低電平有效)
  8. sbit DATEIN =P2^1;//主-從數(shù)據(jù)輸入
  9. sbit SCLK=P2^2;//時(shí)鐘信號(hào)
  10. sbit DATEOUT=P2^3;//從-主數(shù)據(jù)輸出
  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;//決定是否延時(shí);
  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;//復(fù)位
  30. sbit DREQ=P1^1; //數(shù)據(jù)請(qǐng)求
  31. sbit XDCS=P1^2;  //數(shù)據(jù)片選
  32. sbit XCS=P1^3; //命令片選
  33. /*
  34. /* VS1003mp3SPI通信接口定義
  35. */
  36. sbit SCK=P1^4; //時(shí)鐘
  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)//延時(shí)100us
  56. {unsigned char i;

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


  61. void spi_write_mp3_1(uchar h)//SPI寫(xiě)入一個(gè)字節(jié),這里是最底層的數(shù)據(jù)發(fā)送!
  62. {
  63.   datmp3=h;



  64.            SI=datmp3_7;
  65.          //為了進(jìn)一步提高速度我這里采用了順序結(jié)構(gòu)!全是斷橋殘雪惹的禍!第一次愛(ài)的人播放正常!而斷橋殘雪不行了!一定盡全力
  66.       SCK=0;   //從SD讀取和MP3寫(xiě)數(shù)據(jù)流下手
  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讀取一個(gè)字節(jié)
  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)//寫(xiě)入控制命令add地址date是數(shù)據(jù)注意這里是16位的數(shù)據(jù),內(nèi)部做分開(kāi)了處理
  126. {     
  127.     uchar h,l;
  128.     l=date;
  129.     h=(date>>8);

  130.         DREQ=1;
  131.        while(!DREQ); //檢測(cè)MP3模塊的忙狀態(tài)
  132.   XCS=0;
  133.     spi_write_mp3_1(2); //表示寫(xiě)操作
  134.     spi_write_mp3_1(add);
  135.     spi_write_mp3_1(h);  //先寫(xiě)高8位
  136.     spi_write_mp3_1(l);
  137.     XCS=1;




  138. }

  139. void write_date_mp3(uchar dat)//寫(xiě)入音頻數(shù)據(jù)信息這里還有一點(diǎn)是XDCS在此函數(shù)外拉低
  140. {

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


  144.            SI=datmp3_7;
  145.          //為了進(jìn)一步提高速度我這里采用了順序結(jié)構(gòu)!全是斷橋殘雪惹的禍!第一次愛(ài)的人播放正常!而斷橋殘雪不行了!一定盡全力
  146.       SCK=0;   //從SD讀取和MP3寫(xiě)數(shù)據(jù)流下手
  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);//模式設(shè)置
  198. write_comd_mp3(0x03,0x9800);//時(shí)鐘控制
  199. write_comd_mp3(0x0b,15000);//聲音音量控制 00是最大的。。。!這里也是十六位的!

  200. XDCS=0;//數(shù)據(jù)片選
  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)//正選測(cè)試
  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);//正選測(cè)試開(kāi)啟
  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);   //正選關(guān)段
  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卡子程序,無(wú)返回值,有參函數(shù),參數(shù)為要寫(xiě)入DATEIN數(shù)據(jù)線(xiàn)的字節(jié)*/
  237. void write(unsigned char wr_)// 寫(xiě)入一個(gè)字節(jié)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()// 讀取一個(gè)字節(jié)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_)// 寫(xiě)入一個(gè)字節(jié)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()// 讀取一個(gè)字節(jié)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()//復(fù)位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時(shí)鐘
  487.    write(0xff);
  488. }


  489.   
  490.   
  491.       CS=1;
  492.    write(0xff);//據(jù)說(shuō)是提高兼容性
  493.    CS=0;//片選開(kāi)

  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);//據(jù)說(shuō)是提高兼容性
  517.    CS=0;//片選開(kāi)

  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卡物理一扇區(qū)的值送TAB表中
  536.    
  537. {   
  538.      uint k,n;
  539.      uchar zh2,zh3,zh4;
  540.      uchar *p;
  541.             



  542.                          p=&addstart; //取出存放Numb的地址的最高位!詳細(xì)請(qǐng)看匯編!
  543.        p++;  //由于最高位不用所以這里舍去小于2G
  544.        zh2=*p;//從高到底的地第二字節(jié)  、、
  545.        p++;
  546.        zh3=*p; //從高到底的地第三字節(jié)
  547.         p++;
  548.        zh4=*p; //從高到底的地第四字節(jié)
  549.                    //readsd(numb);//讀物理扇區(qū)
  550.         //**************
  551.    CS=0;//片選開(kāi)

  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) //讀一扇區(qū)的數(shù)據(jù)送MP3解碼。!
  584. {
  585.      uchar *p;
  586.      uchar zh2,zh3,zh4;
  587.                  uint  j;

  588.      

  589.                          p=&numbs; //取出存放Numb的地址的最高位!詳細(xì)請(qǐng)看匯編。
  590.        p++;  //由于最高位不用所以這里舍去小于2G
  591.        zh2=*p;//從高到底的地第二字節(jié)  、、
  592.        p++;
  593.        zh3=*p; //從高到底的地第三字節(jié)
  594.         p++;
  595.        zh4=*p; //從高到底的地第四字節(jié)
  596.                    //readsd(numb);//讀物理扇區(qū)
  597.         //**************
  598.    
  599.            XDCS=0;
  600.                     CS=0;//片選開(kāi)
  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(); 以上是寫(xiě)SD卡
  659.    //write1( 0x00);//這里是2G以下可以為00   //fhz=read1(); 以下是寫(xiě)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(); 以上是寫(xiě)SD卡
  718.    //write1( zh2);    //fhz=read1(); 以下是寫(xiě)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(); 以上是寫(xiě)SD卡
  777.   // write1( zh3);    //fhz=read1(); 以下是寫(xiě)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(); 以上是寫(xiě)SD卡
  836.    //write1( zh4);    //fhz=read1(); 以下是寫(xiě)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(); 以上是寫(xiě)SD卡
  895.   // write1( 0xff);    //fhz=read1(); 以下是寫(xiě)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;     // 以上是寫(xiě)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(); 以下是寫(xiě)mp3bit流
  1103.          DREQ=1;
  1104.          while(!DREQ);



  1105.            SI=datmp3_7;
  1106.          //為了進(jìn)一步提高速度我這里采用了順序結(jié)構(gòu)!全是斷橋殘雪惹的禍!第一次愛(ài)的人播放正常!而斷橋殘雪不行了!一定盡全力
  1107.       SCK=0;   //從SD讀取和MP3寫(xiě)數(shù)據(jù)流下手
  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.              //以上是寫(xiě)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文件系統(tǒng)是用來(lái)尋找歌曲文件的手段!必須的 ////////////////////////////////////////////////////////////////////////////////////////////////////
  1244. 下面是了

  1245.                     名稱(chēng):FAT32  文件系統(tǒng)

  1246.      說(shuō)明:不要認(rèn)為FAT32多神秘,其實(shí)他就是"查字典"  只是每一個(gè)環(huán)節(jié)都不能錯(cuò)。!一環(huán)扣一環(huán)

  1247.      編制:王均偉

  1248.      地點(diǎn):天津市開(kāi)發(fā)區(qū)泰達(dá)地下交通空間第四項(xiàng)目部宿舍

  1249.      時(shí)間:2010年12月29日19:00完成!調(diào)試完畢!!所有歌曲完整無(wú)缺的再現(xiàn)!

  1250.      記:本文件系統(tǒng)是以簇為單位,也就是說(shuō)要讀就是一簇!不存在精確到扇區(qū)的算法!因此在切換
  1251.          歌曲時(shí)容易出現(xiàn)幾毫秒的等待或噪音!只讀 了根目錄的第一個(gè)扇區(qū),所以不能播放超過(guò)第一扇區(qū)
  1252.       存放的P3文件!也是經(jīng)一步改進(jìn)的地方!但是相對(duì)此系統(tǒng)而言,就簡(jiǎn)單了!我總結(jié)了!只要你有思路
  1253.       你有想法!那么不管是否可行根據(jù)這個(gè)想法畫(huà)出流程圖,一步一步改進(jìn)細(xì)化流程圖,然后把流程分成幾個(gè)
  1254.       功能塊!分別編寫(xiě)子函數(shù),最后連起來(lái)!調(diào)試!關(guān)鍵是調(diào)試,一編編,一個(gè)問(wèn)題要問(wèn):為什么會(huì)這樣?是什么原因
  1255.       導(dǎo)致的?一步步排查!實(shí)驗(yàn),排查!一定能找到阻礙你的那塊石頭。!


  1256. */



  1257. /*****************************************************************
  1258. /*    函數(shù)名:unsigned long find_sd_type();        *
  1259. /*   作用:FAT32系統(tǒng)中用來(lái)尋找根目錄中的MP3文件       *
  1260. /*   輸入:無(wú)            *
  1261. /*   輸出:返回一個(gè)長(zhǎng)整形作為找到的MP3文件的簇號(hào)       *
  1262. /*                 *
  1263. /*                 *
  1264. /*                 *
  1265. /*                 *
  1266. /*****************************************************************
  1267. */
  1268. unsigned long find_sd_type()
  1269.   {   

  1270.      uchar i,n,a,m,clr;
  1271.        static uchar some,next ; //定義靜態(tài)變量用來(lái)記錄當(dāng)前的歌曲是第幾首!給查根目錄程序一個(gè)基準(zhǔn)
  1272.    unsigned long h1,h2,h3,h4,startadd;

  1273. switch (some)
  1274.   {
  1275.    case 3:{some=0;i=next;break;}//第四首
  1276.    case 2:{some=3;i=next;break;}//第三首
  1277.    case 1:{some=2;i=next;break;}//第二首
  1278.    case 0:{some=1;next=0;break;}//第一首
  1279.   }
  1280. readsd(4323840);//把根目錄中的第一扇區(qū)數(shù)據(jù)讀入tab中。。
  1281.     for(;;)
  1282. {
  1283.    n=tab[8+(16*i)];//
  1284. a=tab[9+(16*i)];//
  1285. m=tab[10+(16*i)];//

  1286. clr=tab[16*i];

  1287. if((n==0x4d)&(a==0x50)&(m==0x33)&(clr!=0xe5)){break;} //如果有mp3文件擴(kuò)展名且第一個(gè)不是E5的話(huà),E5代表已經(jīng)刪除了的文件的就退出,沒(méi)有就一直找!

  1288.   i++;
  1289.      }
  1290. next=i;//這里表示i的值送next暫存,應(yīng)為你不能用i,他的值是隨時(shí)變化的;
  1291. next++; //這個(gè)表示這一首個(gè)唱完了,下一首!呵呵2010年12月29日!。19:16在開(kāi)始的SWITCH里要判斷的。。!就是這樣的
  1292.             //注意這里的i--;是必要的!應(yīng)為我在比較后
  1293.   h1=tab[20+(16*i)];         //i多加了一次,所以要減去,因?yàn)橄旅嫖乙玫模!就是這個(gè)原因!
  1294.   h2=tab[21+(16*i)];//查文件開(kāi)始簇的地址
  1295.   h3=tab[26+(16*i)];
  1296.   h4=tab[27+(16*i)];//這里得到h1-h4表示


  1297.   h2=(h2<<24);//注意這里!h2是在32為中的32-24位 開(kāi)始我在這里搞錯(cuò)了
  1298.   h1=(h1<<16);//注意這里!h1是在32為中的17-24位                       ///格式轉(zhuǎn)換!把它有逆序排列的十六進(jìn)制轉(zhuǎn)換成正常的高位在前的十六進(jìn)制。。
  1299.     h4=(h4<<8);//注意這里!h2是在32為中的8-16位                  / /上面不用轉(zhuǎn)換,文件名的排列是正確的!
  1300.     startadd=h1+h2+h3+h4;

  1301.    return(startadd);//返回文件的開(kāi)始簇開(kāi)始
  1302.   }


  1303. /*****************************************************************
  1304. /*    函數(shù)名:unsigned long find_sd_fat(unsigned long startadd1);        *
  1305. /*   作用:FAT32系統(tǒng)中用來(lái)查找FAT是否有下一簇的開(kāi)始地址  *
  1306. /*          如有則返回,沒(méi)有則退出      *
  1307. /*   輸入:已經(jīng)執(zhí)行完的的或前一個(gè)簇號(hào)     *
  1308. /*   輸出:返回一個(gè)長(zhǎng)整形作為找到的MP3文件的下一簇開(kāi)始地址*
  1309. /*                 *
  1310. /*                 *
  1311. /*                 *
  1312. /*                 *
  1313. /*****************************************************************
  1314. */
  1315. unsigned long find_sd_fat(unsigned long startadd1)
  1316. {
  1317.      unsigned long a,b,c,d,startadd;
  1318.     uchar snumb;
  1319.     snumb=((startadd1*4)/512);//占得扇區(qū)數(shù)
  1320.     readsd(2363904+(snumb*512));//讀fat表放入tab中
  1321.     a=tab[(startadd1*4)-(snumb*512)];//最低字節(jié)
  1322.     b=tab[(startadd1*4)-(snumb*512)+1];
  1323.     c=tab[(startadd1*4)-(snumb*512)+2];
  1324.      d=tab[(startadd1*4)-(snumb*512)+3];//最高字節(jié)

  1325.      d=(d<<24);
  1326.           c=(c<<16);
  1327.             b=(b<<8);
  1328.          startadd=a+b+c+d;   
  1329.     return (startadd);
  1330. }
  1331. void main() //主程序
  1332. {


  1333. unsigned long  numb,f,st;//numb是簇號(hào),f是物理地址,st 中間變量
  1334. init_mp3();//初始化MP3
  1335. ////////////////
  1336. is_init=1;
  1337. restsd(); //復(fù)位SD卡
  1338. initsd(); //初始化SD卡
  1339. is_init=0;//提高始終頻率
  1340. ///////////////
  1341. sing(100);//正選測(cè)試      
  1342.                   while(1)//主循環(huán)
  1343.                    {
  1344.      

  1345.                  // numb=4327936; //從4327936物理地址開(kāi)始讀歌曲!


  1346.          
  1347.     loop:  numb=find_sd_type();//計(jì)算mp3文件的開(kāi)始簇,返回計(jì)算出的文件開(kāi)始簇號(hào)!

  1348.                      while(1)  
  1349.                         {  
  1350.       
  1351.      f=(4323840+(numb-2)*4096);//  將計(jì)算歌曲的開(kāi)始簇地址轉(zhuǎn)化成SD卡的物理地址
  1352.         st=f;//中間量ST保證一個(gè)個(gè)基準(zhǔn)量,F(xiàn)則不行!因?yàn)镕要加0X200時(shí)刻變化的!!而ST則是不變的!
  1353.        for(;;)      //讀出一簇?cái)?shù)據(jù)送往MP3;
  1354.            {
  1355.            readsd_mp3(f);//給他地址他就播放。!當(dāng)然是物理SD地址
  1356.       
  1357.                               f=(f+0x200);//因?yàn)槭且淮厮砸x扇區(qū)后腰加一扇區(qū)的地址更新

  1358.          if(f==(st+4096))break; //如果是一簇播放完畢!那么要退出!尋找下一簇!怎么找?FAT表   
  1359.            }
  1360.       
  1361.          numb=find_sd_fat(numb);  //查FAT表!找到下一簇!
  1362.       if(numb==0x0fffffff)//文件播放完畢?完畢就轉(zhuǎn)到下一首,沒(méi)完繼續(xù)查fat表
  1363.        {goto loop;
  1364.       
  1365.       
  1366.        }// 是否播放完畢?檢測(cè)到0X0FFFFFFF表示播放完畢!如果完畢則轉(zhuǎn)到loop執(zhí)行


  1367.                        }         
  1368.   

  1369.         }

  1370.   



  1371. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:171696 發(fā)表于 2017-3-18 15:16 | 只看該作者
雖然編譯出了點(diǎn)問(wèn)題哦,但謝謝樓主
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表