欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機軟件解碼MP3碼流速率提升后的!!!!
[打印本頁]
作者:
hongniu
時間:
2015-6-23 16:45
標題:
51單片機軟件解碼MP3碼流速率提升后的!!!!
由于MP3文件的碼率不同導致了有的歌曲不能正常播放!故而在不改變晶振頻率的情況下,把內部對SD的FLASH 和送往MP3解碼器的數(shù)據(jù)流速率做了調整!使他們達到最高速!比如:播放一首《第一次愛的人》音質就很好!但是播放《斷橋殘雪》就出現(xiàn)卡頓現(xiàn)象!是故也!
這里取消了移位算法!采用順序架構!主要還是改變SPI的通信速率!其實還可以繼續(xù)增強播放流速度!盡一切的減小指令的執(zhí)行周期!但是經調試 這個速度已經可以滿足了!就不做不必要的調整了!還有一招那就是改變 時鐘!但是過高的外部時鐘對系統(tǒng)的穩(wěn)定性有影響的,這里不予考慮!實在不行再綜合考慮!總之:要千方百計的挖掘可以提高的潛在的可提升的速度因素!達到播放要求!音質完美再現(xiàn)!
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//******************
sbit p1_7=P1^7;
sbit CS=P2^0; //片選信號(低電平有效)
sbit DATEIN =P2^1;//主-從數(shù)據(jù)輸入
sbit SCLK=P2^2;//時鐘信號
sbit DATEOUT=P2^3;//從-主數(shù)據(jù)輸出
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; //數(shù)據(jù)請求
sbit XDCS=P1^2; //數(shù)據(jù)片選
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卡子程序,無返回值,有參函數(shù),參數(shù)為要寫入DATEIN數(shù)據(jù)線的字節(jié)*/
void write(unsigned char wr_)// 寫入一個字節(jié)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()// 讀取一個字節(jié)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 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);//據(jù)說是提高兼容性
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);//據(jù)說是提高兼容性
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卡物理扇區(qū)
{ 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};//原來這里是高地址字節(jié)在前地地址在后啊201012月14日邏輯扇區(qū)在253*512=0X0001fa00
CS=1;
write(0xff);//據(jù)說是提高兼容性
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寫入一個字節(jié),這里是最底層的數(shù)據(jù)發(fā)送!
{
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寫數(shù)據(jù)流下手
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讀取一個字節(jié)
{
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是數(shù)據(jù)注意這里是16位的數(shù)據(jù),內部做分開了處理
{
uchar h,l;
l=date;
h=(date>>8);
DREQ=1;
while(!DREQ); //檢測MP3模塊的忙狀態(tài)
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)//寫入音頻數(shù)據(jù)信息這里還有一點是XDCS在此函數(shù)外拉低
{
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;//數(shù)據(jù)片選
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物理地址開始讀歌曲!
for(;;)
{ XDCS=0;
readsd(numb);//讀物理扇區(qū)
for(i=0;i<512;i++) //一個扇區(qū)的數(shù)據(jù)送入MP3中
{
sd_mp3_buff=tab[i];
write_date_mp3( sd_mp3_buff);
}
numb=(numb+512);
}
XDCS=1;
}
}
復制代碼
作者:
hefanghua
時間:
2018-2-11 23:21
老兄你這個是用VS1003解碼不是51去軟解,被標題忽悠到了。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1