📄 wavdemo.c
字号:
/*
WWW.MCU123.NET/BBS
欢迎大家多共享一些例程。。那怕是最简单的。
因为别人也需要你的帮助的。
程序功能:
51单片机通过HPI口装载程序到DSP中
*/
#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 char rd_hpi(uint addr);
void rst8019();
void init_AIC23();
void write_AIC23(uchar addr,uint dat);
void Nrst();
void delay1(unsigned char k);
unsigned char getDSP();
main()
{
uchar i,j,key;
uint k;
init_AIC23();
delay(10000);
rst8019();
Nrst();
LOADDSP();
init_51();
delay(30000);
volume=108;
write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);
while(1);
}
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; //THE START ADDRESS OF RUN
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -