?? 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 + -