久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11935|回復: 30
收起左側

51單片機MP3制作總結 TFT9325彩屏 含程序

  [復制鏈接]
ID:83710 發表于 2015-6-23 16:34 | 顯示全部樓層 |閱讀模式
本帖最后由 hongniu 于 2015-6-23 16:50 編輯

MP3在之前對我來說是一個很深奧,很高級的東西!感性的認識就是前年買的那個MP3。說起MP3不得不說LCD12864,他起得頭,自從做完12864顯示后,我目標瞄向了彩屏!黑白屏有啥意思!彩色的才好來!于是又做TFT9325彩屏!在做彩屏之前做了一件非常非常重要的事!因為彩屏不同于12864,12864顯示一整屏才要1024個字節,而彩屏2.4寸則要他的150倍!這么大的數據量你放哪?是個問題吧!這個東西必須要常見,必須要小,必須要容量大!他是什么呢?--沒錯,就是日常生活中的手機里的那張所謂的內存卡(人家叫TF卡)!第一他常見,第二他小,第三容量大,基本上是1個G的!那個卡只有指甲蓋大小!很方便,所有條件滿足!就是他了!開始看關于TF卡的資料,首先是文件系統!實話當時我頭都大了!啥叫文件系統?什么原理?存儲機制是什么?有哪些操作?答案沒有現成的!但是資料告訴我們只要堅持一定會找到!慢慢的磨啊磨啊!開始知道我要學的文件系統沒名字叫FAT32文件系統!開始了解內部邏輯扇區和MBR,BPB,根目錄,FAT表,數據鏈,簇,扇區,通信機制,數據讀寫,命令/指令,可是光有這些還是不行,要試驗,要調試,失敗,失敗,失敗,連著一個星期的失敗換來了成功,知道有一天,我記得特別清楚我從TF卡中讀到了55AA,那代表了扇區的結束標志,可是期待的EB(邏輯0扇區標志)沒有出現,又一次失落了,懷疑,我讀錯了?還是......。不懂了,第二天我做了個通信,把數據一次性的送往計算機,到數據送出的那一刻,我激動了,我明白了,原來我讀出的并不是邏輯0扇區,而是物理0扇區,以前的思想多磨可笑啊!再次基礎上我成功的讀出邏輯0扇區!跟實際的一摸一樣,這意味這我可以對TF卡的在地址范圍內的任意一個地址扇區進行讀取!TF卡的底層已經對我打開了!這時我放下TF卡,專攻彩屏液晶顯示器!又是失敗,失敗,失敗,失敗,兩個星期后我終于可以在彩屏的任意點顯示任意顏色!接下來是把TF卡和液晶連起來!把JPG的320240的圖像轉換成BMP的16位圖像,轉成BIN,存到TF卡中,找到數據地址,吧數據地址送到液晶,液晶取出數據以掃描方式顯示在屏幕上!讀完正好掃描完成!正好是一幅完整的圖像!當然速度是很慢的!因為CPU實在是不敢恭維啊!但是他做到了!接下來搞啥呢?-----MP3!數據的存儲還用TF卡,就憑我的程序水平肯定編不出MP3解碼算法的,所以我決定使用專用的DSP解碼器,那我要做的是把數據給他!然后讓他解碼!DA后在耳機里聽到音樂!思路是有了!寫程序,修改,實驗,失敗,我目標很明確,任何器件都一樣,首先保證硬件是正確的,下一步是底層的驅動是成功的!因為解碼器用的通信使SPI,很容易實現,一下午的功夫,搞定了!然后把數據送往MP3解碼器,此時在耳機里聽到悅耳的音樂!我真的很高興!因為這是有史以從未搞過的!接下來的幾天我開始遇到麻煩了!播放老是得我去計算歌曲的地址,然后告訴他,太麻煩,離顯示的MP3還太遙遠,于是開始著手改進,當我開始的時候問題來了,MP3的碼率不夠,導致有的比特流高的歌曲不能播放!又改程序,簡化代碼,提高速度,這里說一點,指針我頭一次用,效率果然不同一般!賊快!碼率解決了,怎樣讓他自己自動的找歌!而不用我人為地計算呢?-----呵呵-----文件系統!---我把我找個歌曲文件的方法換成代碼,就是了!程序一運行,感覺一切正常,自動找到歌曲并播放,問題又來了,放著放著亂了,本來是1的卻播到2去了!又開始找了一天的原因,第二天才知道原來少了一個變量,哎!曲折啊!又來問題了,我明明在電腦上已經刪除的文件他還在播!后來WNHEX才知道原來電腦刪除文件時在根目錄里吧文件名的第一個字節改成E5,哎呀,有是一頓修改,調試,終于昨天上午全部搞定!現在是一個通過手機TF卡或SD卡存儲4G文件為文件內存的,具FAT32文件系統、自動識別MP3文件、自動掃描歌曲目錄、自動順序播放、自動添加MP3文件的準MP3音樂播放器了!!!當然離市面的MP3還差點,但是剩下的工作就是對系統的擴展了!什么音量調整了,進度條了,頻譜了,人機界面了!都可以在此基礎上做了!!!

于天津開發區第四項目部。

源程序:


  1. #include <reg52.h>
  2. #define  uchar unsigned char
  3. #define uint unsigned int
  4. uchar some;
  5. unsigned long k=4323840;//定義根目錄地址,當然我知道;
  6. uchar xdata tab[512];
  7. //******************
  8. sbit p1_7=P1^7;
  9. sbit CS=P2^0; //片選信號(低電平有效)
  10. sbit DATEIN =P2^1;//主-從數據輸入
  11. sbit SCLK=P2^2;//時鐘信號
  12. sbit DATEOUT=P2^3;//從-主數據輸出
  13. unsigned char bdata dat;
  14. sbit dat_0=dat^0;
  15. sbit dat_1=dat^1;
  16. sbit dat_2=dat^2;
  17. sbit dat_3=dat^3;
  18. sbit dat_4=dat^4;
  19. sbit dat_5=dat^5;
  20. sbit dat_6=dat^6;
  21. sbit dat_7=dat^7;

  22. bit is_init;//決定是否延時;
  23. uchar lpp;
  24. unsigned char fhz;//返回值
  25. uchar fhz_buff; //讀返回值中間量
  26. //unsigned char xdata tab[512];

  27. ///*******************以上是SD卡
  28. /*
  29. VS1003mp3模塊的接口定義

  30. */
  31. sbit XRST=P1^0;//復位
  32. sbit DREQ=P1^1; //數據請求
  33. sbit XDCS=P1^2;  //數據片選
  34. sbit XCS=P1^3; //命令片選
  35. /*
  36. /* VS1003mp3SPI通信接口定義
  37. */
  38. sbit SCK=P1^4; //時鐘
  39. sbit SI=P1^5; //串行輸入
  40. sbit SO=P1^6;  //串行輸出
  41. //*******************************
  42. void delay(uint time)
  43. {  while(time)
  44.   time--;
  45. }
  46. //***************************
  47. unsigned char bdata datmp3;
  48. sbit datmp3_0=datmp3^0;
  49. sbit datmp3_1=datmp3^1;
  50. sbit datmp3_2=datmp3^2;
  51. sbit datmp3_3=datmp3^3;
  52. sbit datmp3_4=datmp3^4;
  53. sbit datmp3_5=datmp3^5;
  54. sbit datmp3_6=datmp3^6;
  55. sbit datmp3_7=datmp3^7;




  56. ///*************************************以下是MP3模塊的程序

  57. void delay1ms(uint j)//延時100us
  58. {unsigned char i;

  59.    for(i=j;i;i--)
  60.    {
  61.   }
  62. }


  63. void spi_write_mp3_1(uchar h)//SPI寫入一個字節,這里是最底層的數據發送!
  64. {
  65.   datmp3=h;



  66.            SI=datmp3_7;
  67.          //為了進一步提高速度我這里采用了順序結構!全是斷橋殘雪惹的禍!第一次愛的人播放正常!而斷橋殘雪不行了!一定盡全力
  68.       SCK=0;   //從SD讀取和MP3寫數據流下手
  69.       SCK=1;
  70.    
  71.       SI=datmp3_6;
  72.    
  73.       SCK=0;
  74.       SCK=1;
  75.    

  76.       SI=datmp3_5;
  77.    
  78.       SCK=0;
  79.       SCK=1;
  80.    

  81.       SI=datmp3_4;
  82.    
  83.       SCK=0;
  84.       SCK=1;
  85.      

  86.       SI=datmp3_3;
  87.    
  88.       SCK=0;
  89.       SCK=1;
  90.      

  91.      SI=datmp3_2;
  92.    
  93.       SCK=0;
  94.       SCK=1;


  95.     SI=datmp3_1;
  96.    
  97.       SCK=0;
  98.       SCK=1;
  99.      

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




  110. }


  111. /*uchar spi_read_mp3()// SPI讀取一個字節
  112. {
  113.     uchar i,read;
  114.    for(i=8;i;i--)
  115.    {
  116.     SCLK=1;
  117.        delay();
  118.        SCLK=0;
  119.     delay();
  120.        read=SO&0x80;
  121.        read=(read<<1);

  122.     }
  123.     SCLK=1;

  124.   return (read);
  125. }
  126. */
  127. void write_comd_mp3(uchar add,uint date)//寫入控制命令add地址date是數據注意這里是16位的數據,內部做分開了處理
  128. {     
  129.     uchar h,l;
  130.     l=date;
  131.     h=(date>>8);

  132.         DREQ=1;
  133.        while(!DREQ); //檢測MP3模塊的忙狀態
  134.   XCS=0;
  135.     spi_write_mp3_1(2); //表示寫操作
  136.     spi_write_mp3_1(add);
  137.     spi_write_mp3_1(h);  //先寫高8位
  138.     spi_write_mp3_1(l);
  139.     XCS=1;




  140. }

  141. void write_date_mp3(uchar dat)//寫入音頻數據信息這里還有一點是XDCS在此函數外拉低
  142. {

  143.    DREQ=1;
  144.        while(!DREQ);
  145.   datmp3=dat;


  146.            SI=datmp3_7;
  147.          //為了進一步提高速度我這里采用了順序結構!全是斷橋殘雪惹的禍!第一次愛的人播放正常!而斷橋殘雪不行了!一定盡全力
  148.       SCK=0;   //從SD讀取和MP3寫數據流下手
  149.       SCK=1;
  150.    
  151.       SI=datmp3_6;
  152.    
  153.       SCK=0;
  154.       SCK=1;
  155.    

  156.       SI=datmp3_5;
  157.    
  158.       SCK=0;
  159.       SCK=1;
  160.    

  161.       SI=datmp3_4;
  162.    
  163.       SCK=0;
  164.       SCK=1;
  165.      

  166.       SI=datmp3_3;
  167.    
  168.       SCK=0;
  169.       SCK=1;
  170.      

  171.      SI=datmp3_2;
  172.    
  173.       SCK=0;
  174.       SCK=1;


  175.     SI=datmp3_1;
  176.    
  177.       SCK=0;
  178.       SCK=1;
  179.      

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




  190. }

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

  199.     write_comd_mp3(0x00,0x0804);//模式設置
  200. write_comd_mp3(0x03,0x9800);//時鐘控制
  201. write_comd_mp3(0x0b,15000);//聲音音量控制 00是最大的!!!!!這里也是十六位的!

  202. XDCS=0;//數據片選
  203. spi_write_mp3_1(0);
  204. spi_write_mp3_1(0);
  205. spi_write_mp3_1(0);
  206. spi_write_mp3_1(0);
  207. XDCS=1;


  208. }

  209. void sing(uchar fhz)//正選測試
  210. {
  211.   
  212.   
  213.    write_comd_mp3(0x00,0x0820);
  214.    DREQ=1;
  215.        while(!DREQ);
  216.     XDCS=0;
  217.     write_date_mp3(0x53);
  218.     write_date_mp3(0xef);
  219.     write_date_mp3(0x6e);//正選測試開啟
  220.     write_date_mp3(fhz); //頻率選擇

  221.     write_date_mp3(0);
  222.     write_date_mp3(0);
  223.        write_date_mp3(0);
  224.     write_date_mp3(0);
  225.      delay1ms(60000);
  226.     write_date_mp3(0x45);   //正選關段
  227.     write_date_mp3(0x78);
  228.     write_date_mp3(0x69);
  229.     write_date_mp3(0x74);

  230.     write_date_mp3(0);
  231.     write_date_mp3(0);
  232.        write_date_mp3(0);
  233.     write_date_mp3(0);
  234.      XDCS=1;











  235. }

  236. //以上是MP3程序
  237. //*//**********************************************



  238. /*讀sd卡子程序,無返回值,有參函數,參數為要寫入DATEIN數據線的字節*/
  239. void write(unsigned char wr_)// 寫入一個字節SD卡
  240. {
  241.            dat=wr_;
  242.         DATEIN=dat_7;
  243.    
  244.       SCLK=0;
  245.    if(is_init)delay(200);
  246.     //if(!is_init)delay(1);
  247.       SCLK=1;
  248.       if(is_init) delay(200);
  249.       // if(!is_init)delay(1);
  250.   
  251.       DATEIN=dat_6;
  252.    
  253.       SCLK=0;
  254.      //if(!is_init)delay(1);
  255.     if(is_init)delay(200);
  256.       SCLK=1;
  257.       if(is_init) delay(200);
  258.     // if(!is_init)delay(1);

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

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

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

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

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

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

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

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

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

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

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

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


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


  367.    return (dat);

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

  390.       DATEIN=dat_5;
  391.    
  392.       SCLK=0;
  393.    
  394.       SCLK=1;
  395.    
  396.   

  397.       DATEIN=dat_4;
  398.    
  399.       SCLK=0;
  400.    
  401.   
  402.       SCLK=1;
  403.    
  404.   

  405.      DATEIN=dat_3;
  406.    
  407.       SCLK=0;
  408.   
  409.       SCLK=1;
  410.   


  411.      DATEIN=dat_2;
  412.    
  413.       SCLK=0;
  414.    
  415.   
  416.       SCLK=1;
  417.   
  418.    

  419.     DATEIN=dat_1;
  420.    
  421.       SCLK=0;
  422.   
  423.       SCLK=1;
  424.   

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

  441.      SCLK=1;

  442.    //if(!is_init)delay(1);
  443.    SCLK=0;

  444.      //if(!is_init)delay(1);
  445.     dat_6=DATEOUT;

  446.     SCLK=1;

  447.    // if(!is_init)delay(1);
  448.    SCLK=0;

  449.    // if(!is_init)delay(1);
  450.     dat_5=DATEOUT;

  451.     SCLK=1;

  452.     // if(!is_init)delay(1);
  453.    SCLK=0;

  454.   // if(!is_init)delay(1);
  455.     dat_4=DATEOUT;

  456.      SCLK=1;

  457.    // if(!is_init)delay(1);
  458.    SCLK=0;

  459.     // if(!is_init)delay(1);
  460.     dat_3=DATEOUT;

  461.     SCLK=1;

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

  467.      SCLK=1;

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


  473.      SCLK=1;

  474.         // if(!is_init)delay(1);
  475.    SCLK=0;

  476.          // if(!is_init)delay(1);
  477.     dat_0=DATEOUT;


  478.    return (dat);

  479. }
  480. //******************************8

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

  485. CS=1;
  486. for(i=0;i<15;i++)
  487. {
  488.        //120時鐘
  489.    write(0xff);
  490. }


  491.   
  492.   
  493.       CS=1;
  494.    write(0xff);//據說是提高兼容性
  495.    CS=0;//片選開

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

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


  507. }

  508.   
  509.   CS=1;
  510.   write(0xff);

  511. }




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

  517.       CS=1;
  518.    write(0xff);//據說是提高兼容性
  519.    CS=0;//片選開

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

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


  532. }

  533.   
  534.   CS=1;
  535.   write(0xff);








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



  544.                          p=&addstart; //取出存放Numb的地址的最高位!詳細請看匯編!!
  545.         zh1=*p;  //這里必須要寫!要不然就會出現播放開始正常,播到一定程度就亂了!因為他不一定位00!就是!!折騰我一天了!!!201012月31日搞定!
  546.        p++;  //由于最高位不用所以這里舍去小于2G
  547.        zh2=*p;//從高到底的地第二字節  、、
  548.        p++;
  549.        zh3=*p; //從高到底的地第三字節
  550.         p++;
  551.        zh4=*p; //從高到底的地第四字節
  552.                    //readsd(numb);//讀物理扇區
  553.         //**************
  554.    CS=0;//片選開

  555.    write1( 0x51);
  556.    write1( zh1);//這里是2G以下可以為00
  557.    write1( zh2);
  558.    write1( zh3);
  559.    write1( zh4);
  560.    write1( 0xff);
  561.    DATEOUT=1;
  562.   
  563. for(;;)
  564. {
  565.    fhz=read1();
  566.    if(fhz==0x00)break;


  567. }
  568. DATEOUT=1;

  569.    for(;;)
  570. {
  571.    fhz=read1();
  572.    if(fhz==0xfe)break;


  573. }

  574.   DATEOUT=1;
  575. n=0;
  576. for(k=512;k;k--)
  577. {  
  578.   tab[n]=read1();
  579.    n++;

  580. }
  581. fhz=read1();
  582. fhz=read1();
  583. CS=1;
  584. write1(0xff);








  585. }
  586. void readsd_mp3(unsigned long numbs) //讀一扇區的數據送MP3解碼!!!
  587. {
  588.      uchar *p;
  589.      uchar zh2,zh3,zh4,zh1;
  590.                  uint  j;


  591.                          p=&numbs; //取出存放Numb的地址的最高位!詳細請看匯編!!
  592.        zh1=*p;
  593.        p++;  //由于最高位不用所以這里舍去小于2G
  594.        zh2=*p;//從高到底的地第二字節  、、
  595.        p++;
  596.        zh3=*p; //從高到底的地第三字節
  597.         p++;
  598.        zh4=*p; //從高到底的地第四字節
  599.                    //readsd(numb);//讀物理扇區
  600.         //**************
  601.    
  602.            XDCS=0;
  603.                     CS=0;//片選開
  604.              dat=0x51;
  605.         DATEIN=dat_7;
  606.    
  607.       SCLK=0;
  608.   
  609.   
  610.       SCLK=1;
  611.    
  612.    
  613.   
  614.       DATEIN=dat_6;
  615.    
  616.       SCLK=0;
  617.    
  618.    
  619.       SCLK=1;
  620.    
  621.    

  622.       DATEIN=dat_5;
  623.    
  624.       SCLK=0;
  625.    
  626.       SCLK=1;
  627.    
  628.   

  629.       DATEIN=dat_4;
  630.    
  631.       SCLK=0;
  632.    
  633.   
  634.       SCLK=1;
  635.    
  636.   

  637.      DATEIN=dat_3;
  638.    
  639.       SCLK=0;
  640.   
  641.       SCLK=1;
  642.   


  643.      DATEIN=dat_2;
  644.    
  645.       SCLK=0;
  646.    
  647.   
  648.       SCLK=1;
  649.   
  650.    

  651.     DATEIN=dat_1;
  652.    
  653.       SCLK=0;
  654.   
  655.       SCLK=1;
  656.   

  657.     DATEIN=dat_0;
  658.    
  659.       SCLK=0;
  660.    
  661.       SCLK=1;       //fhz=read1(); 以上是寫SD卡
  662.    //write1( 0x00);//這里是2G以下可以為00   //fhz=read1(); 以下是寫SD卡
  663.   dat=zh1;
  664.         DATEIN=dat_7;
  665.    
  666.       SCLK=0;
  667.   
  668.   
  669.       SCLK=1;
  670.    
  671.    
  672.   
  673.       DATEIN=dat_6;
  674.    
  675.       SCLK=0;
  676.    
  677.    
  678.       SCLK=1;
  679.    
  680.    

  681.       DATEIN=dat_5;
  682.    
  683.       SCLK=0;
  684.    
  685.       SCLK=1;
  686.    
  687.   

  688.       DATEIN=dat_4;
  689.    
  690.       SCLK=0;
  691.    
  692.   
  693.       SCLK=1;
  694.    
  695.   

  696.      DATEIN=dat_3;
  697.    
  698.       SCLK=0;
  699.   
  700.       SCLK=1;
  701.   


  702.      DATEIN=dat_2;
  703.    
  704.       SCLK=0;
  705.    
  706.   
  707.       SCLK=1;
  708.   
  709.    

  710.     DATEIN=dat_1;
  711.    
  712.       SCLK=0;
  713.   
  714.       SCLK=1;
  715.   

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

  740.       DATEIN=dat_5;
  741.    
  742.       SCLK=0;
  743.    
  744.       SCLK=1;
  745.    
  746.   

  747.       DATEIN=dat_4;
  748.    
  749.       SCLK=0;
  750.    
  751.   
  752.       SCLK=1;
  753.    
  754.   

  755.      DATEIN=dat_3;
  756.    
  757.       SCLK=0;
  758.   
  759.       SCLK=1;
  760.   


  761.      DATEIN=dat_2;
  762.    
  763.       SCLK=0;
  764.    
  765.   
  766.       SCLK=1;
  767.   
  768.    

  769.     DATEIN=dat_1;
  770.    
  771.       SCLK=0;
  772.   
  773.       SCLK=1;
  774.   

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

  799.       DATEIN=dat_5;
  800.    
  801.       SCLK=0;
  802.    
  803.       SCLK=1;
  804.    
  805.   

  806.       DATEIN=dat_4;
  807.    
  808.       SCLK=0;
  809.    
  810.   
  811.       SCLK=1;
  812.    
  813.   

  814.      DATEIN=dat_3;
  815.    
  816.       SCLK=0;
  817.   
  818.       SCLK=1;
  819.   


  820.      DATEIN=dat_2;
  821.    
  822.       SCLK=0;
  823.    
  824.   
  825.       SCLK=1;
  826.   
  827.    

  828.     DATEIN=dat_1;
  829.    
  830.       SCLK=0;
  831.   
  832.       SCLK=1;
  833.   

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

  858.       DATEIN=dat_5;
  859.    
  860.       SCLK=0;
  861.    
  862.       SCLK=1;
  863.    
  864.   

  865.       DATEIN=dat_4;
  866.    
  867.       SCLK=0;
  868.    
  869.   
  870.       SCLK=1;
  871.    
  872.   

  873.      DATEIN=dat_3;
  874.    
  875.       SCLK=0;
  876.   
  877.       SCLK=1;
  878.   


  879.      DATEIN=dat_2;
  880.    
  881.       SCLK=0;
  882.    
  883.   
  884.       SCLK=1;
  885.   
  886.    

  887.     DATEIN=dat_1;
  888.    
  889.       SCLK=0;
  890.   
  891.       SCLK=1;
  892.   

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

  917.       DATEIN=dat_5;
  918.    
  919.       SCLK=0;
  920.    
  921.       SCLK=1;
  922.    
  923.   

  924.       DATEIN=dat_4;
  925.    
  926.       SCLK=0;
  927.    
  928.   
  929.       SCLK=1;
  930.    
  931.   

  932.      DATEIN=dat_3;
  933.    
  934.       SCLK=0;
  935.   
  936.       SCLK=1;
  937.   


  938.      DATEIN=dat_2;
  939.    
  940.       SCLK=0;
  941.    
  942.   
  943.       SCLK=1;
  944.   
  945.    

  946.     DATEIN=dat_1;
  947.    
  948.       SCLK=0;
  949.   
  950.       SCLK=1;
  951.   

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

  968.      SCLK=1;

  969.    //if(!is_init)delay(1);
  970.    SCLK=0;

  971.      //if(!is_init)delay(1);
  972.     dat_6=DATEOUT;

  973.     SCLK=1;

  974.    // if(!is_init)delay(1);
  975.    SCLK=0;

  976.    // if(!is_init)delay(1);
  977.     dat_5=DATEOUT;

  978.     SCLK=1;

  979.     // if(!is_init)delay(1);
  980.    SCLK=0;

  981.   // if(!is_init)delay(1);
  982.     dat_4=DATEOUT;

  983.      SCLK=1;

  984.    // if(!is_init)delay(1);
  985.    SCLK=0;

  986.     // if(!is_init)delay(1);
  987.     dat_3=DATEOUT;

  988.     SCLK=1;

  989.       // if(!is_init)delay(1);
  990.    SCLK=0;
  991.   
  992.       // if(!is_init)delay(1);
  993.     dat_2=DATEOUT;

  994.      SCLK=1;

  995.        // if(!is_init)delay(1);
  996.    SCLK=0;
  997.   
  998.      //  if(!is_init)delay(1);
  999.     dat_1=DATEOUT;


  1000.      SCLK=1;

  1001.         // if(!is_init)delay(1);
  1002.    SCLK=0;

  1003.          // if(!is_init)delay(1);
  1004.     dat_0=DATEOUT;

  1005.       fhz=dat;    // 以上是讀SD卡

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


  1007. }
  1008. DATEOUT=1;

  1009.    for(;;)
  1010. {
  1011.   // fhz=read1();    以下是讀SD卡
  1012.   DATEOUT=1;
  1013.          SCLK=1;
  1014.      //if(!is_init)delay(1);
  1015.    SCLK=0;
  1016.    //if(!is_init)delay(1);
  1017.     dat_7=DATEOUT;

  1018.      SCLK=1;

  1019.    //if(!is_init)delay(1);
  1020.    SCLK=0;

  1021.      //if(!is_init)delay(1);
  1022.     dat_6=DATEOUT;

  1023.     SCLK=1;

  1024.    // if(!is_init)delay(1);
  1025.    SCLK=0;

  1026.    // if(!is_init)delay(1);
  1027.     dat_5=DATEOUT;

  1028.     SCLK=1;

  1029.     // if(!is_init)delay(1);
  1030.    SCLK=0;

  1031.   // if(!is_init)delay(1);
  1032.     dat_4=DATEOUT;

  1033.      SCLK=1;

  1034.    // if(!is_init)delay(1);
  1035.    SCLK=0;

  1036.     // if(!is_init)delay(1);
  1037.     dat_3=DATEOUT;

  1038.     SCLK=1;

  1039.       // if(!is_init)delay(1);
  1040.    SCLK=0;
  1041.   
  1042.       // if(!is_init)delay(1);
  1043.     dat_2=DATEOUT;

  1044.      SCLK=1;

  1045.        // if(!is_init)delay(1);
  1046.    SCLK=0;
  1047.   
  1048.      //  if(!is_init)delay(1);
  1049.     dat_1=DATEOUT;


  1050.      SCLK=1;

  1051.         // if(!is_init)delay(1);
  1052.    SCLK=0;

  1053.          // if(!is_init)delay(1);
  1054.     dat_0=DATEOUT;

  1055.       fhz=dat;    //fhz=read1(); 以上是讀SD卡
  1056.    if(fhz==0xfe)break;


  1057. }

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

  1068.      SCLK=1;

  1069.    //if(!is_init)delay(1);
  1070.    SCLK=0;

  1071.      //if(!is_init)delay(1);
  1072.     dat_6=DATEOUT;

  1073.     SCLK=1;

  1074.    // if(!is_init)delay(1);
  1075.    SCLK=0;

  1076.    // if(!is_init)delay(1);
  1077.     dat_5=DATEOUT;

  1078.     SCLK=1;

  1079.     // if(!is_init)delay(1);
  1080.    SCLK=0;

  1081.   // if(!is_init)delay(1);
  1082.     dat_4=DATEOUT;

  1083.      SCLK=1;

  1084.    // if(!is_init)delay(1);
  1085.    SCLK=0;

  1086.     // if(!is_init)delay(1);
  1087.     dat_3=DATEOUT;

  1088.     SCLK=1;

  1089.       // if(!is_init)delay(1);
  1090.    SCLK=0;
  1091.   
  1092.       // if(!is_init)delay(1);
  1093.     dat_2=DATEOUT;

  1094.      SCLK=1;

  1095.        // if(!is_init)delay(1);
  1096.    SCLK=0;
  1097.   
  1098.      //  if(!is_init)delay(1);
  1099.     dat_1=DATEOUT;


  1100.      SCLK=1;

  1101.         // if(!is_init)delay(1);
  1102.    SCLK=0;

  1103.          // if(!is_init)delay(1);      
  1104.     dat_0=DATEOUT;          //fhz=read1(); 以上是讀SD卡

  1105.       datmp3=dat;    //fhz=read1(); 以下是寫mp3bit流
  1106.          DREQ=1;
  1107.          while(!DREQ);



  1108.            SI=datmp3_7;
  1109.          //為了進一步提高速度我這里采用了順序結構!全是斷橋殘雪惹的禍!第一次愛的人播放正常!而斷橋殘雪不行了!一定盡全力
  1110.       SCK=0;   //從SD讀取和MP3寫數據流下手
  1111.       SCK=1;
  1112.    
  1113.       SI=datmp3_6;
  1114.    
  1115.       SCK=0;
  1116.       SCK=1;
  1117.    

  1118.       SI=datmp3_5;
  1119.    
  1120.       SCK=0;
  1121.       SCK=1;
  1122.    

  1123.       SI=datmp3_4;
  1124.    
  1125.       SCK=0;
  1126.       SCK=1;
  1127.      

  1128.       SI=datmp3_3;
  1129.    
  1130.       SCK=0;
  1131.       SCK=1;
  1132.      

  1133.      SI=datmp3_2;
  1134.    
  1135.       SCK=0;
  1136.       SCK=1;


  1137.     SI=datmp3_1;
  1138.    
  1139.       SCK=0;
  1140.       SCK=1;
  1141.      

  1142.     SI=datmp3_0;
  1143.    
  1144.       SCK=0;
  1145.       SCK=1;
  1146.      
  1147.    
  1148.      
  1149.      
  1150.       
  1151.      




  1152.              //以上是寫mp3bit流
  1153. }

  1154. //**********************以下是讀CRC*****
  1155.            DATEOUT=1;
  1156.             SCLK=1;
  1157.      SCLK=0;
  1158.     dat_7=DATEOUT;

  1159.      SCLK=1;

  1160.    SCLK=0;

  1161.     dat_6=DATEOUT;

  1162.     SCLK=1;

  1163.    SCLK=0;

  1164.     dat_5=DATEOUT;

  1165.     SCLK=1;

  1166.    SCLK=0;

  1167.     dat_4=DATEOUT;

  1168.      SCLK=1;
  1169.    SCLK=0;

  1170.     dat_3=DATEOUT;

  1171.     SCLK=1;

  1172.    SCLK=0;
  1173.     dat_2=DATEOUT;

  1174.      SCLK=1;

  1175.    SCLK=0;
  1176.   
  1177.     dat_1=DATEOUT;


  1178.      SCLK=1;
  1179.    SCLK=0;
  1180.     dat_0=DATEOUT;

  1181. DATEOUT=1;
  1182.          SCLK=1;
  1183.    SCLK=0;
  1184.     dat_7=DATEOUT;

  1185.      SCLK=1;
  1186.    SCLK=0;
  1187.     dat_6=DATEOUT;
  1188.     SCLK=1;
  1189.    SCLK=0;

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

  1193.     dat_4=DATEOUT;
  1194.      SCLK=1;
  1195.    SCLK=0;

  1196.     dat_3=DATEOUT;
  1197.     SCLK=1;
  1198.    SCLK=0;
  1199.   

  1200.     dat_2=DATEOUT;
  1201.         SCLK=1;
  1202.      SCLK=0;
  1203.     dat_1=DATEOUT;
  1204.        SCLK=1;
  1205.     SCLK=0;
  1206.     dat_0=DATEOUT;

  1207.                 CS=1;
  1208.              dat=0xff;

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

  1232.       DATEIN=dat_1;
  1233.       SCLK=0;
  1234.       SCLK=1;
  1235.   
  1236.           DATEIN=dat_0;
  1237.       SCLK=0;
  1238.       SCLK=1;

  1239.    
  1240.       XDCS=1;
  1241. //**********************以上是讀CRC*****          //**************
  1242. }
  1243.                         

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


  1245. /*


  1246. FAT32文件系統是用來尋找歌曲文件的手段!必須的 ////////////////////////////////////////////////////////////////////////////////////////////////////
  1247. 下面是了

  1248.                     名稱:FAT32  文件系統

  1249.      說明:不要認為FAT32多神秘,其實他就是"查字典"  只是每一個環節都不能錯!!!一環扣一環

  1250.      編制:王均偉

  1251.      地點:天津市開發區泰達地下交通空間第四項目部宿舍

  1252.      時間:2010年12月29日19:00完成!調試完畢!!所有歌曲完整無缺的再現!

  1253.      記:本文件系統是以簇為單位,也就是說要讀就是一簇!不存在精確到扇區的算法!因此在切換
  1254.          歌曲時容易出現幾毫秒的等待或噪音!只讀 了根目錄的第一個扇區,所以不能播放超過第一扇區
  1255.       存放的P3文件!也是經一步改進的地方!但是相對此系統而言,就簡單了!我總結了!只要你有思路
  1256.       你有想法!那么不管是否可行根據這個想法畫出流程圖,一步一步改進細化流程圖,然后把流程分成幾個
  1257.       功能塊!分別編寫子函數,最后連起來!調試!關鍵是調試,一編編,一個問題要問:為什么會這樣?是什么原因
  1258.       導致的?一步步排查!實驗,排查!一定能找到阻礙你的那塊石頭!!!


  1259. */



  1260. /*****************************************************************
  1261. /*    函數名:unsigned long find_sd_type();        *
  1262. /*   作用:FAT32系統中用來尋找根目錄中的MP3文件       *
  1263. /*   輸入:無            *
  1264. /*   輸出:返回一個長整形作為找到的MP3文件的簇號       *
  1265. /*                 *
  1266. /*                 *
  1267. /*                 *
  1268. /*                 *
  1269. /*****************************************************************
  1270. */
  1271. unsigned long find_sd_type()
  1272.   {   
  1273.    
  1274.        uchar i,n,a,m,clr;
  1275.     unsigned long h1,h2,h3,h4,startadd;
  1276.   
  1277. lpp:  readsd(k);//這里的K一定要是全局變量!因為在函數調用時,他要不能變化 當然靜態也是可以的!我覺得不保險,算了,加點內存加點吧

  1278. switch (some)//some是用來掃描mp3文件!!!
  1279.   { case 0: {some=1;  i=0;break; }//檢測第0行,提供指針
  1280.     case 1: {some=2;  i=2;break; }//檢測第2行,提供指針
  1281.     case 2: {some=3;  i=4;break; }//檢測第4行,提供指針
  1282.     case 3: {some=4;  i=6;break; }//檢測第6行,提供指針
  1283.     case 4: {some=5;  i=8;break; }//檢測第8行,提供指針
  1284.     case 5: {some=6;  i=10;break;}//檢測第10行,提供指針
  1285.     case 6: {some=7;  i=12;break;}//檢測第12行,提供指針
  1286.     case 7: {some=8;  i=14;break;}//檢測第14行,提供指針
  1287.     case 8: {some=9;  i=16;break;}//檢測第16行,提供指針
  1288.     case 9: {some=10; i=18;break;}//檢測第18行,提供指針
  1289.     case 10:{some=11; i=20;break;}//檢測第20行,提供指針
  1290.     case 11:{some=12; i=22;break;}//檢測第22行,提供指針
  1291.     case 12:{some=13; i=24;break;}//檢測第24行,提供指針
  1292.     case 13:{some=14; i=26;break;}//檢測第26行,提供指針
  1293.     case 14:{some=15; i=28;break;}//檢測第28行,提供指針
  1294.     case 15:{some=0;  i=30;break;}//檢測第30行,提供指針
  1295.   }
  1296.      

  1297. //把根目錄中的第一扇區數據讀入tab中!!!
  1298.   for(;;)
  1299. {
  1300.    n=tab[8+(16*i)];//
  1301. a=tab[9+(16*i)];//
  1302. m=tab[10+(16*i)];//
  1303. clr=tab[(16*i)];

  1304. if((n==0x4d)&(a==0x50)&(m==0x33)&(clr!=0xe5)){break;}//如果有mp3文件擴展名且m之前第8個字節不能是e5,因為e5表示已經刪除的文件,的話退出,沒有就一直找!
  1305.     if((n==0)&(m==0)&(a==0)&(clr==0)){k=4323840;goto lpp;}  //如果讀到0000000,表示下面沒有MP3文件了
  1306. if(i==30){k=(k+512);goto lpp;}//如果讀到30表示一個扇區讀完了只是30里面沒東西話
  1307.   
  1308.    goto lpp;


  1309.    
  1310.   }


  1311.   if(i==30){k=(k+512);}//如果讀到了30行表示一個扇區讀完了只是30行里有歌曲文件 這里的30表示一個扇區有0-31行:::







  1312.             //注意這里的i--;是必要的!應為我在比較后
  1313.   h1=tab[20+(16*i)];         //i多加了一次,所以要減去,因為下面我要用的!!就是這個原因!
  1314.   h2=tab[21+(16*i)];//查文件開始簇的地址
  1315.   h3=tab[26+(16*i)];
  1316.   h4=tab[27+(16*i)];//這里得到h1-h4表示

  1317.    
  1318.      
  1319.   



  1320.   h2=(h2<<24);//注意這里!h2是在32為中的32-24位 開始我在這里搞錯了
  1321.   h1=(h1<<16);//注意這里!h1是在32為中的17-24位                       ///格式轉換!把它有逆序排列的十六進制轉換成正常的高位在前的十六進制!!!
  1322.     h4=(h4<<8);//注意這里!h2是在32為中的8-16位                  / /上面不用轉換,文件名的排列是正確的!
  1323.     startadd=h1+h2+h3+h4;
  1324.    
  1325.    return(startadd);//返回文件的開始簇開始
  1326.   }


  1327. /*****************************************************************
  1328. /*    函數名:unsigned long find_sd_fat(unsigned long startadd1);        *
  1329. /*   作用:FAT32系統中用來查找FAT是否有下一簇的開始地址  *
  1330. /*          如有則返回,沒有則退出      *
  1331. /*   輸入:已經執行完的的或前一個簇號     *
  1332. /*   輸出:返回一個長整形作為找到的MP3文件的下一簇開始地址*
  1333. /*                 *
  1334. /*                 *
  1335. /*                 *
  1336. /*                 *
  1337. /*****************************************************************
  1338. */
  1339. unsigned long find_sd_fat(unsigned long startadd1)
  1340. {
  1341.      unsigned long a,b,c,d,startadd; //snumb存儲扇區數
  1342.     static unsigned long snumb;
  1343.     snumb=((startadd1*4)/512);//占得扇區數
  1344.     readsd(2363904+(snumb*512));//讀fat表放入tab中
  1345.     a=tab[(startadd1*4)-(snumb*512)];//最低字節
  1346.     b=tab[(startadd1*4)-(snumb*512)+1];
  1347.     c=tab[(startadd1*4)-(snumb*512)+2];
  1348.      d=tab[(startadd1*4)-(snumb*512)+3];//最高字節

  1349.      d=(d<<24);
  1350.           c=(c<<16);
  1351.             b=(b<<8);
  1352.          startadd=a+b+c+d;   
  1353.     return (startadd);
  1354. }

  1355. ///////////////////////////////////////////////////////////////
  1356. void main() //主程序
  1357. {
  1358.   uint ct;
  1359. unsigned long  numb,f,st;//numb是簇號,f是物理地址,st 中間變量

  1360. init_mp3();//初始化MP3
  1361. ////////////////
  1362. is_init=1;
  1363. restsd(); //復位SD卡
  1364. initsd(); //初始化SD卡
  1365. is_init=0;//提高始終頻率
  1366. ///////////////
  1367. sing(100);//正選測試      
  1368.                  while(1)//主循環
  1369.                    {
  1370.      

  1371.                  // numb=//從4327936物理地址開始讀歌曲!


  1372.   loop:       p1_7=0;
  1373.             numb=find_sd_type();//計算mp3文件的開始簇,返回計算出的文件開始簇號!
  1374.      p1_7=1;
  1375.                      while(1)  
  1376.                         {
  1377.       
  1378.          
  1379.      f=(4323840+((numb-2)*4096));//  將計算歌曲的開始簇地址轉化成SD卡的物理地址
  1380.         st=f;//中間量ST保證一個個基準量,F則不行!因為F要加0X200時刻變化的!!而ST則是不變的!!
  1381.        for(;;)      //讀出一簇數據送往MP3;
  1382.            {
  1383.       
  1384.            readsd_mp3(f);//給他地址他就播放!!!當然是物理SD地址
  1385.      
  1386.                               f=(f+0x200);//因為是一簇所以要讀扇區后腰加一扇區的地址更新
  1387.       
  1388.        if(f==(st+4096))break; //如果是一簇播放完畢!那么要退出!尋找下一簇!怎么找?FAT表   
  1389.            }
  1390.       
  1391.          numb=find_sd_fat(numb);  //查FAT表!找到下一簇!
  1392.       if(numb==0x0fffffff)//文件播放完畢?完畢就轉到下一首,沒完繼續查fat表
  1393.        {
  1394.           XDCS=0;
  1395.          for(ct=2048;ct;ct--)
  1396.          {
  1397.         
  1398.             write_date_mp3(0);
  1399.         
  1400.         
  1401.          }
  1402.            XDCS=1;


  1403.       
  1404.       goto loop;
  1405.       
  1406.       
  1407.        }// 是否播放完畢?檢測到0X0FFFFFFF表示播放完畢!如果完畢則轉到loop執行
  1408.       

  1409.                        }         
  1410.   

  1411.         }

  1412.   



  1413. }
復制代碼


評分

參與人數 6威望 +6 黑幣 +35 收起 理由
颶風摯友 + 5 很給力!
QWER01234 + 5 贊一個!
dzbj + 2 贊一個!
YJGG + 12 很給力!
a8650876 + 5 很給力!
紅塵有你 + 6 + 6 很給力!

查看全部評分

回復

使用道具 舉報

ID:79034 發表于 2015-12-3 21:38 | 顯示全部樓層
頂一個,這都沒人感興趣,不知道這么多新手都學什么去了 。。。。
本新手表示,就對這些感興趣。。。
回復

使用道具 舉報

ID:97249 發表于 2015-12-4 13:24 | 顯示全部樓層
這個東西,樓主花了不少心血,必須得贊一個!!
回復

使用道具 舉報

ID:96176 發表于 2015-12-10 22:38 | 顯示全部樓層
這代碼太長了,謝謝
回復

使用道具 舉報

ID:96682 發表于 2015-12-11 21:30 | 顯示全部樓層
高工,給個代碼不解饞啊,出個 sch 或者來個DSN就更好了,大伙的資歷還沒達到能看懂你給出這復雜東西啊!
回復

使用道具 舉報

ID:111601 發表于 2016-3-31 15:33 | 顯示全部樓層
謝謝分享您幫了我大忙
回復

使用道具 舉報

ID:111984 發表于 2016-4-3 01:59 來自手機 | 顯示全部樓層
感謝分享收藏下來慢慢嚼
回復

使用道具 舉報

ID:87718 發表于 2016-4-4 13:39 | 顯示全部樓層
這個東西,樓主花了不少心血,必須得贊一個!!
回復

使用道具 舉報

ID:79544 發表于 2016-4-4 18:55 | 顯示全部樓層
樓主辛苦,值得尊敬,謝謝分享。頂起!!!!!!!
回復

使用道具 舉報

ID:119323 發表于 2016-5-19 21:55 | 顯示全部樓層
樓主的精神值得學習!
回復

使用道具 舉報

ID:123468 發表于 2016-5-27 10:07 | 顯示全部樓層
對我來說這個太高端了.
回復

使用道具 舉報

ID:117765 發表于 2016-5-29 10:16 | 顯示全部樓層
給個DSN  和hex就完美了
回復

使用道具 舉報

ID:95691 發表于 2016-7-26 14:35 | 顯示全部樓層
樓主真花了不少心血啊,必須贊一個
回復

使用道具 舉報

ID:45225 發表于 2016-12-14 20:48 | 顯示全部樓層
寫得好!注釋也詳細,值得初學者學習,樓主辛苦了,論壇有更精彩!
回復

使用道具 舉報

ID:154916 發表于 2016-12-15 09:47 | 顯示全部樓層
太厲害了哈!樓主 分享的東西,質量很高哈
回復

使用道具 舉報

ID:137676 發表于 2016-12-15 16:55 | 顯示全部樓層
感謝樓主分享!
回復

使用道具 舉報

ID:149286 發表于 2017-1-9 12:46 | 顯示全部樓層
很給力!
回復

使用道具 舉報

ID:166078 發表于 2017-2-22 22:04 | 顯示全部樓層
非常有用
回復

使用道具 舉報

ID:166347 發表于 2017-3-14 10:08 | 顯示全部樓層
原理圖沒有啊?
回復

使用道具 舉報

ID:47286 發表于 2017-3-14 14:04 | 顯示全部樓層
佩服你的鉆研精神 希望能和你成為朋友 我也新人 分不多 捐2分意思意思 呵呵
回復

使用道具 舉報

ID:169995 發表于 2017-4-4 21:44 | 顯示全部樓層
畢業設計要做這個,看了樓主寫的,收獲很大啊!
不知樓主可否發一下硬件原理圖啊!
回復

使用道具 舉報

ID:167337 發表于 2017-4-12 11:37 | 顯示全部樓層
樓主真花了不少心血啊,必須贊一個,值得學習。
不過最好能共享原理圖,我等水平不夠,很難完全看懂程序,謝謝!
回復

使用道具 舉報

ID:110278 發表于 2017-8-6 09:05 | 顯示全部樓層
厲害了。。。。
回復

使用道具 舉報

ID:370626 發表于 2018-7-29 04:10 來自手機 | 顯示全部樓層
很厲害,佩服!
回復

使用道具 舉報

ID:251061 發表于 2019-7-11 06:50 | 顯示全部樓層
這個帖子真不能沉下去,樓主的資料對新手來說是很大的幫助!沒看懂,沒關系多看幾次會有更多收獲!
回復

使用道具 舉報

ID:447180 發表于 2019-11-8 12:46 | 顯示全部樓層
勵志小說呀  厲害
回復

使用道具 舉報

ID:497933 發表于 2020-10-24 15:39 | 顯示全部樓層
沒驗證,就看的話,SPI讀數據的地方有毛病
回復

使用道具 舉報

ID:845055 發表于 2020-12-8 19:21 | 顯示全部樓層
對我很有幫助,可以自己動手做一下
回復

使用道具 舉報

ID:528166 發表于 2021-1-28 16:47 | 顯示全部樓層
加油廢了不少心血把
回復

使用道具 舉報

ID:266164 發表于 2021-2-6 15:48 | 顯示全部樓層
無私奉獻的精神值得我輩學習
回復

使用道具 舉報

ID:138956 發表于 2021-3-8 13:15 | 顯示全部樓層
好東西,寫的很詳細,必須得贊一個!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区视频在线 | 精品www | 国产精品99久久久久久宅男 | 久草a√| aa级毛片毛片免费观看久 | 欧美亚洲国产一区二区三区 | 色综合一区二区 | 日干夜干 | 成人蜜桃av | 一区二区精品 | 久久机热| 中文字幕视频三区 | 99re视频在线观看 | 午夜影院在线免费观看视频 | 特黄色一级毛片 | 亚洲91视频 | 激情欧美一区二区三区中文字幕 | 国产日韩精品一区 | 日本三级视频 | 欧美精品一区二区三区在线播放 | 国产一区二区三区四区三区四 | 欧美亚洲一区二区三区 | 91精品国产乱码久久久久久 | 午夜爽爽男女免费观看hd | av中文字幕在线观看 | 国产精品美女久久久久aⅴ国产馆 | 亚洲精品一区二区三区蜜桃久 | 高清久久久 | 亚洲久久久 | 久久精品久久精品久久精品 | 欧美黄视频 | 青青久草 | 久久久爽爽爽美女图片 | 成人在线观看欧美 | 日本欧美国产在线 | 天天干免费视频 | 国产亚洲久 | 精品一二三区在线观看 | 毛片综合| 99日韩| 日本久久久一区二区三区 |