?? main.c
字號:
/***************************************
RLC測試儀
***************************************/
#include<stdio.h>
#include<reg52.h>
#include<math.h>
#include<string.h>
#include"tdp.h"
#define FUN_PORT P2
#define T_STOP TCON&=~0X50
#define T_RUN TCON|=0X50
#define PRINTF(x) LCD_puts(ftos(x))
#define PUTS(s) LCD_puts(s)
#define PUTCHAR(c) w_dat(c)
#define GOTO(x,y) LCD_gotoxy(x,y)
#define R_MAX 3e6
#define L_MAX 1
#define C_MAX 1
#define T_MAX 3
//#define SOFT
bit JIAOZHUN; //校準模式標志位
uchar function; //正在使用的功能代號
uchar THH0; //T0計數擴展單元
uchar THH1;
LONG_CHAR Time;
LONG_CHAR Count;
bit have_cy; //有采樣值標志位
uchar liangcheng; //量程號
uchar code count_chuzhi[]= //各量程計數初值
{//THH0,TH0,TL0,TH1,TL1
0x1f,0x3c,0xb0,0x00,0x00,
0x00,0x00,0x00,(65536-20)>>8,65536-20,
0x00,0x00,0x00,0xff,0xff
};
float Tin,Tout;
uchar fun_addr[]={0x08,0xE0,0x11};//RLC
sbit key =P3^3;
sbit LED=P0^1;
void R_disp(float r)
{
if (JIAOZHUN) //較準
{
GOTO(0,0);
PUTS("T=");
PRINTF(Tout);
PUTS("s ");
PRINTF(Tin);
PUTS("s ");
}
else
{
GOTO(0,0);
PUTS("-------R--------");
}
GOTO(1,0);
PUTS(" Rx=");
if(r<R_MAX)
{
PRINTF(r);
PUTS("\1 \0025% ");
}
else
PUTS("OVER ");
}
void L_disp(float l)
{
if (JIAOZHUN) //較準
{
GOTO(0,0);
PUTS("T=");
PRINTF(Tout*Tout);
PUTS("s ");
PRINTF(Tin*Tin);
PUTS("s ");
}
else
{
GOTO(0,0);
PUTS("-------L--------");
}
GOTO(1,0);
PUTS(" Lx=");
if(l<L_MAX)
{
PRINTF(l);
PUTS("H \0025% ");
}
else
PUTS("OVER ");
}
void C_disp(float c)
{
if (JIAOZHUN) //較準
{
GOTO(0,0);
PUTS("T=");
PRINTF(Tout);
PUTS("s ");
PRINTF(Tin);
PUTS("s ");
}
else
{
GOTO(0,0);
PUTS("-------C--------");
}
GOTO(1,0);
PUTS(" Cx=");
if(c<C_MAX)
{
PRINTF(c);
PUTS("F \0025% ");
}
else
PUTS("OVER ");
}
float R_value(float T)
{
float code tab[][2]=
{//Ti,Ri; 按Ti升序排列
12.85e-6,0,
12.91e-6,10,
13.82e-6,100,
14.20e-6,120,
15.20e-6,220,
18.20e-6,400,
18.28e-6,470,
19.38e-6,560,
20.85e-6,610,
25.06e-6,1e3,
80.42e-6,5.1e3,
149.5e-6,10e3,
284.2e-6,20e3,
424.7e-6,30e3,
// 649.7e-6,41e3,
592.4e-6,43e3,
701.9e-6,51e3,
946.6e-6,68e3,
1.362e-3,100e3,
1.608e-3,120e3,
2.048e-3,150e3,
7.490e-3,560e3,
12.51e-3,1e6,
15.89e-3,1.2e6,
25.01e-3,2e6
};
float rx;
char i;
if(T<T_MAX)
{
for(i=0;i<sizeof(tab)/8-2;i++)
{
if(T<tab[i+1][0])break;
}
rx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
}
else rx=R_MAX; //rx=INF
if(rx<0) rx=0;
return rx;
}
float L_value(float T)
{
float code tab[][2]=
{//Ti*Ti,Li; 按Ti*Ti升序排列
43.76e-12,5.6e-6,
70.55e-12,10e-6,
649.7e-12,100e-6,
6.076e-9,1e-3
};
float lx;
char i;
T*=T;
if(T<T_MAX*T_MAX)
{
for(i=0;i<sizeof(tab)/8-2;i++)
{
if(T<tab[i+1][0])break;
}
lx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
}
else lx=L_MAX;
return lx;
}
float C_value(float T)
{
float code tab[][2]=
{//Ti,Ci; 按Ti升序排列
4.578e-6,0,
4.657e-6,5e-12,
4.736e-6,10e-12,
4.911e-6,22e-12,
5.031e-6,30e-12,
5.065e-6,33e-12,
6.045e-6,100e-12,
7.311e-6,200e-12,
10.27e-6,470e-12,
15.88e-6,1e-9,
18.89e-6,1.5e-9,
48.03e-6,4.7e-9,
88.70e-6,6.8e-9,
111.6e-6,10e-9,
239.0e-6,20e-9,
395.7e-6,47e-9,
980.0e-6,100e-9
};
float cx;
char i;
if(T<T_MAX)
{
for(i=0;i<sizeof(tab)/8-2;i++)
{
if(T<tab[i+1][0])break;
}
cx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
}
else cx=C_MAX;
if(cx<0) cx=0;
return cx;
}
/*數值濾波函數*/
float shuzhilvbo(float in)
{ static float out;
float x;
x=fover(in)?1:fabs(in-out)/in;
if(fover(x)||x>0.005) out=in;
// else if(x>0.001) out=0.95*out+0.05*in;
return out;
}
/*脈沖周計算函數*/
float puls_cycle(void)
{
float t;
if(Count.l!=0)
{
t=65536e-6*8;
t=t/Count.l;
}
else t=T_MAX;
have_cy=0;
return t;
}
void t0_int() interrupt 1 using 1
{
if((++THH0&0x7)==0)
{
T_STOP;
if(!have_cy)
{
//保存計數值
Count.c[0]=0;
Count.c[1]=THH1;
Count.c[2]=TH1;
Count.c[3]=TL1;
have_cy=1;
// LED=!LED;
}
THH0=0;
TH0=0;
TL0=0;
THH1=0;
TH1=0;
TL1=0;
T_RUN;
}
}
void ex1_int() interrupt 2 using 1
{
int i;
EX1=0;
for(i=0;i<2000;i++);
if(!key)
{
if(++function==3)function=0;
FUN_PORT=fun_addr[function];
have_cy=1;
}
IE1=0;
EX1=1;
}
void t1_int() interrupt 3 using 1
{
THH1++;
/* uchar code *p;
T_STOP;
if(!have_cy)
{
time.c[0]=0x00;
time.c[1]=THH0&0xc0; //保存采樣值
time.c[2]=TH0;
time.c[3]=TL0;
count.c[0]=TH1;
count.c[1]=TL1;
have_cy=1;
}
//重裝計數初值
p=count_chuzhi+5*liangcheng;
THH0=*p++;
TH0=*p++;
TL0=*p++;
TH1=*p++;
TL1=*p;
T_RUN; */
}
void init()
{
#ifdef SOFT
TMOD=0X20;
SCON=0X52;
TH1=0XF3;
TR1=1;
#else
TMOD=0X51; //T1計數T0計時
TR0=1;
TR1=1;
ET0=1;
ET1=1;
IT1=1; //init1邊延觸發
EX1=1;
EA=1;
FUN_PORT=fun_addr[0];
JIAOZHUN=!key;
#endif
}
main()
{
float x;
LCD_init();
init();
while(1)
{
if(have_cy)
{
Tin=puls_cycle(); //計算脈沖周期
Tout=shuzhilvbo(Tin); //數值濾波
// printf("%f",Tin);
switch(function)
{
case 0:
x=R_value(Tout);
R_disp(x);
break;
case 1:
x=L_value(Tout);
L_disp(x);
break;
case 2:
x=C_value(Tout);
C_disp(x);
break;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -