?? wavdemo.c
字號(hào):
#include <Reg52.h>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#include <dspcode.h>
/*定義宏*/
#define uint unsigned int
#define uchar unsigned char
#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 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 int rd_hpi(uint addr);
void rst8019();
void init_AIC23();
void write_AIC23(uchar addr,uint dat);
void Nrst();
void inter_init();
extern void LCD_DIS_STRING(unsigned char addr,unsigned char num,unsigned char *pdat);
extern void LCD_INIT(void);
void delay1(unsigned char k);
unsigned char getDSP();
code unsigned char st1[]={"F"};
void send_char(uchar val);
uchar rev_buf[2];
uchar strlen=0;
unsigned int rd_hpi(uint addr)
{
unsigned char i,i1;
WR_HPIL_A=addr/256;
WR_HPIH_A=addr%256;
i1=RD_HPIL0_D;
i=RD_HPIH0_D;
return(i1*256+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 main()
{
uchar i,j,key;
uint k1;
inter_init();
init_51();
// LCD_INIT();
init_AIC23();
delay(10000);
rst8019();
Nrst();
LOADDSP();
send_char('G');
delay(30000);
delay(30000);
volume=108;
write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);
// LCD_DIS_STRING(0x80,5,st1);
while(1)
{
if (strlen>=4)
{
switch (rev_buf[0])
{case 'r': for(i=0;i<2;i++)
{
k1=rd_hpi(0x1000+i);
send_char(k1%256);
send_char(k1/256);
// k1=rd_hpi(0x11f0+i);
// send_char(k1%256);
// send_char(k1/256);
}
break;
default:break;
}
strlen=0;
}
}
}
void send_char(uchar val)
{
SBUF=val;
while(!TI);
TI=0;
}
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();
}
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++; //字節(jié)0:每行代碼的長度
if(len==0) break;
else
{
addr=((*dspptr++)*256)+(*dspptr++); //字節(jié)1:每行代碼的起始地址
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++; //字節(jié)3:每行代碼的程序代碼
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; //dsp運(yùn)行程序起始地址
WR_HPIH1_D=0x80;
}
void inter_init() //中斷初始化
{
//SM0=0; SM1=0; SM2=0;
//REN=1;
T2CON=0x30 ; //T2作為波特率發(fā)生器
//RCAP2L=0x0EE; //f=11059200Hz,設(shè)定波特率為19200bps, TC=2^16-f/32*baud=65518
//RCAP2H=0x0FF;
RCAP2L=0x0DC; //f=11059200Hz,設(shè)定波特率為9600bps, TC=2^16-f/32*baud=65500
RCAP2H=0x0FF;
TL2=RCAP2L;
TH2=RCAP2H;
TR2=0;
// PS=1; //串行中斷高優(yōu)先級
}
void init_51()
{
TR2=1;
SCON=0x50;
ES=1;
EA=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,0x015); //MIC ADC DAC ON 20DB
// 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); //44.1khz
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;
}
void UartInt(void) interrupt 4 //串口中斷服務(wù)程序
{uchar key;
if(RI)
{
RI=0;
key=SBUF;
rev_buf[strlen]=key;
strlen++;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -