本帖最后由 hongniu 于 2015-6-23 16:48 编辑
MP3从今天下午开时做,到5点数据调整完毕,完整的播放一首《第一次爱的人》音质可以和我的P4媲美!那叫一个爽啊!现在我才知道SD卡的牛逼!只有玩过的人才会说:原来是这样!看程序!/*真是爽啊!今天下午我没去上班!把MP3搞定了!昨天搞定TFT9325 TFT液晶!现在播放那!!!!12月24日!!!!!用永生难忘!!!!!!*/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit p1_7=P1^7;
- sbit CS=P2^0; //片选信号(低电平有效)
- sbit DATEIN =P2^1;//主-从数据输入
- sbit SCLK=P2^2;//时钟信号
- sbit DATEOUT=P2^3;//从-主数据输出
- uint btime;
- uchar c;
- sbit led4=P1^0;
- sbit led3=P1^1; //第一个自己编写的c程序,付出了太多,才换回这几行代码,源于热爱!2010年8月8日与天津开发区
- sbit led2=P1^2;
- sbit led1=P1^3;
- uchar g=0,s=0,bw=0,q=0; //显示单元 个位、十位、百位、千位
- uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//不带小数点显示0~9
- unsigned char bdata dat;
- sbit dat_0=dat^0;
- sbit dat_1=dat^1;
- sbit dat_2=dat^2;
- sbit dat_3=dat^3;
- sbit dat_4=dat^4;
- sbit dat_5=dat^5;
- sbit dat_6=dat^6;
- sbit dat_7=dat^7;
- bit is_init;//决定是否延时;
- uchar lpp;
- unsigned char fhz;//返回值
- uchar fhz_buff; //读返回值中间量
- unsigned char xdata tab[512];
- ///*******************以上是SD卡
- /*
- VS1003mp3模块的接口定义
- */
- sbit XRST=P1^0;//复位
- sbit DREQ=P1^1; //数据请求
- sbit XDCS=P1^2; //数据片选
- sbit XCS=P1^3; //命令片选
- /*
- /* VS1003mp3SPI通信接口定义
- */
- sbit SCK=P1^4; //时钟
- sbit SI=P1^5; //串行输入
- sbit SO=P1^6; //串行输出
-
-
-
-
- void delay(uint time)
- { while(time)
- time--;
- }
- //**********************************************
- /*读sd卡子程序,无返回值,有参函数,参数为要写入DATEIN数据线的字节*/
- void write(unsigned char wr_)// 写入一个字节SD卡
- {
- dat=wr_;
- DATEIN=dat_7;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
-
- DATEIN=dat_6;
-
- SCLK=0;
- if(!is_init)delay(2);
- if(is_init)delay(200);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_5;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_4;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_3;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_2;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_1;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- DATEIN=dat_0;
-
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=1;
- if(is_init) delay(200);
- if(!is_init)delay(2);
- }
- unsigned char read()// 读取一个字节SD卡
- {
- DATEOUT=1;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_7=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_6=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_5=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_4=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_3=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_2=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_1=DATEOUT;
- SCLK=1;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- SCLK=0;
- if(is_init)delay(200);
- if(!is_init)delay(2);
- dat_0=DATEOUT;
- return (dat);
- }
- void restsd()//复位SD卡
- { uchar i;
- uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
- is_init=1;
-
- CS=1;
- for(i=0;i<15;i++)
- {
- //120时钟
- write(0xff);
- }
-
-
- CS=1;
- write(0xff);//据说是提高兼容性
- CS=0;//片选开
- write( pcmd[0]);
- write( pcmd[1]);
- write( pcmd[2]);
- write( pcmd[3]);
- write( pcmd[4]);
- write( pcmd[5]);
- fhz=read();
- for(;;)
- {
- fhz=read();
- if(fhz==0x01)break;
-
-
- }
-
- CS=1;
- write(0xff);
- }
-
- void initsd()//初始化
- {
- //
- uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
- //
-
- CS=1;
- write(0xff);//据说是提高兼容性
- CS=0;//片选开
- write( pcmd[0]);
- write( pcmd[1]);
- write( pcmd[2]);
- write( pcmd[3]);
- write( pcmd[4]);
- write( pcmd[5]);
-
-
- fhz=read();
- for(;;)
- {
- fhz=read();
- if(fhz==0x00)break;
-
-
- }
-
- CS=1;
- write(0xff);
-
-
-
- }
- void readsd(unsigned long addstart)//读SD卡物理扇区
-
- { unsigned long sdbuff1,sdbuff2,sdbuff3,sdbuff4;
- uint j,n;
- uchar zh1,zh2,zh3,zh4;
- sdbuff1=addstart;
- sdbuff2=addstart;
- sdbuff3=addstart;
- sdbuff4=addstart;
- zh1=(sdbuff1>>24)&0x000000ff;
- zh2=(sdbuff2>>16)&0x000000ff;
- zh3=(sdbuff3>>8)&0x000000ff;
- zh4=sdbuff4&0x000000ff;
- // uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原来这里是高地址字节在前地地址在后啊201012月14日逻辑扇区在253*512=0X0001fa00
-
-
- CS=1;
- write(0xff);//据说是提高兼容性
- CS=0;//片选开
- write( 0x51);
- write( zh1);
- write( zh2);
- write( zh3);
- write( zh4);
- write( 0xff);
- DATEOUT=1;
-
- for(;;)
- {
- fhz=read();
- if(fhz==0x00)break;
-
-
- }
- DATEOUT=1;
- for(;;)
- {
- fhz=read();
- if(fhz==0xfe)break;
-
-
- }
- DATEOUT=1;
- n=0;
- for(j=512;j;j--)
- {
- tab[n]=read();
- n++;
-
- }
- fhz=read();
- fhz=read();
- CS=1;
- write(0xff);
-
-
-
- }
- ////***************************************以上是SD主程序
- ///*************************************以下是MP3模块的程序
- void delay1ms(uint j)//延时100us
- {unsigned char i;
- for(i=j;i;i--)
- {
-
-
- }
- }
-
- void spi_write_mp3(uchar h)//SPI写入一个字节,这里是最底层的数据发送!
- {
- uchar i;
- SCLK=1;
- for(i=8;i;i--)
- {
-
- SI=h&0x80;
- h=h<<1;
- SCK=0;
- //delay1ms(1); //这里不要加任何的延时!提高写入MP3模块的写入速度!
- SCK=1;
- // delay1ms(1);
-
- }
-
-
- }
-
- /*uchar spi_read_mp3()// SPI读取一个字节
- {
- uchar i,read;
- for(i=8;i;i--)
- {
- SCLK=1;
- delay();
- SCLK=0;
- delay();
- read=SO&0x80;
- read=(read<<1);
- }
- SCLK=1;
- return (read);
- }
- */
- void write_comd_mp3(uchar add,uint date)//写入控制命令add地址date是数据注意这里是16位的数据,内部做分开了处理
- {
- uchar h,l;
- l=date;
- h=(date>>8);
- DREQ=1;
- while(!DREQ); //检测MP3模块的忙状态
- XCS=0;
- spi_write_mp3(2); //表示写操作
- spi_write_mp3(add);
- spi_write_mp3(h); //先写高8位
- spi_write_mp3(l);
- XCS=1;
-
- }
- void write_date_mp3(uchar dat)//写入音频数据信息这里还有一点是XDCS在此函数外拉低
- {
- DREQ=1;
- while(!DREQ);
- spi_write_mp3(dat);
-
- }
- void init_mp3() //初始化vs1003
- {
- XRST=1;
- delay1ms(100);
- XRST=0;
- delay1ms(100);
- XRST=1;
- delay1ms(100);
- write_comd_mp3(0x00,0x0804);//模式设置
- write_comd_mp3(0x03,0x9800);//时钟控制
- write_comd_mp3(0x0b,0x0000);//声音控制 00是最大的!!!!!
- XDCS=0;//数据片选
- spi_write_mp3(0);
- spi_write_mp3(0);
- spi_write_mp3(0);
- spi_write_mp3(0);
- XDCS=1;
- }
- void sing(uchar fhz)//正选测试
- {
-
-
- write_comd_mp3(0x00,0x0820);
- DREQ=1;
- while(!DREQ);
- XDCS=0;
- write_date_mp3(0x53);
- write_date_mp3(0xef);
- write_date_mp3(0x6e);//正选测试开启
- write_date_mp3(fhz); //频率选择
- write_date_mp3(0);
- write_date_mp3(0);
- write_date_mp3(0);
- write_date_mp3(0);
- delay1ms(60000);
- write_date_mp3(0x45); //正选关段
- write_date_mp3(0x78);
- write_date_mp3(0x69);
- write_date_mp3(0x74);
- write_date_mp3(0);
- write_date_mp3(0);
- write_date_mp3(0);
- write_date_mp3(0);
- XDCS=1;
-
-
-
-
-
- }
- //以上是MP3程序
- void main()
- { unsigned long numb,k;
- uint i;
- uchar sd_mp3_buff;
- while(1)
- {
- init_mp3();//初始化MP3
- ////////////////
- is_init=1;
- restsd();
- initsd();
- is_init=0;//提高始终频率
- ///////////////
-
-
-
-
- sing(100);//正选测试
- XDCS=0;
- numb=4327936;
-
- for(k=11388;k;k--)
- {
- readsd(numb);//读物理扇区
- for(i=0;i<512;i++) //一个扇区的数据送入MP3中
- {
-
-
-
- sd_mp3_buff=tab[i];
- write_date_mp3( sd_mp3_buff);
-
-
-
- }
- numb=(numb+512);
-
-
-
-
-
- }
- XDCS=1;
-
-
- }
- }
复制代码
|