📄 key.c
字号:
//#include<reg51.h>
#include<yh.h>
#include<absacc.h>
#include<math.h>
//按键响应函数
float V0,VI0; // 电压比较值,失调电压值
float VL0,VL1; // K1,K2闭合或断开时测得的辅助运放的输出电压
float II0; // 失调电流值
float AVD; // 测试交流差模开环电压增益AVD
float KCMR; //交流共模抑制比KCMR
uint VIB; //电压采集测量值
uchar sw,gw,xsw1,xsw2;
extern uchar key_value ; //外部中断返回键值
xdata float ad_buf[50];
//AD0809转换函数
void ad_tran(void)
{
adbusy=1;
AD0809=0; // 启动A/D转换
while(adbusy==1); // 待转换结束
delay(10);
VIB=AD0809;
// VIB=0xaa ;
V0=(float)((float)VIB/0xff)*5 ; // 十进制转换 成比较值
// VI0=(float)((float)VIB/0xff)*5 ; // 测 试
}
//输出数值转换
void in_tran(float tt)
{
sw=(uchar)tt/10; //转换得出十位的值
gw=(uchar)tt%10; //转换得出个位的值
xsw1=(uchar)(tt*10)%10; //转换得出小数点后第一位的值
xsw2=(uchar)(tt*100)%10; //转换得出小数点后第二位的值
}
//led显示错误 EFF
void led_showEFF(void)
{
COM8279=0x87; // 写显示器RAM 000H
DAT8279=table[15]; // 显示 F
COM8279=0x86; // 001H
DAT8279=table[15]; // 显示 F
COM8279=0x85; // 002H
DAT8279=table[14]; // 显示 E
}
//led显示
void led_show(void)
{
COM8279=0X87;
DAT8279=table[xsw2];
COM8279=0x86; // 写显示器RAM 000H
DAT8279=table[xsw1]; // 显示小数位
COM8279=0x85; // 001H
DAT8279=table[gw]|0x80; // 显示各位并小数点
COM8279=0x84; // 002H
DAT8279=table[sw]; // 显示十位
}
/*
//取采样出来的最大值
void cy_max(void)
{
uchar i;
for(i=0;i<50;i++)
{
ad_tran(); // ad采样 50次
ad_buf[i]=V0; // 把计算完后的比较值送给数组
delay(10); // 延时10ms
}
for(i=1;i<50;i++)
if(ad_buf[0]<ad_buf[i])
ad_buf[0]=ad_buf[i]; //取采样出来的最大值
V0=ad_buf[0];
}
*/
//取采样平均值
void cy_ary(void)
{
uchar i;
for(i=0;i<50;i++)
{
ad_tran(); // ad采样 50次
ad_buf[i]=V0; // 把计算完后的比较值送给数组
delay(10); // 延时10ms
}
for(i=0;i<50;i++)
{
V0=V0+ad_buf[i];
}
V0=V0/50;
}
//测试失调电压VI0
void key0(void)
{
PA8255=0x00;//相应的继电器设置 1000
delay(1000); //延时 100ms
cy_ary(); //取出采样50次的最大值
VI0=V0; //计算出失调电压
/*
if(VI0>4) //如果大于4则再一次进行采样
{
PA8255=0x40;//相应的继电器设置 100
delay(100); //延时
cy_ary();
VI0=V0*10;
if(VI0>40)
{
PA8255=0x00;//关闭所有继电器
delay(100);
led_showEFF();
goto loop0;
}
}
*/
in_tran(VI0);
led_show();
//loop0:
COM8279=0x80;
DAT8279=table[1];
// PC8255=; //显示单位LED灯 mV
// VI0=(float)23.22; // 测试
// ad_tran(); // 测试
}
//测试失调电流 II0
void key1(void)
{
//while(!){
PA8255=0x00;//0~0.4uA的继电器设置
delay(1000);
cy_ary();
VL0=V0;
PA8255=0x30;//0~0.4uA的继电器的设置
delay(1000);
cy_ary();
VL1=V0;
II0=VL1-VL0; //uA 0uA~0.4uA
/*
if(II0>0.4)
{
PA8255=0x40;//0.4uA~4uA的继电器设置
delay(100);
cy_ary();
VL0=V0;
PA8255=0x70;//0.4uA~4uA的继电器的设置
delay(100);
cy_ary();
VL1=V0;
II0=VL1-VL0; // uA 0.4uA~4uA
if(II0>4)
{
PA8255=0x00;//关闭所有继电器
delay(100);
led_showEFF();
goto loop1;
}
}
*/
in_tran(II0);
led_show();
//loop1:
COM8279=0x80;
DAT8279=table[2];
// PC8255=; //显示单位LED灯 uA
}
//测试交流差模开环电压增益AVD
void key2(void)
{
//相应继电器的设置
delay(100);
cy_ary();//采样最大值
VL0=2*V0*0.707;//求出有效值
if(VL0>4)//VL0大于4V则错误
{
//关闭所有继电器
delay(100);
led_showEFF();
goto loop2;
}
AVD=20*log((4/VL0)*1000);
in_tran(AVD);
led_show();
loop2:
COM8279=0x80;
DAT8279=table[3];
// PC8255=;
}
//交流共模抑制比KCMR
void key3(void)
{
/* //相应继电器的设置
delay(100);
cy_ary();//采样最大值
VL0=2*V0*0.707;//求出有效值
if(VL0>4)//VL0大于4V则错误
{
//关闭所有继电器
delay(100);
led_showEFF();
goto loop3;
}
KCMR=20*log((4/VL0)*1000);
in_tran(KCMR);
led_show();
loop3:
COM8279=0x80;
DAT8279=table[4];
// PC8255=;
*/
while(1)
{
cy_ary();
//V0=V0-1.06;
in_tran(V0);
led_show();
delay(100);
}
}
//测试单位增益带宽BWG
void key4(void)
{
uchar i,a,b,c;
PC8255=0x00;
a=0x00;
b=0x87;
for(i=0;i<8;i++)
{
c=a&0x01;
COM8279=b;
DAT8279=table[a];
a=a>>1;
b--;
}
/* uchar i,a,b,c;
a=0xff;
b=0x87;
for(i=0;i<8;i++)
{
c=a&0x01;
COM8279=b;
DAT8279=table[c];
a=a>>1;
b--;
} */
}
//用于测试采集的信号
void key5(void)
{ /*
while(1)
{
cy_ary();
V0=V0-1.06;
in_tran(V0);
led_show();
delay(100);
} */
while(1){
//测试8255;
uchar i,a,b,c;
PC8255=0xff;
/* delay(500);
PA8255=0x00;
delay(500);
*/
a=0xff;
b=0x87;
for(i=0;i<8;i++)
{
c=a&0x01;
COM8279=b;
DAT8279=table[c];
a=a>>1;
b--;
}
}
/* while(1)
{
ad_tran();
in_tran(V0);
led_show();
COM8279=0x80;
DAT8279=table[6];
delay(100);
}
*/
}
//大概延时1ms
void delay(uchar x)
{
uchar i;
while(x--)
{
for(i=0;i<53;i++)
{}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -