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

📄 main4.c

📁 自动检测电容值
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
//#include <string.h>
#include <intrins.h>
#include <math.h>
#include <stdio.h>
#include <borad.h> 
#include <SERIAL.H>


#define uint  unsigned int
#define uchar unsigned char
#define CYCLE (-10000)
#define STD_RESISTOR 1056
#define MIN_RESISTOR (STD_RESISTOR*0.82+0.5)
#define MAX_RESISTOR (STD_RESISTOR*1.18+0.5)
#define STD_CAPACITOR 500
#define MIN_CAPACITOR (STD_CAPACITOR-180)
#define MAX_CAPACITOR (STD_CAPACITOR+180)

#define RstdNo 8
#define CstdNo 12

//#include  "VI2C_C51.h"
//#include "ocm4x8c串.h"

//#define Debugging 1


//sbit  Rf=P3^2;
//sbit  Cf=P3^3;


sbit  DAT=P1^0;
sbit  CLK=P1^1;
sbit  CS=P1^2;
sbit  BELL=P1^3;
sbit  LCM_RST=P1^4;
sbit  LCM_CS=P1^5;
sbit  LCM_STD=P1^6;
sbit  LCM_SCLK=P1^7;
bit NormalTest=0;

sbit  RA=P2^0;
sbit  RB=P2^1;
sbit  RC=P2^2;
sbit  INH=P2^3;
sbit  CA=P2^4;
sbit  CB=P2^5;
sbit  AUTOSTEP=P2^6;
sbit  STEP=P2^7;
#define GATE0 0x08
#define GATE1 0x80


sbit Signal=P3^3;
sbit SCL=P3^6;
sbit SDA=P3^7;


bit AUTO;
bit twingle=0;
bit twingledo=0;
bit Dis=0;
unsigned char dt=0;
#define OK 33
#define NG 44
unsigned int TestData[8];
unsigned long Param0[8]={-1,-1,-1,-1,0,0,0,0};
#define stdR0 8873430
#define stdC0 13000
unsigned long stdR=10000,stdC=10000;
//unsigned long C10,C20,C30,C40;
//unsigned long R10,R20,R30,R40;
bit StartTest=0;
//uchar tdTH,tdTL;
uint tn;
//uchar tc;
//uint wtt;
char OkLed;
#define Led0 1
#define Led1 2
#define Led2 4
#define Led3 8
#define Led4 16
#define Led5 32
#define ALLOK 64
void Test(char);
void  LedSend8(char); 
void  LedShow(char,char); 
void LedTest(void);
void Bell(unsigned int);
long Test0(char,unsigned int);
void Check(char);
void DisplayData(char);
char Remote(void);
bit CheckAuto(bit);
void WaitKey(void);
long Tests(char,unsigned int);
bit CalC(void);
bit ComPrint(char * st);
void main(void)
{
	char i;
   	Initial();
	CB=0;
	twingle=0;
//	StartTest=1;
	LedShow(0xff,0xff);
	DelayMs(2000);
	ComPrint("I am ZYX\n");
	LcdClear();
  	LcdPrint("简易高压测试仪:\nV1.10 2007-5-11\n  珠海晶研佳信\nTel:0756-3366219" );
  	ComPrint("简易高压测试仪:\n");
	ComPrint("V1.10 2007-5-11\n");
	ComPrint("  珠海晶研佳信\n");
	ComPrint("Tel:0756-3366219\n" );
	NormalTest=0;
	LedTest();
	Bell(100);DelayMs(100);Bell(100);
	LcdClear();
	LcdPrint("连接测试线\n断开负载\n按开始键自校……\n");
	LedShow(0xbf,0xbf);
	OkLed=0xbf;
	WaitKey();
	LcdClear();
	LcdPrint("\n  正在自校……\n");
	LedShow(0xc0,0xc0);
//	Bell(1000);	
//	stdR0=850000;
	//while(1) Test0(9,50);
//	while(1) Test0(7,50);
	stdR=Tests(RstdNo,1000);
//	stdR=1.0*stdR0*stdR/(stdR0-stdR);
	for(i=4;i<8;i++)
	{
		Param0[i]=Tests(i,1000);
	}
//	stdC0=31480;
	stdC=Tests(CstdNo,1000);
	stdC-=stdC0;
	LedShow(0xff,0xff);
	Bell(500);
	LcdClear();
	LcdPrint("按开始键\n开始测试……\n");
	while(1)
	{	
		ComPrint("Parameter:\n");
		//ComPrint("MinR=  %5.2fMohm\n",MIN_RESISTOR/100.0);
		//ComPrint("MaxR=  %5.2fMohm\n",MAX_RESISTOR/100.0);
		//ComPrint("MinC=  %5uPF\n",MIN_CAPACITOR);
		//ComPrint("MaxC=  %5uPF\n",MAX_CAPACITOR);
		WaitKey();
//		OkLed=NgLed=0;
		OkLed=0;
		Bell(200);
		LedShow(0xff,0xff);
		LcdClear();
		LcdPrint("\n   * Testing *");
		ComPrint("TestBegin\n{\n");
		if(!AUTO) LcdClear();
		OkLed=0;
		for(i=0;i<8;i++)
		{
			DelayMs(20);
			Test(i);
//			if(i>=4) CalC(i);
			if(i<4) Check(i);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
			if(!AUTO&&i<4)
			{
				DisplayData(i);	
				if(i<5) WaitKey();
			}
		}
		P2=(P2&0xF0)|CstdNo|0XC0;							//通道设定8
		twingle=1;
		DelayMs(100);
		CalC();
//

//
		Check(4);
		Check(5);
		Check(6);		//all
		NormalTest=1;
//		if(AUTO)
		{
		    LcdClear();
			for(i=0;i<6;i++)
			{
				DisplayData(i);
			}
		}
		if(OkLed&ALLOK)
		{
			LcdPrint("  *** PASS ***");
			ComPrint("PASS\n");
			Bell(800);
		}
		else
		{
			LcdPrint("    !!FAIL!!");
			ComPrint("Fail\n");
			Bell(100);DelayMs(100);Bell(100);
		}
		ComPrint("}\nTestEnd\n\n");
		stdC=Tests(CstdNo,1000)-stdC0;
		DelayMs(50);
		stdR=Tests(RstdNo,1000);
		//stdR=1.0*stdR0*stdR/(stdR0-stdR);
	}
}
bit CalC(void)
{
	float fsum;
	unsigned int sum,adv;
	char i;
	sum=0;
	adv=0;
	for(i=4;i<8;i++)
	{
		if(4*TestData[i]>sum) sum=4*TestData[i];
		adv+=TestData[i];
	}
	adv-=sum/4;
	while(1)
	{
		fsum=0;
		for(i=4;i<8;i++)
		{
			fsum+=sqrt(1-4.0*TestData[i]/sum);
		}
		if(fsum>2+0.002)
		{
			if(adv==0)
			{
				TestData[4]=TestData[5]=8000;
				return(0);
			}
			sum-=adv;
			adv>>=1;
			continue;
		}
		if(fsum<2-0.002)
		{
			if(adv==0) break;
			sum+=adv;
			adv>>=1;
			continue;
		}
		break;
	}
	for(i=4;i<8;i++)
	{
		TestData[i]=(1-sqrt(1-4.0*TestData[i]/sum))*sum/2+0.5;
	}
	TestData[4]=1.0*TestData[4]*TestData[5]/(TestData[4]+TestData[5]);
	TestData[5]=1.0*TestData[6]*TestData[7]/(TestData[6]+TestData[7]);
	return(1);
}
bit ComPrint(char * st)
{
	char i;
	i=0;
	for(i=0;i<128;i++)
	{
		if(st[i]==0) break;
		while(!TI);
		SBUF=st[i];
		TI=0;
	}
} 
/*void CalC(char i)
{
	float f;
	f=4.0*TestData[i]/4000;
	f=sqrt(1-f)/2;
	f=f*4000+0.5;
	TestData[i]=f;
} */
long Tests(char i,unsigned int wt)
{
	char n;
	unsigned long ul,ulc;
	ul=2;
	for(n=0;n<4;n++)
	{
		DelayMs(10);
		ulc=Test0(i,wt);
		if(ulc==-1) return(-1);
		ul+=ulc;
	}
	ul>>=2;
	return(ul);
}
void  LedSend8(char d) 
{
	uchar i;
	CLK=0;
	for(i=0;i<8;i++)
	{
		 d<<=1;
		 DAT=CY;delay (10); 	 
	     CLK=1;delay (10);   
	     CLK=0;delay (10);
	}
}
void  LedShow(char hb,char lb) 
{
	CS=0;
	delay(10);
//	hb>>=1;
//	if(CY)
//	{
//		lb|=0x80;
//	}
//	else
//	{
//		lb&=~0x80;
//	}
	LedSend8(hb);	
	LedSend8(lb);	
	CS=1;
	delay (20);
	CS=0;
}
void LedTest(void)
{
	char d;
	char i;
//	twingle=1;
	d=1;
	LedShow(0xff,~0x40);DelayMs(400);
	LedShow(~0x40,0xff);DelayMs(400);
	for(i=0;i<6;i++)
	{
		LedShow(0xff,~(d));DelayMs(400);
		d<<=1;
	}
	d=1;
	for(i=0;i<6;i++)
	{
		LedShow(~(d),0xff);DelayMs(400);
		d<<=1;
	}
	LedShow(0x7f,0);DelayMs(800);
	LedShow(0,0x7f);DelayMs(800);
	LedShow(0x7f,0x7f);
}
void Bell(unsigned int t)
{
	BELL=0;
	DelayMs(t);
	BELL=1;
}

void Timer0 (void) interrupt TIMER0INT // using 1
{
	TL0=CYCLE % 256;
	TH0=CYCLE/256;	
//	TF2=0;
//	EXF2=0;
//	if(wtt) wtt--;
	if(td) td--;
	if(StartTest) return;
	if(twingle) twingledo=1;
	if(twingledo)
	{
		if(!(dt--))
		{
			dt=30;
			if(Dis=!Dis)
			{
				LedShow(0xff,0xff);
			}
			else
			{
				LedShow(OkLed,~OkLed);
				if(!twingle) twingledo=0;
			}
		}
	}
}
long Test0(char i,unsigned int wt)
{
	bit rc;
	bit Testing;
	long ul;
	unsigned char j;
	char BIE;
	unsigned char tc;
	bit lowint;
	if(i>=16) return(0);
	CB=0;							//CB=0时主测节点电容(侧电阻时)接+VCC充电,或接+VCC充电停振(测电容时)
	EX1=ET1=TR1=0;					//
	switch(i)					  	//0,1,2,3为4被测电阻 4,5,6,7为4被测电容 8为标准电阻 9为标准电容
	{
	case 0:
	case 1:
	case 2:
	case 3:
	case RstdNo:
		TMOD|=GATE1;			 	//电阻测试,TIMER1 INT1选通计时,为高开始计时
		rc=1;					 
		CA=0;					 	//CA=0:选择电阻
		tc=0;					 	//测量次数-1
		break;	//R:rc=1 C:rc=0
	default:
		TMOD&=~GATE1;		  		//电容测试,TIMER1 软件控制计时
		CA=1;						//CA=0:选择电容
		tc=200;						//测量次数-1
		rc=0;
		break;
	}
	P2=(P2&0XF0)|i|0XC0;					//通道设定

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -