找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MP3码率再次提升!!!cpu快崩溃了

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-23 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的天啊!这是要了8位CPU的命啊!现在的比特流已经超过250KBPS在也提高不了了!我认为!要达到340KBPS必须加晶振!程序我已经尽力了!!!不过!大部分的歌曲文件播放不成问题了!我换了晶振!12m的!如果换个35的保证没问题了!看来8位机在这方面给是真的不行啊!
  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. //****************************
  186. void write1(unsigned char wr_)// 写入一个字节SD卡
  187. {
  188.            dat=wr_;
  189.         DATEIN=dat_7;
  190.    
  191.       SCLK=0;
  192.   
  193.    
  194.       SCLK=1;
  195.    
  196.    
  197.   
  198.       DATEIN=dat_6;
  199.    
  200.       SCLK=0;
  201.    
  202.    
  203.       SCLK=1;
  204.      
  205.    
  206.       DATEIN=dat_5;
  207.    
  208.       SCLK=0;
  209.    
  210.       SCLK=1;
  211.      
  212.   
  213.       DATEIN=dat_4;
  214.    
  215.       SCLK=0;
  216.    
  217.   
  218.       SCLK=1;
  219.    
  220.   
  221.      DATEIN=dat_3;
  222.    
  223.       SCLK=0;
  224.   
  225.       SCLK=1;
  226.   

  227.      DATEIN=dat_2;
  228.    
  229.       SCLK=0;
  230.    
  231.   
  232.       SCLK=1;
  233.   
  234.    
  235.     DATEIN=dat_1;
  236.    
  237.       SCLK=0;
  238.   
  239.       SCLK=1;
  240.   
  241.     DATEIN=dat_0;
  242.    
  243.       SCLK=0;
  244.    
  245.       SCLK=1;
  246.    
  247.   
  248. }
  249. unsigned char read1()// 读取一个字节SD卡
  250. {  
  251.           DATEOUT=1;
  252.          SCLK=1;
  253.      //if(!is_init)delay(1);
  254.    SCLK=0;
  255.    //if(!is_init)delay(1);
  256.     dat_7=DATEOUT;
  257.      SCLK=1;
  258.    //if(!is_init)delay(1);
  259.    SCLK=0;

  260.      //if(!is_init)delay(1);
  261.     dat_6=DATEOUT;
  262.     SCLK=1;

  263.    // if(!is_init)delay(1);
  264.    SCLK=0;

  265.    // if(!is_init)delay(1);
  266.     dat_5=DATEOUT;
  267.     SCLK=1;

  268.     // if(!is_init)delay(1);
  269.    SCLK=0;

  270.   // if(!is_init)delay(1);
  271.     dat_4=DATEOUT;
  272.      SCLK=1;

  273.    // if(!is_init)delay(1);
  274.    SCLK=0;

  275.     // if(!is_init)delay(1);
  276.     dat_3=DATEOUT;
  277.     SCLK=1;

  278.       // if(!is_init)delay(1);
  279.    SCLK=0;
  280.   
  281.       // if(!is_init)delay(1);
  282.     dat_2=DATEOUT;
  283.      SCLK=1;

  284.        // if(!is_init)delay(1);
  285.    SCLK=0;
  286.    
  287.      //  if(!is_init)delay(1);
  288.     dat_1=DATEOUT;

  289.      SCLK=1;

  290.         // if(!is_init)delay(1);
  291.    SCLK=0;

  292.          // if(!is_init)delay(1);
  293.     dat_0=DATEOUT;

  294.    return (dat);
  295. }
  296. //******************************8
  297. void restsd()//复位SD卡
  298. {  uchar i;
  299. uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
  300. is_init=1;

  301. CS=1;
  302. for(i=0;i<15;i++)
  303. {
  304.        //120时钟
  305.    write(0xff);
  306. }

  307.    
  308.    
  309.       CS=1;
  310.    write(0xff);//据说是提高兼容性
  311.    CS=0;//片选开
  312.    write( pcmd[0]);
  313.    write( pcmd[1]);
  314.    write( pcmd[2]);
  315.    write( pcmd[3]);
  316.    write( pcmd[4]);
  317.    write( pcmd[5]);
  318.    fhz=read();
  319. for(;;)
  320. {
  321.    fhz=read();
  322.    if(fhz==0x01)break;


  323. }
  324.    
  325.   CS=1;
  326.   write(0xff);
  327. }


  328. void initsd()//初始化
  329. {
  330. //
  331.    uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
  332. //

  333.       CS=1;
  334.    write(0xff);//据说是提高兼容性
  335.    CS=0;//片选开
  336.    write( pcmd[0]);
  337.    write( pcmd[1]);
  338.    write( pcmd[2]);
  339.    write( pcmd[3]);
  340.    write( pcmd[4]);
  341.    write( pcmd[5]);
  342.   
  343.    
  344.    fhz=read();
  345. for(;;)
  346. {
  347.    fhz=read();
  348.    if(fhz==0x00)break;


  349. }
  350.    
  351.   CS=1;
  352.   write(0xff);




  353. }
  354. void readsd(unsigned long addstart)//读SD卡物理扇区
  355.    
  356. {  unsigned long sdbuff1,sdbuff2,sdbuff3,sdbuff4;  
  357.      uint j,n;
  358.      uchar zh1,zh2,zh3,zh4;
  359.   sdbuff1=addstart;
  360.   sdbuff2=addstart;
  361.   sdbuff3=addstart;
  362.   sdbuff4=addstart;
  363.      zh1=(sdbuff1>>24);//zh1=(sdbuff1>>24)&0x000000ff;  省掉这些为了使程序运行加快
  364.     zh2=(sdbuff2>>16);//&0x000000ff;
  365.       zh3=(sdbuff3>>8);//&0x000000ff;
  366.      zh4=sdbuff4;//&0x000000ff;
  367.    // uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原来这里是高地址字节在前地地址在后啊201012月14日逻辑扇区在253*512=0X0001fa00
  368.   

  369.       //CS=1;
  370.   // write(0xff);//据说是提高兼容性 ;;;;速度啊!提高
  371.    CS=0;//片选开
  372.    write1( 0x51);
  373.    write1( zh1);
  374.    write1( zh2);
  375.    write1( zh3);
  376.    write1( zh4);
  377.    write1( 0xff);
  378.    DATEOUT=1;
  379.    
  380. for(;;)
  381. {
  382.    fhz=read1();
  383.    if(fhz==0x00)break;


  384. }
  385. DATEOUT=1;
  386.    for(;;)
  387. {
  388.    fhz=read1();
  389.    if(fhz==0xfe)break;


  390. }
  391.   DATEOUT=1;
  392. n=0;
  393. for(j=512;j;j--)
  394. {   
  395.    tab[n]=read1();
  396.     n++;

  397. }
  398. fhz=read1();
  399. fhz=read1();
  400. CS=1;
  401. write1(0xff);




  402. }

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

  404. ///*************************************以下是MP3模块的程序
  405. void delay1ms(uint j)//延时100us
  406. {unsigned char i;
  407.    for(i=j;i;i--)
  408.    {
  409.   }
  410. }

  411. void spi_write_mp3(uchar h)//SPI写入一个字节,这里是最底层的数据发送!
  412. {
  413.   datmp3=h;

  414. /*SCLK=1;
  415. for(i=8;i;i--)
  416. {

  417.       SI=h&0x80;
  418.    h=h<<1;
  419.    SCK=0;
  420.    //delay1ms(1);  //这里不要加任何的延时!提高写入MP3模块的写入速度!
  421.       SCK=1;
  422.   // delay1ms(1);



  423. }*/
  424.            SI=datmp3_7;
  425.          //为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
  426.       SCK=0;   //从SD读取和MP3写数据流下手
  427.       SCK=1;
  428.      
  429.       SI=datmp3_6;
  430.    
  431.       SCK=0;
  432.       SCK=1;
  433.    
  434.       SI=datmp3_5;
  435.    
  436.       SCK=0;
  437.       SCK=1;
  438.    
  439.       SI=datmp3_4;
  440.    
  441.       SCK=0;
  442.       SCK=1;
  443.      
  444.       SI=datmp3_3;
  445.    
  446.       SCK=0;
  447.       SCK=1;
  448.      
  449.      SI=datmp3_2;
  450.    
  451.       SCK=0;
  452.       SCK=1;

  453.     SI=datmp3_1;
  454.    
  455.       SCK=0;
  456.       SCK=1;
  457.      
  458.     SI=datmp3_0;
  459.    
  460.       SCK=0;
  461.       SCK=1;
  462.       
  463.    
  464.       
  465.       
  466.       
  467.      


  468. }

  469. /*uchar spi_read_mp3()// SPI读取一个字节
  470. {
  471.     uchar i,read;
  472.    for(i=8;i;i--)
  473.    {
  474.     SCLK=1;
  475.        delay();
  476.        SCLK=0;
  477.     delay();
  478.        read=SO&0x80;
  479.        read=(read<<1);
  480.     }
  481.     SCLK=1;
  482.   return (read);
  483. }
  484. */
  485. void write_comd_mp3(uchar add,uint date)//写入控制命令add地址date是数据注意这里是16位的数据,内部做分开了处理
  486. {     
  487.     uchar h,l;
  488.     l=date;
  489.     h=(date>>8);
  490.         DREQ=1;
  491.        while(!DREQ); //检测MP3模块的忙状态
  492.   XCS=0;
  493.     spi_write_mp3(2); //表示写操作
  494.     spi_write_mp3(add);
  495.     spi_write_mp3(h);  //先写高8位
  496.     spi_write_mp3(l);
  497.     XCS=1;


  498. }
  499. void write_date_mp3(uchar dat)//写入音频数据信息这里还有一点是XDCS在此函数外拉低
  500. {
  501.    DREQ=1;
  502.        while(!DREQ);
  503.   spi_write_mp3(dat);

  504. }
  505. void init_mp3()  //初始化vs1003
  506. {
  507.   XRST=1;
  508.   delay1ms(100);
  509.   XRST=0;
  510.   delay1ms(100);
  511.   XRST=1;
  512.   delay1ms(100);
  513.     write_comd_mp3(0x00,0x0804);//模式设置
  514. write_comd_mp3(0x03,0x9800);//时钟控制
  515. write_comd_mp3(0x0b,250);//声音音量控制 00是最大的!!!!!
  516. XDCS=0;//数据片选
  517. spi_write_mp3(0);
  518. spi_write_mp3(0);
  519. spi_write_mp3(0);
  520. spi_write_mp3(0);
  521. XDCS=1;

  522. }
  523. void sing(uchar fhz)//正选测试
  524. {
  525.    
  526.   
  527.    write_comd_mp3(0x00,0x0820);
  528.    DREQ=1;
  529.        while(!DREQ);
  530.     XDCS=0;
  531.     write_date_mp3(0x53);
  532.     write_date_mp3(0xef);
  533.     write_date_mp3(0x6e);//正选测试开启
  534.     write_date_mp3(fhz); //频率选择
  535.     write_date_mp3(0);
  536.     write_date_mp3(0);
  537.        write_date_mp3(0);
  538.     write_date_mp3(0);
  539.      delay1ms(60000);
  540.     write_date_mp3(0x45);   //正选关段
  541.     write_date_mp3(0x78);
  542.     write_date_mp3(0x69);
  543.     write_date_mp3(0x74);
  544.     write_date_mp3(0);
  545.     write_date_mp3(0);
  546.        write_date_mp3(0);
  547.     write_date_mp3(0);
  548.      XDCS=1;





  549. }
  550. //以上是MP3程序
  551. void main() //主程序
  552. {

  553. unsigned long numb;
  554. uint  i;
  555. uchar sd_mp3_buff;
  556.   

  557. init_mp3();//初始化MP3
  558. ////////////////
  559. is_init=1;
  560. restsd();
  561. initsd();
  562. is_init=0;//提高始终频率
  563. ///////////////

  564.   


  565. sing(100);//正选测试

  566.       
  567.   while(1)
  568.   {  
  569.    
  570.      numb=4327936; //从4327936物理地址开始读歌曲!

  571.           XDCS=0;
  572.                       for(;;)
  573.                         {   
  574.                          readsd(numb);//读物理扇区
  575.                               for(i=0;i<512;i++)  //一个扇区的数据送入MP3中
  576.                                {
  577.       
  578.    
  579.    
  580.                                        sd_mp3_buff=tab[i];
  581.                                    write_date_mp3( sd_mp3_buff);
  582.    
  583.    

  584.                                  }
  585.              numb=(numb+512);
  586.   
  587.   
  588.   
  589.                        }


  590.   // XDCS=1;

  591.   }
  592.   

  593. }
复制代码



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

使用道具 举报

沙发
ID:83710 发表于 2015-6-23 16:44 | 只看该作者
可以到300K了:
  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. ///*************************************以下是MP3模块的程序

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

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


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


  63. /*SCLK=1;
  64. for(i=8;i;i--)
  65. {

  66.       SI=h&0x80;
  67.    h=h<<1;
  68.    SCK=0;
  69.    //delay1ms(1);  //这里不要加任何的延时!提高写入MP3模块的写入速度!
  70.       SCK=1;
  71.   // delay1ms(1);





  72. }*/

  73.            SI=datmp3_7;
  74.          //为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
  75.       SCK=0;   //从SD读取和MP3写数据流下手
  76.       SCK=1;
  77.    
  78.       SI=datmp3_6;
  79.    
  80.       SCK=0;
  81.       SCK=1;
  82.    

  83.       SI=datmp3_5;
  84.    
  85.       SCK=0;
  86.       SCK=1;
  87.    

  88.       SI=datmp3_4;
  89.    
  90.       SCK=0;
  91.       SCK=1;
  92.      

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

  98.      SI=datmp3_2;
  99.    
  100.       SCK=0;
  101.       SCK=1;


  102.     SI=datmp3_1;
  103.    
  104.       SCK=0;
  105.       SCK=1;
  106.      

  107.     SI=datmp3_0;
  108.    
  109.       SCK=0;
  110.       SCK=1;
  111.      
  112.    
  113.      
  114.      
  115.       
  116.      




  117. }


  118. /*uchar spi_read_mp3()// SPI读取一个字节
  119. {
  120.     uchar i,read;
  121.    for(i=8;i;i--)
  122.    {
  123.     SCLK=1;
  124.        delay();
  125.        SCLK=0;
  126.     delay();
  127.        read=SO&0x80;
  128.        read=(read<<1);

  129.     }
  130.     SCLK=1;

  131.   return (read);
  132. }
  133. */
  134. void write_comd_mp3(uchar add,uint date)//写入控制命令add地址date是数据注意这里是16位的数据,内部做分开了处理
  135. {     
  136.     uchar h,l;
  137.     l=date;
  138.     h=(date>>8);

  139.         DREQ=1;
  140.        while(!DREQ); //检测MP3模块的忙状态
  141.   XCS=0;
  142.     spi_write_mp3_1(2); //表示写操作
  143.     spi_write_mp3_1(add);
  144.     spi_write_mp3_1(h);  //先写高8位
  145.     spi_write_mp3_1(l);
  146.     XCS=1;




  147. }

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

  150.    DREQ=1;
  151.        while(!DREQ);
  152.   datmp3=dat;


  153.            SI=datmp3_7;
  154.          //为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
  155.       SCK=0;   //从SD读取和MP3写数据流下手
  156.       SCK=1;
  157.    
  158.       SI=datmp3_6;
  159.    
  160.       SCK=0;
  161.       SCK=1;
  162.    

  163.       SI=datmp3_5;
  164.    
  165.       SCK=0;
  166.       SCK=1;
  167.    

  168.       SI=datmp3_4;
  169.    
  170.       SCK=0;
  171.       SCK=1;
  172.      

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

  178.      SI=datmp3_2;
  179.    
  180.       SCK=0;
  181.       SCK=1;


  182.     SI=datmp3_1;
  183.    
  184.       SCK=0;
  185.       SCK=1;
  186.      

  187.     SI=datmp3_0;
  188.    
  189.       SCK=0;
  190.       SCK=1;
  191.      
  192.    
  193.      
  194.      
  195.       
  196.      




  197. }

  198. void init_mp3()  //初始化vs1003
  199. {
  200.   XRST=1;
  201.   delay1ms(100);
  202.   XRST=0;
  203.   delay1ms(100);
  204.   XRST=1;
  205.   delay1ms(100);

  206.     write_comd_mp3(0x00,0x0804);//模式设置
  207. write_comd_mp3(0x03,0x9800);//时钟控制
  208. write_comd_mp3(0x0b,250);//声音音量控制 00是最大的!!!!!

  209. XDCS=0;//数据片选
  210. spi_write_mp3_1(0);
  211. spi_write_mp3_1(0);
  212. spi_write_mp3_1(0);
  213. spi_write_mp3_1(0);
  214. XDCS=1;


  215. }

  216. void sing(uchar fhz)//正选测试
  217. {
  218.   
  219.   
  220.    write_comd_mp3(0x00,0x0820);
  221.    DREQ=1;
  222.        while(!DREQ);
  223.     XDCS=0;
  224.     write_date_mp3(0x53);
  225.     write_date_mp3(0xef);
  226.     write_date_mp3(0x6e);//正选测试开启
  227.     write_date_mp3(fhz); //频率选择

  228.     write_date_mp3(0);
  229.     write_date_mp3(0);
  230.        write_date_mp3(0);
  231.     write_date_mp3(0);
  232.      delay1ms(60000);
  233.     write_date_mp3(0x45);   //正选关段
  234.     write_date_mp3(0x78);
  235.     write_date_mp3(0x69);
  236.     write_date_mp3(0x74);

  237.     write_date_mp3(0);
  238.     write_date_mp3(0);
  239.        write_date_mp3(0);
  240.     write_date_mp3(0);
  241.      XDCS=1;











  242. }

  243. //以上是MP3程序
  244. //*//**********************************************
  245. /*读sd卡子程序,无返回值,有参函数,参数为要写入DATEIN数据线的字节*/
  246. void write(unsigned char wr_)// 写入一个字节SD卡
  247. {
  248.            dat=wr_;
  249.         DATEIN=dat_7;
  250.    
  251.       SCLK=0;
  252.    if(is_init)delay(200);
  253.     //if(!is_init)delay(1);
  254.       SCLK=1;
  255.       if(is_init) delay(200);
  256.       // if(!is_init)delay(1);
  257.   
  258.       DATEIN=dat_6;
  259.    
  260.       SCLK=0;
  261.      //if(!is_init)delay(1);
  262.     if(is_init)delay(200);
  263.       SCLK=1;
  264.       if(is_init) delay(200);
  265.     // if(!is_init)delay(1);

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

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

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

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

  298.     DATEIN=dat_1;
  299.    
  300.       SCLK=0;
  301.     if(is_init)delay(200);
  302.     // if(!is_init)delay(1);
  303.       SCLK=1;
  304.       if(is_init) delay(200);
  305.     // if(!is_init)delay(1);

  306.     DATEIN=dat_0;
  307.    
  308.       SCLK=0;
  309.     if(is_init)delay(200);
  310.       //if(!is_init)delay(1);
  311.       SCLK=1;
  312.       if(is_init) delay(200);
  313.      //if(!is_init)delay(1);
  314. }
  315. unsigned char read()// 读取一个字节SD卡
  316. {
  317.           DATEOUT=1;
  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_7=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_6=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_5=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_4=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_3=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_2=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_1=DATEOUT;


  367.      SCLK=1;
  368.    if(is_init)delay(200);
  369.         // if(!is_init)delay(1);
  370.    SCLK=0;
  371.     if(is_init)delay(200);
  372.          // if(!is_init)delay(1);
  373.     dat_0=DATEOUT;


  374.    return (dat);

  375. }
  376. //****************************
  377. void write1(unsigned char wr_)// 写入一个字节SD卡
  378. {
  379.            dat=wr_;
  380.         DATEIN=dat_7;
  381.    
  382.       SCLK=0;
  383.   
  384.   
  385.       SCLK=1;
  386.    
  387.    
  388.   
  389.       DATEIN=dat_6;
  390.    
  391.       SCLK=0;
  392.    
  393.    
  394.       SCLK=1;
  395.    
  396.    

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

  404.       DATEIN=dat_4;
  405.    
  406.       SCLK=0;
  407.    
  408.   
  409.       SCLK=1;
  410.    
  411.   

  412.      DATEIN=dat_3;
  413.    
  414.       SCLK=0;
  415.   
  416.       SCLK=1;
  417.   


  418.      DATEIN=dat_2;
  419.    
  420.       SCLK=0;
  421.    
  422.   
  423.       SCLK=1;
  424.   
  425.    

  426.     DATEIN=dat_1;
  427.    
  428.       SCLK=0;
  429.   
  430.       SCLK=1;
  431.   

  432.     DATEIN=dat_0;
  433.    
  434.       SCLK=0;
  435.    
  436.       SCLK=1;
  437.    
  438.   
  439. }
  440. unsigned char read1()// 读取一个字节SD卡
  441. {
  442.           DATEOUT=1;
  443.          SCLK=1;
  444.      //if(!is_init)delay(1);
  445.    SCLK=0;
  446.    //if(!is_init)delay(1);
  447.     dat_7=DATEOUT;

  448.      SCLK=1;

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

  451.      //if(!is_init)delay(1);
  452.     dat_6=DATEOUT;

  453.     SCLK=1;

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

  456.    // if(!is_init)delay(1);
  457.     dat_5=DATEOUT;

  458.     SCLK=1;

  459.     // if(!is_init)delay(1);
  460.    SCLK=0;

  461.   // if(!is_init)delay(1);
  462.     dat_4=DATEOUT;

  463.      SCLK=1;

  464.    // if(!is_init)delay(1);
  465.    SCLK=0;

  466.     // if(!is_init)delay(1);
  467.     dat_3=DATEOUT;

  468.     SCLK=1;

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

  474.      SCLK=1;

  475.        // if(!is_init)delay(1);
  476.    SCLK=0;
  477.   
  478.      //  if(!is_init)delay(1);
  479.     dat_1=DATEOUT;


  480.      SCLK=1;

  481.         // if(!is_init)delay(1);
  482.    SCLK=0;

  483.          // if(!is_init)delay(1);
  484.     dat_0=DATEOUT;


  485.    return (dat);

  486. }
  487. //******************************8

  488. void restsd()//复位SD卡
  489. {  uchar i;
  490. uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
  491. is_init=1;

  492. CS=1;
  493. for(i=0;i<15;i++)
  494. {
  495.        //120时钟
  496.    write(0xff);
  497. }


  498.   
  499.   
  500.       CS=1;
  501.    write(0xff);//据说是提高兼容性
  502.    CS=0;//片选开

  503.    write( pcmd[0]);
  504.    write( pcmd[1]);
  505.    write( pcmd[2]);
  506.    write( pcmd[3]);
  507.    write( pcmd[4]);
  508.    write( pcmd[5]);

  509.    fhz=read();
  510. for(;;)
  511. {
  512.    fhz=read();
  513.    if(fhz==0x01)break;


  514. }

  515.   
  516.   CS=1;
  517.   write(0xff);

  518. }




  519. void initsd()//初始化
  520. {
  521. //
  522.    uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
  523. //

  524.       CS=1;
  525.    write(0xff);//据说是提高兼容性
  526.    CS=0;//片选开

  527.    write( pcmd[0]);
  528.    write( pcmd[1]);
  529.    write( pcmd[2]);
  530.    write( pcmd[3]);
  531.    write( pcmd[4]);
  532.    write( pcmd[5]);

  533.   
  534.    fhz=read();
  535. for(;;)
  536. {
  537.    fhz=read();
  538.    if(fhz==0x00)break;


  539. }

  540.   
  541.   CS=1;
  542.   write(0xff);








  543. }

  544. /*void readsd(unsigned long addstart)//读SD卡物理扇区
  545.    
  546. {  unsigned long sdbuff2;  
  547.      uint j,n;
  548.   uchar sd_mp3_buff;
  549.      uchar zh2,zh3,zh4;
  550.   sdbuff2=addstart;

  551.   zh4=addstart;
  552.     zh2=(sdbuff2>>16);   //把以前的代码大部分省略,为了速度!1!!!
  553.       zh3=(addstart>>8);
  554.    
  555.    // uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原来这里是高地址字节在前地地址在后啊201012月14日逻辑扇区在253*512=0X0001fa00



  556.       //CS=1;
  557.   // write(0xff);//据说是提高兼容性 ;;;;速度啊!提高
  558.    CS=0;//片选开

  559.    write1( 0x51);
  560.    write1( 0x00);//这里是2G以下可以为00
  561.    write1( zh2);
  562.    write1( zh3);
  563.    write1( zh4);
  564.    write1( 0xff);
  565.    DATEOUT=1;
  566.   
  567. for(;;)
  568. {
  569.    fhz=read1();
  570.    if(fhz==0x00)break;


  571. }
  572. DATEOUT=1;

  573.    for(;;)
  574. {
  575.    fhz=read1();
  576.    if(fhz==0xfe)break;


  577. }

  578.   DATEOUT=1;
  579. n=0;
  580. for(j=512;j;j--)
  581. {  
  582.   // tab[n]=read1();
  583.    // n++;
  584.     //sd_mp3_buff=tab[i];
  585. sd_mp3_buff=read1();
  586. write_date_mp3( sd_mp3_buff);



  587. }
  588. fhz=read1();
  589. fhz=read1();
  590. CS=1;
  591. write1(0xff);








  592. } */


  593. ////***************************************以上是SD主程序
  594. void main() //主程序
  595. {

  596. uchar *p;
  597. static unsigned long  numb;
  598. uint j,n;
  599. //uchar sd_mp3_buff;
  600. uchar zh2,zh3,zh4;
  601. //uint  i;

  602.   


  603. init_mp3();//初始化MP3
  604. ////////////////
  605. is_init=1;
  606. restsd();
  607. initsd();
  608. is_init=0;//提高始终频率
  609. ///////////////




  610. sing(100);//正选测试

  611.       
  612.   while(1)
  613.   {
  614.    
  615.      numb=4327936; //从4327936物理地址开始读歌曲!
  616.   
  617.         //这里的指针操作比移位操作快多了!!!!
  618.           XDCS=0;
  619.                       for(;;)
  620.                         {
  621.       
  622.        p=&numb; //取出存放Numb的地址的最高位!详细请看汇编!!
  623.        p++;  //由于最高位不用所以这里舍去小于2G
  624.        zh2=*p;//从高到底的地第二字节  、、
  625.        p++;
  626.        zh3=*p; //从高到底的地第三字节
  627.         p++;
  628.        zh4=*p; //从高到底的地第四字节
  629.                    //readsd(numb);//读物理扇区
  630.         //**************
  631.        //sdbuff2=numb;

  632. /*zh4=numb;
  633. zh3=(numb>>8);
  634. zh2=(numb>>16);   //把以前的代码大部分省略,为了速度!1!!!
  635. */   
  636.    
  637.    // uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原来这里是高地址字节在前地地址在后啊201012月14日逻辑扇区在253*512=0X0001fa00



  638.       //CS=1;
  639.   // write(0xff);//据说是提高兼容性 ;;;;速度啊!提高
  640.    CS=0;//片选开

  641.   // write1( 0x51);    //fhz=read1(); 以下是写SD卡物理扇区地址
  642.    dat=0x51;
  643.         DATEIN=dat_7;
  644.    
  645.       SCLK=0;
  646.   
  647.   
  648.       SCLK=1;
  649.    
  650.    
  651.   
  652.       DATEIN=dat_6;
  653.    
  654.       SCLK=0;
  655.    
  656.    
  657.       SCLK=1;
  658.    
  659.    

  660.       DATEIN=dat_5;
  661.    
  662.       SCLK=0;
  663.    
  664.       SCLK=1;
  665.    
  666.   

  667.       DATEIN=dat_4;
  668.    
  669.       SCLK=0;
  670.    
  671.   
  672.       SCLK=1;
  673.    
  674.   

  675.      DATEIN=dat_3;
  676.    
  677.       SCLK=0;
  678.   
  679.       SCLK=1;
  680.   


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

  689.     DATEIN=dat_1;
  690.    
  691.       SCLK=0;
  692.   
  693.       SCLK=1;
  694.   

  695.     DATEIN=dat_0;
  696.    
  697.       SCLK=0;
  698.    
  699.       SCLK=1;       //fhz=read1(); 以上是写SD卡
  700.    //write1( 0x00);//这里是2G以下可以为00   //fhz=read1(); 以下是写SD卡
  701.   dat=0x00;
  702.         DATEIN=dat_7;
  703.    
  704.       SCLK=0;
  705.   
  706.   
  707.       SCLK=1;
  708.    
  709.    
  710.   
  711.       DATEIN=dat_6;
  712.    
  713.       SCLK=0;
  714.    
  715.    
  716.       SCLK=1;
  717.    
  718.    

  719.       DATEIN=dat_5;
  720.    
  721.       SCLK=0;
  722.    
  723.       SCLK=1;
  724.    
  725.   

  726.       DATEIN=dat_4;
  727.    
  728.       SCLK=0;
  729.    
  730.   
  731.       SCLK=1;
  732.    
  733.   

  734.      DATEIN=dat_3;
  735.    
  736.       SCLK=0;
  737.   
  738.       SCLK=1;
  739.   


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

  748.     DATEIN=dat_1;
  749.    
  750.       SCLK=0;
  751.   
  752.       SCLK=1;
  753.   

  754.     DATEIN=dat_0;
  755.    
  756.       SCLK=0;
  757.    
  758.       SCLK=1;     //fhz=read1(); 以上是写SD卡
  759.    //write1( zh2);    //fhz=read1(); 以下是写SD卡
  760.     dat=zh2;
  761.         DATEIN=dat_7;
  762.    
  763.       SCLK=0;
  764.   
  765.   
  766.       SCLK=1;
  767.    
  768.    
  769.   
  770.       DATEIN=dat_6;
  771.    
  772.       SCLK=0;
  773.    
  774.    
  775.       SCLK=1;
  776.    
  777.    

  778.       DATEIN=dat_5;
  779.    
  780.       SCLK=0;
  781.    
  782.       SCLK=1;
  783.    
  784.   

  785.       DATEIN=dat_4;
  786.    
  787.       SCLK=0;
  788.    
  789.   
  790.       SCLK=1;
  791.    
  792.   

  793.      DATEIN=dat_3;
  794.    
  795.       SCLK=0;
  796.   
  797.       SCLK=1;
  798.   


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

  807.     DATEIN=dat_1;
  808.    
  809.       SCLK=0;
  810.   
  811.       SCLK=1;
  812.   

  813.     DATEIN=dat_0;
  814.    
  815.       SCLK=0;
  816.    
  817.       SCLK=1;   //fhz=read1(); 以上是写SD卡
  818.   // write1( zh3);    //fhz=read1(); 以下是写SD卡
  819.   dat=zh3;
  820.         DATEIN=dat_7;
  821.    
  822.       SCLK=0;
  823.   
  824.   
  825.       SCLK=1;
  826.    
  827.    
  828.   
  829.       DATEIN=dat_6;
  830.    
  831.       SCLK=0;
  832.    
  833.    
  834.       SCLK=1;
  835.    
  836.    

  837.       DATEIN=dat_5;
  838.    
  839.       SCLK=0;
  840.    
  841.       SCLK=1;
  842.    
  843.   

  844.       DATEIN=dat_4;
  845.    
  846.       SCLK=0;
  847.    
  848.   
  849.       SCLK=1;
  850.    
  851.   

  852.      DATEIN=dat_3;
  853.    
  854.       SCLK=0;
  855.   
  856.       SCLK=1;
  857.   


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

  866.     DATEIN=dat_1;
  867.    
  868.       SCLK=0;
  869.   
  870.       SCLK=1;
  871.   

  872.     DATEIN=dat_0;
  873.    
  874.       SCLK=0;
  875.    
  876.       SCLK=1;     //fhz=read1(); 以上是写SD卡
  877.    //write1( zh4);    //fhz=read1(); 以下是写SD卡
  878.    dat=zh4;
  879.         DATEIN=dat_7;
  880.    
  881.       SCLK=0;
  882.   
  883.   
  884.       SCLK=1;
  885.    
  886.    
  887.   
  888.       DATEIN=dat_6;
  889.    
  890.       SCLK=0;
  891.    
  892.    
  893.       SCLK=1;
  894.    
  895.    

  896.       DATEIN=dat_5;
  897.    
  898.       SCLK=0;
  899.    
  900.       SCLK=1;
  901.    
  902.   

  903.       DATEIN=dat_4;
  904.    
  905.       SCLK=0;
  906.    
  907.   
  908.       SCLK=1;
  909.    
  910.   

  911.      DATEIN=dat_3;
  912.    
  913.       SCLK=0;
  914.   
  915.       SCLK=1;
  916.   


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

  925.     DATEIN=dat_1;
  926.    
  927.       SCLK=0;
  928.   
  929.       SCLK=1;
  930.   

  931.     DATEIN=dat_0;
  932.    
  933.       SCLK=0;
  934.    
  935.       SCLK=1;    //fhz=read1(); 以上是写SD卡
  936.   // write1( 0xff);    //fhz=read1(); 以下是写SD卡
  937.   dat=0xff;
  938.         DATEIN=dat_7;
  939.    
  940.       SCLK=0;
  941.   
  942.   
  943.       SCLK=1;
  944.    
  945.    
  946.   
  947.       DATEIN=dat_6;
  948.    
  949.       SCLK=0;
  950.    
  951.    
  952.       SCLK=1;
  953.    
  954.    

  955.       DATEIN=dat_5;
  956.    
  957.       SCLK=0;
  958.    
  959.       SCLK=1;
  960.    
  961.   

  962.       DATEIN=dat_4;
  963.    
  964.       SCLK=0;
  965.    
  966.   
  967.       SCLK=1;
  968.    
  969.   

  970.      DATEIN=dat_3;
  971.    
  972.       SCLK=0;
  973.   
  974.       SCLK=1;
  975.   


  976.      DATEIN=dat_2;
  977.    
  978.       SCLK=0;
  979.    
  980.   
  981.       SCLK=1;
  982.   
  983.    

  984.     DATEIN=dat_1;
  985.    
  986.       SCLK=0;
  987.   
  988.       SCLK=1;
  989.   

  990.     DATEIN=dat_0;
  991.    
  992.       SCLK=0;
  993.    
  994.       SCLK=1;
  995.    DATEOUT=1;     // 以上是写SD卡
  996.   
  997. for(;;)
  998. {
  999.         //fhz=read1(); 以下是读SD卡
  1000.    DATEOUT=1;
  1001.          SCLK=1;
  1002.      //if(!is_init)delay(1);
  1003.    SCLK=0;
  1004.    //if(!is_init)delay(1);
  1005.     dat_7=DATEOUT;

  1006.      SCLK=1;

  1007.    //if(!is_init)delay(1);
  1008.    SCLK=0;

  1009.      //if(!is_init)delay(1);
  1010.     dat_6=DATEOUT;

  1011.     SCLK=1;

  1012.    // if(!is_init)delay(1);
  1013.    SCLK=0;

  1014.    // if(!is_init)delay(1);
  1015.     dat_5=DATEOUT;

  1016.     SCLK=1;

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

  1019.   // if(!is_init)delay(1);
  1020.     dat_4=DATEOUT;

  1021.      SCLK=1;

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

  1024.     // if(!is_init)delay(1);
  1025.     dat_3=DATEOUT;

  1026.     SCLK=1;

  1027.       // if(!is_init)delay(1);
  1028.    SCLK=0;
  1029.   
  1030.       // if(!is_init)delay(1);
  1031.     dat_2=DATEOUT;

  1032.      SCLK=1;

  1033.        // if(!is_init)delay(1);
  1034.    SCLK=0;
  1035.   
  1036.      //  if(!is_init)delay(1);
  1037.     dat_1=DATEOUT;


  1038.      SCLK=1;

  1039.         // if(!is_init)delay(1);
  1040.    SCLK=0;

  1041.          // if(!is_init)delay(1);
  1042.     dat_0=DATEOUT;

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

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


  1045. }
  1046. DATEOUT=1;

  1047.    for(;;)
  1048. {
  1049.   // fhz=read1();    以下是读SD卡
  1050.   DATEOUT=1;
  1051.          SCLK=1;
  1052.      //if(!is_init)delay(1);
  1053.    SCLK=0;
  1054.    //if(!is_init)delay(1);
  1055.     dat_7=DATEOUT;

  1056.      SCLK=1;

  1057.    //if(!is_init)delay(1);
  1058.    SCLK=0;

  1059.      //if(!is_init)delay(1);
  1060.     dat_6=DATEOUT;

  1061.     SCLK=1;

  1062.    // if(!is_init)delay(1);
  1063.    SCLK=0;

  1064.    // if(!is_init)delay(1);
  1065.     dat_5=DATEOUT;

  1066.     SCLK=1;

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

  1069.   // if(!is_init)delay(1);
  1070.     dat_4=DATEOUT;

  1071.      SCLK=1;

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

  1074.     // if(!is_init)delay(1);
  1075.     dat_3=DATEOUT;

  1076.     SCLK=1;

  1077.       // if(!is_init)delay(1);
  1078.    SCLK=0;
  1079.   
  1080.       // if(!is_init)delay(1);
  1081.     dat_2=DATEOUT;

  1082.      SCLK=1;

  1083.        // if(!is_init)delay(1);
  1084.    SCLK=0;
  1085.   
  1086.      //  if(!is_init)delay(1);
  1087.     dat_1=DATEOUT;


  1088.      SCLK=1;

  1089.         // if(!is_init)delay(1);
  1090.    SCLK=0;

  1091.          // if(!is_init)delay(1);
  1092.     dat_0=DATEOUT;

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


  1095. }

  1096.   DATEOUT=1;
  1097. n=0;     
  1098. for(j=512;j;j--)
  1099. {  
  1100.         DATEOUT=1;     //fhz=read1(); 以下是读SD卡
  1101.          SCLK=1;
  1102.      //if(!is_init)delay(1);
  1103.    SCLK=0;
  1104.    //if(!is_init)delay(1);
  1105.     dat_7=DATEOUT;

  1106.      SCLK=1;

  1107.    //if(!is_init)delay(1);
  1108.    SCLK=0;

  1109.      //if(!is_init)delay(1);
  1110.     dat_6=DATEOUT;

  1111.     SCLK=1;

  1112.    // if(!is_init)delay(1);
  1113.    SCLK=0;

  1114.    // if(!is_init)delay(1);
  1115.     dat_5=DATEOUT;

  1116.     SCLK=1;

  1117.     // if(!is_init)delay(1);
  1118.    SCLK=0;

  1119.   // if(!is_init)delay(1);
  1120.     dat_4=DATEOUT;

  1121.      SCLK=1;

  1122.    // if(!is_init)delay(1);
  1123.    SCLK=0;

  1124.     // if(!is_init)delay(1);
  1125.     dat_3=DATEOUT;

  1126.     SCLK=1;

  1127.       // if(!is_init)delay(1);
  1128.    SCLK=0;
  1129.   
  1130.       // if(!is_init)delay(1);
  1131.     dat_2=DATEOUT;

  1132.      SCLK=1;

  1133.        // if(!is_init)delay(1);
  1134.    SCLK=0;
  1135.   
  1136.      //  if(!is_init)delay(1);
  1137.     dat_1=DATEOUT;


  1138.      SCLK=1;

  1139.         // if(!is_init)delay(1);
  1140.    SCLK=0;

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

  1143.       datmp3=dat;    //fhz=read1(); 以下是写mp3bit流
  1144.          DREQ=1;
  1145.          while(!DREQ);



  1146.            SI=datmp3_7;
  1147.          //为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
  1148.       SCK=0;   //从SD读取和MP3写数据流下手
  1149.       SCK=1;
  1150.    
  1151.       SI=datmp3_6;
  1152.    
  1153.       SCK=0;
  1154.       SCK=1;
  1155.    

  1156.       SI=datmp3_5;
  1157.    
  1158.       SCK=0;
  1159.       SCK=1;
  1160.    

  1161.       SI=datmp3_4;
  1162.    
  1163.       SCK=0;
  1164.       SCK=1;
  1165.      

  1166.       SI=datmp3_3;
  1167.    
  1168.       SCK=0;
  1169.       SCK=1;
  1170.      

  1171.      SI=datmp3_2;
  1172.    
  1173.       SCK=0;
  1174.       SCK=1;


  1175.     SI=datmp3_1;
  1176.    
  1177.       SCK=0;
  1178.       SCK=1;
  1179.      

  1180.     SI=datmp3_0;
  1181.    
  1182.       SCK=0;
  1183.       SCK=1;
  1184.      
  1185.    
  1186.      
  1187.      
  1188.       
  1189.      




  1190.              //以上是写mp3bit流
  1191. }

  1192. //**********************以下是读CRC*****
  1193.            DATEOUT=1;
  1194.             SCLK=1;
  1195.      SCLK=0;
  1196.     dat_7=DATEOUT;

  1197.      SCLK=1;

  1198.    SCLK=0;

  1199.     dat_6=DATEOUT;

  1200.     SCLK=1;

  1201.    SCLK=0;

  1202.     dat_5=DATEOUT;

  1203.     SCLK=1;

  1204.    SCLK=0;

  1205.     dat_4=DATEOUT;

  1206.      SCLK=1;
  1207.    SCLK=0;

  1208.     dat_3=DATEOUT;

  1209.     SCLK=1;

  1210.    SCLK=0;
  1211.     dat_2=DATEOUT;

  1212.      SCLK=1;

  1213.    SCLK=0;
  1214.   
  1215.     dat_1=DATEOUT;


  1216.      SCLK=1;
  1217.    SCLK=0;
  1218.     dat_0=DATEOUT;

  1219. DATEOUT=1;
  1220.          SCLK=1;
  1221.    SCLK=0;
  1222.     dat_7=DATEOUT;

  1223.      SCLK=1;
  1224.    SCLK=0;
  1225.     dat_6=DATEOUT;
  1226.     SCLK=1;
  1227.    SCLK=0;

  1228.     dat_5=DATEOUT;
  1229.     SCLK=1;
  1230.    SCLK=0;

  1231.     dat_4=DATEOUT;
  1232.      SCLK=1;
  1233.    SCLK=0;

  1234.     dat_3=DATEOUT;
  1235.     SCLK=1;
  1236.    SCLK=0;
  1237.   

  1238.     dat_2=DATEOUT;
  1239.         SCLK=1;
  1240.      SCLK=0;
  1241.     dat_1=DATEOUT;
  1242.        SCLK=1;
  1243.     SCLK=0;
  1244.     dat_0=DATEOUT;

  1245.                 CS=1;
  1246.              dat=0xff;

  1247.         DATEIN=dat_7;
  1248.       SCLK=0;
  1249.       SCLK=1;
  1250.    
  1251.       DATEIN=dat_6;
  1252.       SCLK=0;
  1253.       SCLK=1;
  1254.    
  1255.       DATEIN=dat_5;
  1256.       SCLK=0;
  1257.       SCLK=1;
  1258.   
  1259.       DATEIN=dat_4;
  1260.       SCLK=0;
  1261.       SCLK=1;
  1262.   
  1263.       DATEIN=dat_3;
  1264.       SCLK=0;
  1265.       SCLK=1;
  1266.   
  1267.       DATEIN=dat_2;
  1268.       SCLK=0;
  1269.       SCLK=1;

  1270.       DATEIN=dat_1;
  1271.       SCLK=0;
  1272.       SCLK=1;
  1273.   
  1274.           DATEIN=dat_0;
  1275.       SCLK=0;
  1276.       SCLK=1;
  1277. //**********************以上是读CRC*****
  1278.           //**************

  1279.                         

  1280.              numb=(numb+0x200);



  1281.                        }




  1282.   // XDCS=1;



  1283.   }

  1284.   


  1285. }
复制代码
回复

使用道具 举报

板凳
ID:83527 发表于 2015-6-24 09:08 | 只看该作者
太牛了,真佩服你,我也是单片机爱好者
回复

使用道具 举报

地板
ID:73848 发表于 2015-6-29 22:23 来自手机 | 只看该作者
自己做MP3吗?程序好长
回复

使用道具 举报

5#
ID:84238 发表于 2015-6-30 09:50 | 只看该作者
如能將資料打包分享  這樣更好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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