⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于AT89S52的RLC测试仪
💻 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 + -