📄 mp3demo.c
字号:
#include <Reg52.h>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#include <dspcode.h>
/*定义宏*/
#define uint unsigned int
#define uchar unsigned char
#define SENDBUF 0x28b2
#define KEY_UP 0x80
#define VOL1 0x81
#define VOL2 0x82
#define L_LINE_VOLUME 0x00
#define R_LINE_VOLUME 0x01
#define L_HEADPHONE_VOLUME 0x02
#define R_HEADPHONE_VOLUME 0x03
#define A_AUDIO_PATH 0x04
#define D_AUDIO_PATH 0x05
#define POWER_CON 0x06
#define D_AUDIO_INTERFACE 0x07
#define SAMPLE_RATE 0x08
#define D_INTERFACE_ACT 0x09
#define RESET 0x0f
#define KEYNUM 27
#define MAINLONG 3
#define ERR 16
#define FRR 16
#define MAXBYTE 16
/*定义寄存器端口地址*/
#define HPICL XBYTE[0xe000]
#define HPICH XBYTE[0xe100]
#define WR_HPIL0_D XBYTE[0xe200]
#define WR_HPIH0_D XBYTE[0xe300]
#define WR_HPIL_A XBYTE[0xe400]
#define WR_HPIH_A XBYTE[0xe500]
#define WR_HPIL1_D XBYTE[0xe600]
#define WR_HPIH1_D XBYTE[0xe700]
#define RD_HPIL0_D XBYTE[0xeA00]
#define RD_HPIH0_D XBYTE[0xeB00]
#define RD_HPIL1_D XBYTE[0xeE00]
#define RD_HPIH1_D XBYTE[0xeF00]
#define WR_CR XBYTE[0x7100]
#define WR_PARA XBYTE[0x7000]
sbit NRST =P1^2;
sbit RST8019 =P1^3;
sbit RST013 =P1^6;
sbit CS =P1^1;
sbit SDIN =P3^5;
sbit SCLK =P3^4;
sbit SDA =P1^4;
sbit SCK =P1^5;
uchar hpic;
bit ok,readT,key_down;
unsigned char time,stoptime,ms,DSPorder;
unsigned char volume;
void wr_dspcode();
void delay(uint wu);
void LOADDSP();
void init_51();
void wr_hpi(uint addr,uint dat);
unsigned char rd_hpi(uint addr);
void rst8019();
void init_AIC23();
void write_AIC23(uchar addr,uint dat);
unsigned char getkey();
void Nrst();
void delay1(unsigned char k);
unsigned char getDSP();
//function of sta013
void write8(unsigned char d);
void writeSTA013(unsigned char addr,unsigned char x);
unsigned char readsta013(unsigned char addr);
unsigned char read8();
void startbit();
void stopbit();
void init_sta013();
main()
{
uchar i,j,key;
uint k;
init_AIC23();
init_sta013();
delay(10000);
rst8019();
Nrst();
LOADDSP();
init_51();
delay(30000);
volume=108;
write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);
start:
if(rd_hpi(0x007c)==0x01)
{
WR_CR=0x46; //SET ADDR
WR_PARA=0xb0;
WR_PARA=0x04;
WR_CR=0x42;
for(j=1;j<9;j++)
{
wr_hpi(0x007c,j);
WR_HPIL_A=SENDBUF/256;
WR_HPIH_A=SENDBUF%256;
for(k=0;k<600;k++)
{
WR_PARA=RD_HPIL0_D;
WR_PARA=RD_HPIH0_D;
}
}
}
if(RI)
{
RI=0;
key=SBUF;
if(key==VOL1)
{
do{
if(volume>0)
volume--;
write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);
delay(10000);
key=getkey();
}while(key!=KEY_UP);
}
else if(key==VOL2)
{
do{
if(volume<0x7f)
volume++;
write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);
delay(10000);
key=getkey();
}while(key!=KEY_UP);
}
else if(key<255)
wr_hpi(0x007e,key);
}
goto start;
}
void delay(uint wu)
{
for(wu;wu>0;wu--);
}
void delay1(unsigned char k)
{
for(;k>0;k--);
}
void Nrst()
{
NRST=0;
delay(100);
NRST=1;
delay(100);
}
void LOADDSP()
{
wr_dspcode();
}
unsigned char rd_hpi(uint addr)
{
unsigned char i;
WR_HPIL_A=addr/256;
WR_HPIH_A=addr%256;
i=RD_HPIL0_D;
i=RD_HPIH0_D;
return(i);
}
void wr_hpi(uint addr,uint dat)
{
WR_HPIL_A=addr/256;
WR_HPIH_A=addr%256;
WR_HPIL1_D=dat/256;
WR_HPIH1_D=dat%256;
}
void wr_dspcode()
{
uchar code *dspptr,*temp;
uchar len;
char i;
uint addr;
HPICL=0x08; //clear HPIint,least is first
HPICH=0x08;
dspptr=dspcode;
while(1)
{
len=*dspptr++;
if(len==0) break;
else
{
addr=((*dspptr++)*256)+(*dspptr++);
addr--;
temp=dspptr;
again:
WR_HPIL_A=addr/256;
WR_HPIH_A=addr%256;
for(i=0;i<len/2;i++)
{
WR_HPIL0_D=*dspptr++;
WR_HPIH0_D=*dspptr++;
}
dspptr=temp;
addr++;
WR_HPIL_A=addr/256;
WR_HPIH_A=addr%256;
for(i=0;i<len/2;i++)
{
if(RD_HPIL0_D!=*dspptr++) goto again;
if(RD_HPIH0_D!=*dspptr++) goto again;
}
}
}
WR_HPIL_A=0x00;
WR_HPIH_A=0x7f;
WR_HPIL1_D=0x00;
WR_HPIH1_D=0x80;
}
Timer0() interrupt 1
{
ok=1;
ms++;
}
void init_51()
{
TMOD=0x21;
SCON=0x40;
REN=1;
TH1=0xfd;
TL1=0xfd;
ET1=0;
ES=0;
IT0=1;
EX0=0;
ET0=1;
EA=1;
TR1=1;
TR0=1;
}
/***************************************************************/
void rst8019()
{
RST8019=1;
delay(100);
RST8019=0;
}
unsigned char getDSP()
{
WR_HPIL_A=0;
WR_HPIH_A=0x7d;
return(RD_HPIH0_D);
}
void init_AIC23()
{
write_AIC23(RESET,0);
write_AIC23(D_INTERFACE_ACT,0x001);
write_AIC23(POWER_CON,0);
write_AIC23(SAMPLE_RATE,0x022); //44.1k
// write_AIC23(SAMPLE_RATE,0x062); //22.05k
// write_AIC23(SAMPLE_RATE,0x02e); //8.021k
write_AIC23(L_LINE_VOLUME,0x0117);
write_AIC23(L_LINE_VOLUME,0x0117);
volume=100;
write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);
write_AIC23(R_HEADPHONE_VOLUME,0x0180+volume);
// write_AIC23(A_AUDIO_PATH,0x009); //bypass DAC OFF
// write_AIC23(A_AUDIO_PATH,0x014); //MIC ADC DAC ON 0DB
// write_AIC23(A_AUDIO_PATH,0x1fc); //bypass MIC ADC DAC ON 0DB sidetone
write_AIC23(A_AUDIO_PATH,0x07d); //bypass MIC ADC DAC ON 20DB sidetone(-6db)
// write_AIC23(A_AUDIO_PATH,0x011); //LINE ADC DAC ON
write_AIC23(D_AUDIO_PATH,0x04);
write_AIC23(D_AUDIO_INTERFACE,0x043); //master dsp mode
}
void write_AIC23(uchar addr,uint dat)
{
uchar i;
dat|=addr<<9;
CS=0;
for(i=0;i<16;i++)
{
SCLK=0;
if((dat<<i)&0x8000)
SDIN=1;
else
SDIN=0;
SCLK=1;
}
SCLK=0;
CS=1;
}
unsigned char getkey()
{
uchar key;
if(RI)
{
RI=0;
key=SBUF;
return(key);
}
return(255);
}
void writeSTA013(unsigned char addr,unsigned char x)
{
startbit();
write8(0x86); //STA013 write
write8(addr);
write8(x);
stopbit();
}
unsigned char readsta013(unsigned char addr)
{
unsigned char dat;
startbit();
write8(0x86);
write8(addr);
startbit();
write8(0x87);
dat=read8();
stopbit();
return(dat);
}
unsigned char read8()
{
unsigned char i;
unsigned char d=0;
SCK=0;
for(i=0;i<8;i++)
{
SDA=1;
SCK=1;delay1(38);
if(SDA==1) d=d|((0x80)>>i);
delay1(38);
SCK=0;
}
SCK=0;delay1(38); //NO ACK
SDA=1;
SCK=1;delay1(38);
SCK=0;
return(d);
}
void write8(unsigned char d)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCK=0;
if((d<<i)&0x80) SDA=1;
else SDA=0;
SCK=1;delay1(38);
}
SCK=0;
SCK=1; //ACK bit
while(SDA);
SCK=0;
}
void startbit()
{
SCK=0;delay1(38);
SDA=1;
SCK=1;delay1(38); //start bit
SDA=0;delay1(38);
SCK=0;delay1(38);
}
void stopbit()
{
SCK=0;
SDA=0;delay1(38);
SCK=1;delay1(38); //stop bit
SDA=1;delay1(38);
SCK=0;delay1(38);
}
void init_sta013()
{
RST013=0;
delay(100);
RST013=1;
delay(100);
// delay(60000);
writeSTA013(0x54,5); //PCM_DIVIDER 384FS
writeSTA013(0x63,1); //DAC_CLK fixed
writeSTA013(0x0A,17); //RESERVED
writeSTA013(0x0B,3); //RESERVED
writeSTA013(0x55,0X0c); //PCM_CONF 16BIT
writeSTA013(0x52,160); //PLL_FRAC_441_H
writeSTA013(0x51,186); //PLL_FRAC_441_L
writeSTA013(0x65,140); //PLL_FRAC_H
writeSTA013(0x64,42); //PLL_FRAC_L
writeSTA013(0x50,10); //MFSDF_441
writeSTA013(0x61,7); //MFSDF(X)
writeSTA013(0x05,0xa1); //PLLCTRL
writeSTA013(0x18,0X04); //DATA_REQ_ENABLE
writeSTA013(0x0d,0X04); //SCKL_POL SAMPLING ON FALLING EDGE
writeSTA013(0x0C,0X01); //REQ_POL LINE IS HIGH
writeSTA013(0x72,0X01); //RUN
writeSTA013(0x14,0X00); //MUTE
writeSTA013(0x13,0X01); //PLAY
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -