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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7168|回復: 1
收起左側

51單片機軟件解碼MP3碼流速率提升后的!!!!

[復制鏈接]
ID:83710 發表于 2015-6-23 16:45 | 顯示全部樓層 |閱讀模式
由于MP3文件的碼率不同導致了有的歌曲不能正常播放!故而在不改變晶振頻率的情況下,把內部對SD的FLASH 和送往MP3解碼器的數據流速率做了調整!使他們達到最高速!比如:播放一首《第一次愛的人》音質就很好!但是播放《斷橋殘雪》就出現卡頓現象!是故也!
這里取消了移位算法!采用順序架構!主要還是改變SPI的通信速率!其實還可以繼續增強播放流速度!盡一切的減小指令的執行周期!但是經調試 這個速度已經可以滿足了!就不做不必要的調整了!還有一招那就是改變 時鐘!但是過高的外部時鐘對系統的穩定性有影響的,這里不予考慮!實在不行再綜合考慮!總之:要千方百計的挖掘可以提高的潛在的可提升的速度因素!達到播放要求!音質完美再現!


  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. //******************
  5. sbit p1_7=P1^7;
  6. sbit CS=P2^0; //片選信號(低電平有效)
  7. sbit DATEIN =P2^1;//主-從數據輸入
  8. sbit SCLK=P2^2;//時鐘信號
  9. sbit DATEOUT=P2^3;//從-主數據輸出
  10. unsigned char bdata dat;
  11. sbit dat_0=dat^0;
  12. sbit dat_1=dat^1;
  13. sbit dat_2=dat^2;
  14. sbit dat_3=dat^3;
  15. sbit dat_4=dat^4;
  16. sbit dat_5=dat^5;
  17. sbit dat_6=dat^6;
  18. sbit dat_7=dat^7;

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

  24. ///*******************以上是SD卡
  25. /*
  26. VS1003mp3模塊的接口定義

  27. */
  28. sbit XRST=P1^0;//復位
  29. sbit DREQ=P1^1; //數據請求
  30. sbit XDCS=P1^2;  //數據片選
  31. sbit XCS=P1^3; //命令片選
  32. /*
  33. /* VS1003mp3SPI通信接口定義
  34. */
  35. sbit SCK=P1^4; //時鐘
  36. sbit SI=P1^5; //串行輸入
  37. sbit SO=P1^6;  //串行輸出
  38. //*******************************

  39. void delay(uint time)
  40. {  while(time)
  41.   time--;
  42. }
  43. //***************************
  44. unsigned char bdata datmp3;
  45. sbit datmp3_0=datmp3^0;
  46. sbit datmp3_1=datmp3^1;
  47. sbit datmp3_2=datmp3^2;
  48. sbit datmp3_3=datmp3^3;
  49. sbit datmp3_4=datmp3^4;
  50. sbit datmp3_5=datmp3^5;
  51. sbit datmp3_6=datmp3^6;
  52. sbit datmp3_7=datmp3^7;
  53. //**********************************************
  54. /*讀sd卡子程序,無返回值,有參函數,參數為要寫入DATEIN數據線的字節*/
  55. void write(unsigned char wr_)// 寫入一個字節SD卡
  56. {
  57.            dat=wr_;
  58.         DATEIN=dat_7;
  59.    
  60.       SCLK=0;
  61.    if(is_init)delay(200);
  62.     //if(!is_init)delay(1);
  63.       SCLK=1;
  64.       if(is_init) delay(200);
  65.       // if(!is_init)delay(1);
  66.   
  67.       DATEIN=dat_6;
  68.    
  69.       SCLK=0;
  70.      //if(!is_init)delay(1);
  71.     if(is_init)delay(200);
  72.       SCLK=1;
  73.       if(is_init) delay(200);
  74.     // if(!is_init)delay(1);

  75.       DATEIN=dat_5;
  76.    
  77.       SCLK=0;
  78.     if(is_init)delay(200);
  79.     // if(!is_init)delay(1);
  80.       SCLK=1;
  81.       if(is_init) delay(200);
  82.     //if(!is_init)delay(1);

  83.       DATEIN=dat_4;
  84.    
  85.       SCLK=0;
  86.     if(is_init)delay(200);
  87.      // if(!is_init)delay(1);
  88.       SCLK=1;
  89.       if(is_init) delay(200);
  90.     // if(!is_init)delay(1);

  91.      DATEIN=dat_3;
  92.    
  93.       SCLK=0;
  94.     if(is_init)delay(200);
  95.       //if(!is_init)delay(1);
  96.       SCLK=1;
  97.       if(is_init) delay(200);
  98.    // if(!is_init)delay(1);

  99.      DATEIN=dat_2;
  100.    
  101.       SCLK=0;
  102.     if(is_init)delay(200);
  103.      // if(!is_init)delay(1);
  104.       SCLK=1;
  105.       if(is_init) delay(200);
  106.      // if(!is_init)delay(1);

  107.     DATEIN=dat_1;
  108.    
  109.       SCLK=0;
  110.     if(is_init)delay(200);
  111.     // if(!is_init)delay(1);
  112.       SCLK=1;
  113.       if(is_init) delay(200);
  114.     // if(!is_init)delay(1);

  115.     DATEIN=dat_0;
  116.    
  117.       SCLK=0;
  118.     if(is_init)delay(200);
  119.       //if(!is_init)delay(1);
  120.       SCLK=1;
  121.       if(is_init) delay(200);
  122.      //if(!is_init)delay(1);
  123. }
  124. unsigned char read()// 讀取一個字節SD卡
  125. {
  126.           DATEOUT=1;
  127.          SCLK=1;
  128.    if(is_init)delay(200);
  129.      //if(!is_init)delay(1);
  130.    SCLK=0;
  131.     if(is_init)delay(200);
  132.    //if(!is_init)delay(1);
  133.     dat_7=DATEOUT;

  134.      SCLK=1;
  135.    if(is_init)delay(200);
  136.    //if(!is_init)delay(1);
  137.    SCLK=0;
  138.     if(is_init)delay(200);
  139.      //if(!is_init)delay(1);
  140.     dat_6=DATEOUT;

  141.     SCLK=1;
  142.    if(is_init)delay(200);
  143.    // if(!is_init)delay(1);
  144.    SCLK=0;
  145.     if(is_init)delay(200);
  146.    // if(!is_init)delay(1);
  147.     dat_5=DATEOUT;

  148.     SCLK=1;
  149.    if(is_init)delay(200);
  150.     // if(!is_init)delay(1);
  151.    SCLK=0;
  152.     if(is_init)delay(200);
  153.   // if(!is_init)delay(1);
  154.     dat_4=DATEOUT;

  155.      SCLK=1;
  156.    if(is_init)delay(200);
  157.    // if(!is_init)delay(1);
  158.    SCLK=0;
  159.     if(is_init)delay(200);
  160.     // if(!is_init)delay(1);
  161.     dat_3=DATEOUT;

  162.     SCLK=1;
  163.    if(is_init)delay(200);
  164.       // if(!is_init)delay(1);
  165.    SCLK=0;
  166.     if(is_init)delay(200);
  167.       // if(!is_init)delay(1);
  168.     dat_2=DATEOUT;

  169.      SCLK=1;
  170.    if(is_init)delay(200);
  171.        // if(!is_init)delay(1);
  172.    SCLK=0;
  173.     if(is_init)delay(200);
  174.      //  if(!is_init)delay(1);
  175.     dat_1=DATEOUT;


  176.      SCLK=1;
  177.    if(is_init)delay(200);
  178.         // if(!is_init)delay(1);
  179.    SCLK=0;
  180.     if(is_init)delay(200);
  181.          // if(!is_init)delay(1);
  182.     dat_0=DATEOUT;


  183.    return (dat);

  184. }

  185. void restsd()//復位SD卡
  186. {  uchar i;
  187. uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
  188. is_init=1;

  189. CS=1;
  190. for(i=0;i<15;i++)
  191. {
  192.        //120時鐘
  193.    write(0xff);
  194. }


  195.   
  196.   
  197.       CS=1;
  198.    write(0xff);//據說是提高兼容性
  199.    CS=0;//片選開

  200.    write( pcmd[0]);
  201.    write( pcmd[1]);
  202.    write( pcmd[2]);
  203.    write( pcmd[3]);
  204.    write( pcmd[4]);
  205.    write( pcmd[5]);

  206.    fhz=read();
  207. for(;;)
  208. {
  209.    fhz=read();
  210.    if(fhz==0x01)break;


  211. }

  212.   
  213.   CS=1;
  214.   write(0xff);

  215. }




  216. void initsd()//初始化
  217. {
  218. //
  219.    uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
  220. //

  221.       CS=1;
  222.    write(0xff);//據說是提高兼容性
  223.    CS=0;//片選開

  224.    write( pcmd[0]);
  225.    write( pcmd[1]);
  226.    write( pcmd[2]);
  227.    write( pcmd[3]);
  228.    write( pcmd[4]);
  229.    write( pcmd[5]);

  230.   
  231.    fhz=read();
  232. for(;;)
  233. {
  234.    fhz=read();
  235.    if(fhz==0x00)break;


  236. }

  237.   
  238.   CS=1;
  239.   write(0xff);








  240. }

  241. void readsd(unsigned long addstart)//讀SD卡物理扇區
  242.    
  243. {  unsigned long sdbuff1,sdbuff2,sdbuff3,sdbuff4;  
  244.    uint j,n;
  245. uchar zh1,zh2,zh3,zh4;
  246.   sdbuff1=addstart;
  247.   sdbuff2=addstart;
  248.   sdbuff3=addstart;
  249.   sdbuff4=addstart;

  250.      zh1=(sdbuff1>>24)&0x000000ff;
  251.     zh2=(sdbuff2>>16)&0x000000ff;
  252.       zh3=(sdbuff3>>8)&0x000000ff;
  253.      zh4=sdbuff4&0x000000ff;
  254.    // uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原來這里是高地址字節在前地地址在后啊201012月14日邏輯扇區在253*512=0X0001fa00



  255.        CS=1;
  256.    write(0xff);//據說是提高兼容性
  257.    CS=0;//片選開

  258.    write( 0x51);
  259.    write( zh1);
  260.    write( zh2);
  261.    write( zh3);
  262.    write( zh4);
  263.    write( 0xff);
  264.    DATEOUT=1;
  265.   
  266. for(;;)
  267. {
  268.    fhz=read();
  269.    if(fhz==0x00)break;


  270. }
  271. DATEOUT=1;

  272.    for(;;)
  273. {
  274.    fhz=read();
  275.    if(fhz==0xfe)break;


  276. }

  277.   DATEOUT=1;
  278. n=0;
  279. for(j=512;j;j--)
  280. {  
  281.    tab[n]=read();
  282.     n++;

  283. }
  284. fhz=read();
  285. fhz=read();
  286. CS=1;
  287. write(0xff);








  288. }


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


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

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

  293.    for(i=j;i;i--)
  294.    {
  295.   }
  296. }



  297. void spi_write_mp3(uchar h)//SPI寫入一個字節,這里是最底層的數據發送!
  298. {
  299.   datmp3=h;

  300. /*SCLK=1;
  301. for(i=8;i;i--)
  302. {

  303.       SI=h&0x80;
  304.    h=h<<1;
  305.    SCK=0;
  306.    //delay1ms(1);  //這里不要加任何的延時!提高寫入MP3模塊的寫入速度!
  307.       SCK=1;
  308.   // delay1ms(1);





  309. }*/

  310.            SI=datmp3_7;
  311.          //為了進一步提高速度我這里采用了順序結構!全是斷橋殘雪惹的禍!第一次愛的人播放正常!而斷橋殘雪不行了!一定盡全力
  312.       SCK=0;   //從SD讀取和MP3寫數據流下手
  313.       SCK=1;
  314.    
  315.       SI=datmp3_6;
  316.    
  317.       SCK=0;
  318.       SCK=1;
  319.    

  320.       SI=datmp3_5;
  321.    
  322.       SCK=0;
  323.       SCK=1;
  324.    

  325.       SI=datmp3_4;
  326.    
  327.       SCK=0;
  328.       SCK=1;
  329.      

  330.       SI=datmp3_3;
  331.    
  332.       SCK=0;
  333.       SCK=1;
  334.      

  335.      SI=datmp3_2;
  336.    
  337.       SCK=0;
  338.       SCK=1;


  339.     SI=datmp3_1;
  340.    
  341.       SCK=0;
  342.       SCK=1;
  343.      

  344.     SI=datmp3_0;
  345.    
  346.       SCK=0;
  347.       SCK=1;
  348.      




  349. }


  350. /*uchar spi_read_mp3()// SPI讀取一個字節
  351. {
  352.     uchar i,read;
  353.    for(i=8;i;i--)
  354.    {
  355.     SCLK=1;
  356.        delay();
  357.        SCLK=0;
  358.     delay();
  359.        read=SO&0x80;
  360.        read=(read<<1);

  361.     }
  362.     SCLK=1;

  363.   return (read);
  364. }
  365. */
  366. void write_comd_mp3(uchar add,uint date)//寫入控制命令add地址date是數據注意這里是16位的數據,內部做分開了處理
  367. {     
  368.     uchar h,l;
  369.     l=date;
  370.     h=(date>>8);

  371.         DREQ=1;
  372.        while(!DREQ); //檢測MP3模塊的忙狀態
  373.   XCS=0;
  374.     spi_write_mp3(2); //表示寫操作
  375.     spi_write_mp3(add);
  376.     spi_write_mp3(h);  //先寫高8位
  377.     spi_write_mp3(l);
  378.     XCS=1;




  379. }

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

  382.    DREQ=1;
  383.        while(!DREQ);
  384.   spi_write_mp3(dat);



  385. }

  386. void init_mp3()  //初始化vs1003
  387. {
  388.   XRST=1;
  389.   delay1ms(100);
  390.   XRST=0;
  391.   delay1ms(100);
  392.   XRST=1;
  393.   delay1ms(100);

  394.     write_comd_mp3(0x00,0x0804);//模式設置
  395. write_comd_mp3(0x03,0x9800);//時鐘控制
  396. write_comd_mp3(0x0b,250);//聲音音量控制 00是最大的!!!!!

  397. XDCS=0;//數據片選
  398. spi_write_mp3(0);
  399. spi_write_mp3(0);
  400. spi_write_mp3(0);
  401. spi_write_mp3(0);
  402. XDCS=1;


  403. }

  404. void sing(uchar fhz)//正選測試
  405. {
  406.   
  407.   
  408.    write_comd_mp3(0x00,0x0820);
  409.    DREQ=1;
  410.        while(!DREQ);
  411.     XDCS=0;
  412.     write_date_mp3(0x53);
  413.     write_date_mp3(0xef);
  414.     write_date_mp3(0x6e);//正選測試開啟
  415.     write_date_mp3(fhz); //頻率選擇

  416.     write_date_mp3(0);
  417.     write_date_mp3(0);
  418.        write_date_mp3(0);
  419.     write_date_mp3(0);
  420.      delay1ms(60000);
  421.     write_date_mp3(0x45);   //正選關段
  422.     write_date_mp3(0x78);
  423.     write_date_mp3(0x69);
  424.     write_date_mp3(0x74);

  425.     write_date_mp3(0);
  426.     write_date_mp3(0);
  427.        write_date_mp3(0);
  428.     write_date_mp3(0);
  429.      XDCS=1;











  430. }

  431. //以上是MP3程序
  432. void main() //主程序
  433. {


  434. unsigned long numb;
  435. uint  i;
  436. uchar sd_mp3_buff;
  437.   


  438. init_mp3();//初始化MP3
  439. ////////////////
  440. is_init=1;
  441. restsd();
  442. initsd();
  443. is_init=0;//提高始終頻率
  444. ///////////////




  445. sing(100);//正選測試

  446.       
  447.   while(1)
  448.   {
  449.    
  450.      numb=4327936; //從4327936物理地址開始讀歌曲!




  451.                       for(;;)
  452.                         {    XDCS=0;
  453.                          readsd(numb);//讀物理扇區

  454.                               for(i=0;i<512;i++)  //一個扇區的數據送入MP3中
  455.                                {
  456.       
  457.    
  458.    
  459.                                    sd_mp3_buff=tab[i];
  460.                                    write_date_mp3( sd_mp3_buff);
  461.    
  462.    

  463.                                  }

  464.              numb=(numb+512);



  465.                        }




  466.    XDCS=1;



  467.   }

  468.   


  469. }
復制代碼



回復

使用道具 舉報

無效樓層,該帖已經被刪除
無效樓層,該帖已經被刪除
ID:111099 發表于 2018-2-11 23:21 | 顯示全部樓層
老兄你這個是用VS1003解碼不是51去軟解,被標題忽悠到了。

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 请别相信他免费喜剧电影在线观看 | 久草青青草 | 国产免费福利小视频 | 日韩欧美高清dvd碟片 | www日日日| 高清一区二区视频 | 亚洲狠狠 | 精品视频在线播放 | 一级毛片中国 | 自拍偷拍中文字幕 | 久草久草久草 | 日韩欧美一区二区三区免费观看 | 青青草亚洲| 天天爽天天操 | 51ⅴ精品国产91久久久久久 | 最新国产精品视频 | 国产视频一区二区 | 亚洲视频在线播放 | 成人精品在线观看 | 中文字幕亚洲精品 | 精品国产一区二区三区性色av | 国内自拍偷拍 | 日韩色在线 | 久久久久久亚洲精品 | 精品久久久久久久久亚洲 | 精品亚洲视频在线 | 久久99精品国产麻豆婷婷 | 亚洲 欧美 日韩在线 | 精品久久视频 | 国产免费拔擦拔擦8x高清 | 久久久精彩视频 | 久久91| 91豆花视频 | 天天干狠狠干 | 亚洲综合国产精品 | 一区二区三区欧美大片 | 日韩欧美亚洲 | 欧美专区在线 | 欧美日本韩国一区二区 | 亚洲日本中文字幕在线 | 精品不卡 |