标题:
MP3码率再次提升!!!cpu快崩溃了
[打印本页]
作者:
hongniu
时间:
2015-6-23 16:43
标题:
MP3码率再次提升!!!cpu快崩溃了
我的天啊!这是要了8位CPU的命啊!现在的比特流已经超过250KBPS在也提高不了了!我认为!要达到340KBPS必须加晶振!程序我已经尽力了!!!不过!大部分的歌曲文件播放不成问题了!我换了晶振!12m的!如果换个35的保证没问题了!看来8位机在这方面给是真的不行啊!
#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;//从-主数据输出
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--;
}
//***************************
unsigned char bdata datmp3;
sbit datmp3_0=datmp3^0;
sbit datmp3_1=datmp3^1;
sbit datmp3_2=datmp3^2;
sbit datmp3_3=datmp3^3;
sbit datmp3_4=datmp3^4;
sbit datmp3_5=datmp3^5;
sbit datmp3_6=datmp3^6;
sbit datmp3_7=datmp3^7;
//*//**********************************************
/*读sd卡子程序,无返回值,有参函数,参数为要写入DATEIN数据线的字节*/
void write(unsigned char wr_)// 写入一个字节SD卡
{
dat=wr_;
DATEIN=dat_7;
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_6;
SCLK=0;
//if(!is_init)delay(1);
if(is_init)delay(200);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_5;
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
//if(!is_init)delay(1);
DATEIN=dat_4;
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_3;
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_2;
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_1;
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_0;
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
//if(!is_init)delay(1);
}
unsigned char read()// 读取一个字节SD卡
{
DATEOUT=1;
SCLK=1;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
dat_7=DATEOUT;
SCLK=1;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
dat_6=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_5=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_4=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_3=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_2=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_1=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_0=DATEOUT;
return (dat);
}
//****************************
void write1(unsigned char wr_)// 写入一个字节SD卡
{
dat=wr_;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1;
}
unsigned char read1()// 读取一个字节SD卡
{
DATEOUT=1;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_7=DATEOUT;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_6=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_5=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_4=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_3=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_2=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_1=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_0=DATEOUT;
return (dat);
}
//******************************8
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);//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;//片选开
write1( 0x51);
write1( zh1);
write1( zh2);
write1( zh3);
write1( zh4);
write1( 0xff);
DATEOUT=1;
for(;;)
{
fhz=read1();
if(fhz==0x00)break;
}
DATEOUT=1;
for(;;)
{
fhz=read1();
if(fhz==0xfe)break;
}
DATEOUT=1;
n=0;
for(j=512;j;j--)
{
tab[n]=read1();
n++;
}
fhz=read1();
fhz=read1();
CS=1;
write1(0xff);
}
////***************************************以上是SD主程序
///*************************************以下是MP3模块的程序
void delay1ms(uint j)//延时100us
{unsigned char i;
for(i=j;i;i--)
{
}
}
void spi_write_mp3(uchar h)//SPI写入一个字节,这里是最底层的数据发送!
{
datmp3=h;
/*SCLK=1;
for(i=8;i;i--)
{
SI=h&0x80;
h=h<<1;
SCK=0;
//delay1ms(1); //这里不要加任何的延时!提高写入MP3模块的写入速度!
SCK=1;
// delay1ms(1);
}*/
SI=datmp3_7;
//为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
SCK=0; //从SD读取和MP3写数据流下手
SCK=1;
SI=datmp3_6;
SCK=0;
SCK=1;
SI=datmp3_5;
SCK=0;
SCK=1;
SI=datmp3_4;
SCK=0;
SCK=1;
SI=datmp3_3;
SCK=0;
SCK=1;
SI=datmp3_2;
SCK=0;
SCK=1;
SI=datmp3_1;
SCK=0;
SCK=1;
SI=datmp3_0;
SCK=0;
SCK=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,250);//声音音量控制 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;
uint i;
uchar sd_mp3_buff;
init_mp3();//初始化MP3
////////////////
is_init=1;
restsd();
initsd();
is_init=0;//提高始终频率
///////////////
sing(100);//正选测试
while(1)
{
numb=4327936; //从4327936物理地址开始读歌曲!
XDCS=0;
for(;;)
{
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;
}
}
复制代码
作者:
hongniu
时间:
2015-6-23 16:44
可以到300K了:
#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;//从-主数据输出
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--;
}
//***************************
unsigned char bdata datmp3;
sbit datmp3_0=datmp3^0;
sbit datmp3_1=datmp3^1;
sbit datmp3_2=datmp3^2;
sbit datmp3_3=datmp3^3;
sbit datmp3_4=datmp3^4;
sbit datmp3_5=datmp3^5;
sbit datmp3_6=datmp3^6;
sbit datmp3_7=datmp3^7;
///*************************************以下是MP3模块的程序
void delay1ms(uint j)//延时100us
{unsigned char i;
for(i=j;i;i--)
{
}
}
void spi_write_mp3_1(uchar h)//SPI写入一个字节,这里是最底层的数据发送!
{
datmp3=h;
/*SCLK=1;
for(i=8;i;i--)
{
SI=h&0x80;
h=h<<1;
SCK=0;
//delay1ms(1); //这里不要加任何的延时!提高写入MP3模块的写入速度!
SCK=1;
// delay1ms(1);
}*/
SI=datmp3_7;
//为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
SCK=0; //从SD读取和MP3写数据流下手
SCK=1;
SI=datmp3_6;
SCK=0;
SCK=1;
SI=datmp3_5;
SCK=0;
SCK=1;
SI=datmp3_4;
SCK=0;
SCK=1;
SI=datmp3_3;
SCK=0;
SCK=1;
SI=datmp3_2;
SCK=0;
SCK=1;
SI=datmp3_1;
SCK=0;
SCK=1;
SI=datmp3_0;
SCK=0;
SCK=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_1(2); //表示写操作
spi_write_mp3_1(add);
spi_write_mp3_1(h); //先写高8位
spi_write_mp3_1(l);
XCS=1;
}
void write_date_mp3(uchar dat)//写入音频数据信息这里还有一点是XDCS在此函数外拉低
{
DREQ=1;
while(!DREQ);
datmp3=dat;
SI=datmp3_7;
//为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
SCK=0; //从SD读取和MP3写数据流下手
SCK=1;
SI=datmp3_6;
SCK=0;
SCK=1;
SI=datmp3_5;
SCK=0;
SCK=1;
SI=datmp3_4;
SCK=0;
SCK=1;
SI=datmp3_3;
SCK=0;
SCK=1;
SI=datmp3_2;
SCK=0;
SCK=1;
SI=datmp3_1;
SCK=0;
SCK=1;
SI=datmp3_0;
SCK=0;
SCK=1;
}
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,250);//声音音量控制 00是最大的!!!!!
XDCS=0;//数据片选
spi_write_mp3_1(0);
spi_write_mp3_1(0);
spi_write_mp3_1(0);
spi_write_mp3_1(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程序
//*//**********************************************
/*读sd卡子程序,无返回值,有参函数,参数为要写入DATEIN数据线的字节*/
void write(unsigned char wr_)// 写入一个字节SD卡
{
dat=wr_;
DATEIN=dat_7;
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_6;
SCLK=0;
//if(!is_init)delay(1);
if(is_init)delay(200);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_5;
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
//if(!is_init)delay(1);
DATEIN=dat_4;
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_3;
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_2;
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_1;
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
// if(!is_init)delay(1);
DATEIN=dat_0;
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=1;
if(is_init) delay(200);
//if(!is_init)delay(1);
}
unsigned char read()// 读取一个字节SD卡
{
DATEOUT=1;
SCLK=1;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
dat_7=DATEOUT;
SCLK=1;
if(is_init)delay(200);
//if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
//if(!is_init)delay(1);
dat_6=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_5=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_4=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_3=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_2=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_1=DATEOUT;
SCLK=1;
if(is_init)delay(200);
// if(!is_init)delay(1);
SCLK=0;
if(is_init)delay(200);
// if(!is_init)delay(1);
dat_0=DATEOUT;
return (dat);
}
//****************************
void write1(unsigned char wr_)// 写入一个字节SD卡
{
dat=wr_;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1;
}
unsigned char read1()// 读取一个字节SD卡
{
DATEOUT=1;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_7=DATEOUT;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_6=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_5=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_4=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_3=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_2=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_1=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_0=DATEOUT;
return (dat);
}
//******************************8
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 sdbuff2;
uint j,n;
uchar sd_mp3_buff;
uchar zh2,zh3,zh4;
sdbuff2=addstart;
zh4=addstart;
zh2=(sdbuff2>>16); //把以前的代码大部分省略,为了速度!1!!!
zh3=(addstart>>8);
// uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原来这里是高地址字节在前地地址在后啊201012月14日逻辑扇区在253*512=0X0001fa00
//CS=1;
// write(0xff);//据说是提高兼容性 ;;;;速度啊!提高
CS=0;//片选开
write1( 0x51);
write1( 0x00);//这里是2G以下可以为00
write1( zh2);
write1( zh3);
write1( zh4);
write1( 0xff);
DATEOUT=1;
for(;;)
{
fhz=read1();
if(fhz==0x00)break;
}
DATEOUT=1;
for(;;)
{
fhz=read1();
if(fhz==0xfe)break;
}
DATEOUT=1;
n=0;
for(j=512;j;j--)
{
// tab[n]=read1();
// n++;
//sd_mp3_buff=tab[i];
sd_mp3_buff=read1();
write_date_mp3( sd_mp3_buff);
}
fhz=read1();
fhz=read1();
CS=1;
write1(0xff);
} */
////***************************************以上是SD主程序
void main() //主程序
{
uchar *p;
static unsigned long numb;
uint j,n;
//uchar sd_mp3_buff;
uchar zh2,zh3,zh4;
//uint i;
init_mp3();//初始化MP3
////////////////
is_init=1;
restsd();
initsd();
is_init=0;//提高始终频率
///////////////
sing(100);//正选测试
while(1)
{
numb=4327936; //从4327936物理地址开始读歌曲!
//这里的指针操作比移位操作快多了!!!!
XDCS=0;
for(;;)
{
p=&numb; //取出存放Numb的地址的最高位!详细请看汇编!!
p++; //由于最高位不用所以这里舍去小于2G
zh2=*p;//从高到底的地第二字节 、、
p++;
zh3=*p; //从高到底的地第三字节
p++;
zh4=*p; //从高到底的地第四字节
//readsd(numb);//读物理扇区
//**************
//sdbuff2=numb;
/*zh4=numb;
zh3=(numb>>8);
zh2=(numb>>16); //把以前的代码大部分省略,为了速度!1!!!
*/
// uchar pcmd[6]={0x51,zh1,zh2,zh3,zh4,0xff};//原来这里是高地址字节在前地地址在后啊201012月14日逻辑扇区在253*512=0X0001fa00
//CS=1;
// write(0xff);//据说是提高兼容性 ;;;;速度啊!提高
CS=0;//片选开
// write1( 0x51); //fhz=read1(); 以下是写SD卡物理扇区地址
dat=0x51;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1; //fhz=read1(); 以上是写SD卡
//write1( 0x00);//这里是2G以下可以为00 //fhz=read1(); 以下是写SD卡
dat=0x00;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1; //fhz=read1(); 以上是写SD卡
//write1( zh2); //fhz=read1(); 以下是写SD卡
dat=zh2;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1; //fhz=read1(); 以上是写SD卡
// write1( zh3); //fhz=read1(); 以下是写SD卡
dat=zh3;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1; //fhz=read1(); 以上是写SD卡
//write1( zh4); //fhz=read1(); 以下是写SD卡
dat=zh4;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1; //fhz=read1(); 以上是写SD卡
// write1( 0xff); //fhz=read1(); 以下是写SD卡
dat=0xff;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1;
DATEOUT=1; // 以上是写SD卡
for(;;)
{
//fhz=read1(); 以下是读SD卡
DATEOUT=1;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_7=DATEOUT;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_6=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_5=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_4=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_3=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_2=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_1=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_0=DATEOUT;
fhz=dat; // 以上是读SD卡
if(fhz==0x00)break;
}
DATEOUT=1;
for(;;)
{
// fhz=read1(); 以下是读SD卡
DATEOUT=1;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_7=DATEOUT;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_6=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_5=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_4=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_3=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_2=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_1=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_0=DATEOUT;
fhz=dat; //fhz=read1(); 以上是读SD卡
if(fhz==0xfe)break;
}
DATEOUT=1;
n=0;
for(j=512;j;j--)
{
DATEOUT=1; //fhz=read1(); 以下是读SD卡
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_7=DATEOUT;
SCLK=1;
//if(!is_init)delay(1);
SCLK=0;
//if(!is_init)delay(1);
dat_6=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_5=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_4=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_3=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_2=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_1=DATEOUT;
SCLK=1;
// if(!is_init)delay(1);
SCLK=0;
// if(!is_init)delay(1);
dat_0=DATEOUT; //fhz=read1(); 以上是读SD卡
datmp3=dat; //fhz=read1(); 以下是写mp3bit流
DREQ=1;
while(!DREQ);
SI=datmp3_7;
//为了进一步提高速度我这里采用了顺序结构!全是断桥残雪惹的祸!第一次爱的人播放正常!而断桥残雪不行了!一定尽全力
SCK=0; //从SD读取和MP3写数据流下手
SCK=1;
SI=datmp3_6;
SCK=0;
SCK=1;
SI=datmp3_5;
SCK=0;
SCK=1;
SI=datmp3_4;
SCK=0;
SCK=1;
SI=datmp3_3;
SCK=0;
SCK=1;
SI=datmp3_2;
SCK=0;
SCK=1;
SI=datmp3_1;
SCK=0;
SCK=1;
SI=datmp3_0;
SCK=0;
SCK=1;
//以上是写mp3bit流
}
//**********************以下是读CRC*****
DATEOUT=1;
SCLK=1;
SCLK=0;
dat_7=DATEOUT;
SCLK=1;
SCLK=0;
dat_6=DATEOUT;
SCLK=1;
SCLK=0;
dat_5=DATEOUT;
SCLK=1;
SCLK=0;
dat_4=DATEOUT;
SCLK=1;
SCLK=0;
dat_3=DATEOUT;
SCLK=1;
SCLK=0;
dat_2=DATEOUT;
SCLK=1;
SCLK=0;
dat_1=DATEOUT;
SCLK=1;
SCLK=0;
dat_0=DATEOUT;
DATEOUT=1;
SCLK=1;
SCLK=0;
dat_7=DATEOUT;
SCLK=1;
SCLK=0;
dat_6=DATEOUT;
SCLK=1;
SCLK=0;
dat_5=DATEOUT;
SCLK=1;
SCLK=0;
dat_4=DATEOUT;
SCLK=1;
SCLK=0;
dat_3=DATEOUT;
SCLK=1;
SCLK=0;
dat_2=DATEOUT;
SCLK=1;
SCLK=0;
dat_1=DATEOUT;
SCLK=1;
SCLK=0;
dat_0=DATEOUT;
CS=1;
dat=0xff;
DATEIN=dat_7;
SCLK=0;
SCLK=1;
DATEIN=dat_6;
SCLK=0;
SCLK=1;
DATEIN=dat_5;
SCLK=0;
SCLK=1;
DATEIN=dat_4;
SCLK=0;
SCLK=1;
DATEIN=dat_3;
SCLK=0;
SCLK=1;
DATEIN=dat_2;
SCLK=0;
SCLK=1;
DATEIN=dat_1;
SCLK=0;
SCLK=1;
DATEIN=dat_0;
SCLK=0;
SCLK=1;
//**********************以上是读CRC*****
//**************
numb=(numb+0x200);
}
// XDCS=1;
}
}
复制代码
作者:
1048164421
时间:
2015-6-24 09:08
太牛了,真佩服你,我也是单片机爱好者
作者:
景云之应
时间:
2015-6-29 22:23
自己做MP3吗?程序好长
作者:
choi
时间:
2015-6-30 09:50
如能將資料打包分享 這樣更好
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1