找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10032|回复: 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 单片机教程网

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