📄 main.c
字号:
extern double log10(double);
//System function
extern void IO_INIT(void);
extern void WATCHDOG_CLEAR(void);
//Bus function
extern void SET_ADDR(char);
extern void WRITE_DATA(char);
extern char READ_DATA(void);
//AD function
extern void AD_Enable(void);
extern void AD_Select(int);
extern int AD_Data(void);
//Lcd function
extern void LCD_Init(void);
extern void LCD_Play(void);
extern void send_d(char);
extern void send_i(char);
//sinc signal generate function;
extern char *RES_SINC_SA;
//系统初始化程序
void System_Init(void);
void send_sinc_table(void);
void Play_OFF_V(void);
void Play_OFF_V(void);
//parament function
int OFF_V(void);
//Key service;
int Key;
int Time;
int Div;
char buff[16]={' '};
int point;
int Status;
int print_buff[7][5];
main()
{int i;
IO_INIT();
System_Init();
L_Fill(0x10," 电子设计大赛 ");
L_Fill(0x08,"放大器参数测试仪");
Key=0;
Div=0x8000;
Delay(4048);
L_Fill(0x10," 选择测量参数 ");
L_Fill(0x08," ");
while(1)
{
switch(Key)
{
case 53:
case 61:
case 37:
case 45:
SET_ADDR(0x40);
WRITE_DATA(0x12);
Delay(0xff);
SET_ADDR(0x40);
WRITE_DATA(0x02);
Key=0;
WATCHDOG_CLEAR();
break;
case 46:
// 上升时间测量:
Delay(0xff);
Play_Rise_Time();
Key=0;
WATCHDOG_CLEAR();
break;
case 3:
//共模抑制比参数测量
Delay(0xff);
Play_CMRR();
Key=0;
WATCHDOG_CLEAR();
break;
case 5:
//开环电压增益
Delay(0xff);
Play_KAV();
WATCHDOG_CLEAR();
Key=0;
break;
case 6:
//自动测试功能
Delay(0xff);
KAV();
Delay(1024);
Play_KAV();
CMRR();
Delay(1024);
Play_CMRR();
OFF_V();
Delay(1024);
Play_OFF_V();
OFF_I();
Delay(1024);
Play_OFF_I();
Delay(1024);
Play_BWG();
Delay(0xff);
Play_Rise_Time();
Title();
for(Status=1;Status<7;Status++)
Print();
sign();
Key=0;
WATCHDOG_CLEAR();
break;
case 11:
frequency_up();
Delay(0xff);
Key=0;
break;
case 19:
frequency_down();
Delay(0xff);
Key=0;
break;
case 13:
Delay(0xff);
Play_OFF_V();
Key=0;
WATCHDOG_CLEAR();
break;
case 14:
Key=0;
Delay(0xff);
Play_PC();
WATCHDOG_CLEAR();
break;
case 0x15:
Delay(0xff);
Play_OFF_I();
Key=0;
WATCHDOG_CLEAR();
break;
//-3dB带宽测量
case 29:
Delay(0xff);
Play_BWG();
Key=0;
WATCHDOG_CLEAR();
default:
break;
// 打印功能
case 54:
Delay(0xff);
Title();
Print();
Key=0;
sign();
WATCHDOG_CLEAR();
break;
}
WATCHDOG_CLEAR();
}
}
void System_Init(void)
{
LCD_Init();
send_sinc_table();
SET_ADDR(0x40);
WRITE_DATA(0x02);
}
void send_sinc_table(void)
{int i;
SET_ADDR(0x01);
WRITE_DATA(0x02);
for(i=0;i<256;i++)
{
SET_ADDR(0x02);
WRITE_DATA(i);
SET_ADDR(0x04);
WRITE_DATA(RES_SINC_SA[i]);
WATCHDOG_CLEAR();
}
SET_ADDR(0x01);
WRITE_DATA(0x03);
for(i=256;i<500;i++)
{
SET_ADDR(0x02);
WRITE_DATA(i);
SET_ADDR(0x04);
WRITE_DATA(RES_SINC_SA[i]);
WATCHDOG_CLEAR();
}
for(i=500;i<512;i++)
{
SET_ADDR(0x02);
WRITE_DATA(i);
SET_ADDR(0x04);
WRITE_DATA(0x00);
WATCHDOG_CLEAR();
}
SET_ADDR(0x01);
WRITE_DATA(0x00);
}
//液晶显示子程序
void Play_OFF_V(void)
{
int Temp;
send_i(0x01);
L_Fill(0x10," 输入失调电压 ");
L_Fill(0x08," mV ");
Temp=OFF_V()*3.3;
Status=1;
Play_num(Temp);
}
void Play_OFF_I(void)
{
int Temp;
send_i(0x01);
L_Fill(0x10," 输入失调电流 ");
L_Fill(0x08," nA ");
Temp=OFF_I()*3.3;
Status=2;
Play_num(Temp);
}
void Play_CMRR(void)
{
int Temp;
LCD_Init();
L_Fill(0x10," 共模抑制比 ");
L_Fill(0x08," dB ");
Temp=CMRR();
Temp=20*log10(Temp*3.3);
Temp=120-Temp;
Status=3;
Play_dB(Temp);
}
void Play_KAV(void)
{
int Temp;
send_i(0x01);
L_Fill(0x10," 开环放大倍数 ");
L_Fill(0x08," dB ");
Temp=KAV()*3.3;
Temp=log10(Temp);
Temp=120-20*Temp;
Status=4;
Play_dB(Temp);
}
void Play_BWG(void)
{
int i,Temp[4];
int freq;
send_i(0x01);
L_Fill(0x10," -3dB带宽 ");
L_Fill(0x08," kHz ");
Status=5;
BWG();
point+=7;
for(i=0;i<4;i++)
{
Temp[i]=0x30+freq%10;
freq=freq/10;
print_buff[Status][i]=Temp[i];
}
send_i(0x8A);
for(i=3;i>=0;i--)
send_d(Temp[i]);
}
void Play_PC()
{ int i;
send_i(0x01);
L_Fill(0x10,"Connect with PC");
while(!Key)
{send_i(0x88);
for(i=0;i<16;i++)
{Delay(0xff);
send_d('>');
}
L_Fill(0x08," ");
}
}
void Play_Rise_Time(void)
{int i,Temp[4];
int rise_Time;
L_Fill(0x10," 上升时间 ");
L_Fill(0x08," ns ");
send_i(0x008A);
Status=6;
for(i=0;i<4;i++)
{
Temp[i]=0x30+rise_Time%10;
rise_Time=rise_Time/10;
print_buff[Status][i]=Temp[i];
}
for(i=3;i>=0;i--)
send_d(Temp[i]);
}
//数据转换子程序
void Play_num(int num)
{
int i,Temp[4]={0};
int num_buff;
num_buff=num;
send_i(0x008a);
for(i=0;i<4;i++)
{
Temp[i]=0x30+num_buff%10;
num_buff=num_buff/10;
print_buff[Status][i]=Temp[i];
}
for(i=3;i>=0;i--)
{send_d(Temp[i]);
if(i==3)
send_d('.');
}
}
void Play_dB(int num)
{
int i,Temp[3];
int num_buff;
num_buff=num;
send_i(0x008a);
for(i=0;i<3;i++)
{
Temp[i]=0x30+num_buff%10;
num_buff=num_buff/10;
print_buff[Status][i]=Temp[i];
}
for(i=2;i>=0;i--)
send_d(Temp[i]);
}
//参数测量部分
//输入失调电压测量
int OFF_V(void)
{
int i;
long int buff;
SET_ADDR(0x40);
WRITE_DATA(0x02);
//AD 转换测量
AD_Enable();
AD_Select(0x06);
Delay(512);
buff=0;
for(i=0;i<256;i++)
buff+=AD_Data();
if(buff<0x35000)
return
buff/256;
SET_ADDR(0x40);
WRITE_DATA(0x0A);
Delay(512);
buff=0;
for(i=0;i<256;i++)
buff+=AD_Data();
return
buff/256;
}
//输入失调电流测量
void OFF_I(void)
{int i;
long int buff_1;
long int buff_2;
SET_ADDR(0x40);
WRITE_DATA(0x22);
Delay(512);
//AD 转换测量
AD_Enable();
AD_Select(0x06);
buff_1=0;
for(i=0;i<256;i++)
buff_1+=AD_Data();
SET_ADDR(0x40);
WRITE_DATA(0x26);
Delay(512);
//AD 转换测量
AD_Enable();
AD_Select(0x06);
buff_2=0;
for(i=0;i<256;i++)
buff_2+=AD_Data();
if(buff_2>buff_1)
return (buff_2-buff_1)/256;
else
return (buff_1-buff_2)/256;
}
//共模抑制比测量
int CMRR(void)
{
int i;
long int Temp;
SET_ADDR(0x40);
WRITE_DATA(0x10);
Delay(512);
AD_Enable();
AD_Select(0x04);
Temp=0;
for(i=0;i<200;i++)
{
Temp+=AD_Data();
Delay(1);
}
return Temp/256;
}
//开环放大倍数测量
void KAV(void)
{int i;
long int Temp;
SET_ADDR(0x40);
WRITE_DATA(0x13);
Delay(512);
AD_Enable();
AD_Select(0x04);
Temp=0;
for(i=0;i<200;i++)
{
Temp+=AD_Data();
Delay(1);
}
return Temp/200;
}
//带宽增益积测量
void BWG(void)
{ unsigned int i;
AD_Enable();
AD_Select(0x03);
for(i=0xFFFF;i>0x7fff;i-=4)
{
SET_ADDR(0x08);
WRITE_DATA(i);
SET_ADDR(0x10);
WRITE_DATA(i>>8);
WATCHDOG_CLEAR();
if(AD_Data()<0x2000)
return i;
}
return i;
}
//上升时间测量
int Rise_Time(void)
{
SET_ADDR(0x20);
WRITE_DATA(0x00);
return READ_DATA();
}
void Delay(int interval)
{
Time=0;
while(Time<interval)
WATCHDOG_CLEAR();
}
frequency_up()
{
if(Div>=0x8000)
Div--;
SET_ADDR(0x08);
WRITE_DATA(Div);
SET_ADDR(0x10);
WRITE_DATA(Div>>8);
WATCHDOG_CLEAR();
}
frequency_down()
{
if(Div<0xffff)
Div++;
SET_ADDR(0x08);
WRITE_DATA(Div);
SET_ADDR(0x10);
WRITE_DATA(Div>>8);
WATCHDOG_CLEAR();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -