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

📄 main.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 STARTMESSAGE "简易高压测试仪:\nV2.11 2007-5-11\n  珠海晶研佳信\nTel:0756-3366219"
code char StartMessage[]="简易高压测试仪:\nV2.11 2007-5-11\n  珠海晶研佳信\nTel:0756-3366219";
#define BASECALIBRATIONMESSAGE "连接测试线\n断开负载\n按开始键自校……\n"
#define CYCLE (-10000)
#define STD_RESISTOR 1056
#define MIN_RESISTOR ((int)(STD_RESISTOR*0.8+0.5))
#define MAX_RESISTOR ((int)(STD_RESISTOR*1.2+0.5))
#define STD_CAPACITOR 500
#define MIN_CAPACITOR ((int)(STD_CAPACITOR-200))
#define MAX_CAPACITOR ((int)(STD_CAPACITOR+200))

#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  DA=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 ParamC0[8]={-1,-1,-1,-1,0,0,0,0};
unsigned int MinR,MaxR,MinC,MaxC,nR,nC;
unsigned long StdR0,StdC0;
//#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 Display(char);
char Remote(void);
bit CheckAuto(bit);
char WaitKey(void);
long Tests(char,unsigned int);
bit CalC(void);
bit ComPrint(char *);
void DisplayData(unsigned char,unsigned int);
bit EEWrite8(char);
unsigned char EERead8(void);
void EEStart(void);
void EEStop(void);
bit EEWrite(char,char);
unsigned char EERead(char);
unsigned int GetInt(void);
void LongPrint(unsigned long);
unsigned long LngRead(unsigned char);
void DisParam(void);
void LmWrite(void);
void BsWrite(void);
void Waiting(void);
void DeftVal(char);

void main(void)
{
	char i;
   	Initial();
	CB=0;
	twingle=0;
//	StartTest=1
	DeftVal(0);
	DeftVal(1);
	i=EERead(0);
//	i=0xff;
	if(i&1)
	{
		LmWrite();
		i&=~1;
		EEWrite(0,i);
	}
	else
	{
		MinR=EERead(0x11)*256+EERead(0x10);
		MaxR=EERead(0x13)*256+EERead(0x12);
		MinC=EERead(0x21)*256+EERead(0x20);
		MaxC=EERead(0x23)*256+EERead(0x22);
		nR=EERead(0x17)*256+EERead(0x16);
		nC=EERead(0x27)*256+EERead(0x26);
	}
	if(i&2)
	{
		//StdR0=Tests(RstdNo,1000);
		//StdC0=Tests(CstdNo,1000);
		BsWrite();
		i&=~2;
		EEWrite(0,i);
	}
	else
	{
		StdR0=LngRead(0x30);
		StdC0=LngRead(0x40);
	}
	LedShow(0xff,0xff);
//	DelayMs(2000);
	LcdClear();
  	LcdPrint(StartMessage );
	ComPrint("\n");
  	ComPrint(StartMessage);
	LedTest();
	Bell(100);DelayMs(100);Bell(100);
	LcdClear();
	LcdPrint(BASECALIBRATIONMESSAGE);
	LedShow(0xbf,0xbf);
	OkLed=0xbf;
	Waiting();
	LcdClear();
	LcdPrint("\n  正在自校……\n");
	LedShow(0xc0,0xc0);
	StdR=Tests(RstdNo,1000);
	for(i=4;i<8;i++)
	{
		ParamC0[i]=Tests(i,1000);
	}
//	StdC0=31480;
	StdC=Tests(CstdNo,1000);
	StdC-=StdC0;
	LedShow(0xff,0xff);
	Bell(500);
	DisParam();
	LcdClear();
	LcdPrint("按开始键\n开始测试……\n");
	while(1)
	{
		Waiting();	
		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)
			{
				Display(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)
//		StdC=Test0(CstdNo,1000)-StdC0;
//		DelayMs(50);
//		StdR=Test0(RstdNo,1000);
		//StdR=1.0*StdR0*StdR/(StdR0-StdR);
		{
		    LcdClear();
			for(i=0;i<6;i++)
			{
				Display(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");
	}
}
void DeftVal(char t)
{
	switch(t)
	{
	case 0:
		MaxR=MAX_RESISTOR;
		MinR=MIN_RESISTOR;
		MaxC=MAX_CAPACITOR;
		MinC=MIN_CAPACITOR;
		nR=300;
		nC=1000;
		break;
	case 1:
		StdR0=8873430L;
		StdC0=11500L;
		break;
	}
}
void Waiting(void)
{
	char i,d;
//	unsigned long R0,C0;
	while(1)
	{
		i=WaitKey();
		if(i!=0)
		{
			if(i>'Z') i-='z'-'Z';
			switch(i)
			{
			case 'A':AUTO=1;ComPrint("Auto");return;
			case 'S':AUTO=0;ComPrint("Step");return;
			case 'D':
				DisParam();
				break;
			case 'P':
				ComPrint("New parameter:\n");
				ComPrint("Min_R: ");MinR=GetInt()==0?MinR*10:GetInt();DisplayData(0x80,MinR);ComPrint(" KΩ\n");MinR/=10;
				ComPrint("Max_R: ");MaxR=GetInt()==0?MaxR*10:GetInt();DisplayData(0x81,MaxR);ComPrint(" KΩ\n");MaxR/=10;
				ComPrint("Min_C:");MinC=GetInt()==0?MinC:GetInt();DisplayData(0x82,MinC);ComPrint(" PF\n");
				ComPrint("Max_C:");MaxC=GetInt()==0?MaxC:GetInt();DisplayData(0x83,MaxC);ComPrint(" KΩ\n");
				ComPrint("Std_R: ");nR=GetInt()==0?nR*10:GetInt();DisplayData(0x83,nR);ComPrint(" KΩ\n");nR/=10;
				ComPrint("Std_C:");nC=GetInt()==0?nC:GetInt();DisplayData(0x83,nC);ComPrint(" PF\n");
				LmWrite();
				break;
			case 'C':
				ComPrint("Are you sure to calibrate?(Y/N)\n");
				td=2000;
				while((i=Remote())==0 && td!=0);
				if(i!='Y'&&i!='y') break;
				LcdClear();
				LcdPrint("\n  * Calibration *\n");
				ComPrint("Calibrate...\n");
				StdR0=Tests(RstdNo,1000);
				StdC0=Tests(CstdNo,1000);
				BsWrite();
				ComPrint("StdR0=  ");LongPrint(StdR0);ComPrint("\n");
				ComPrint("StdC0=  ");LongPrint(StdC0);ComPrint("\n");
				ComPrint("Calibrate Ok!\n");
				LcdClear();
				LcdPrint("\n  Calibration OK\n");
				break;
			case 'R':
			case 'F':
				ComPrint("Reset to default ");
				if(i=='R')
					ComPrint("parameter?(Y/N)\n");
				else
					ComPrint("calibration?(Y/N)\n");
				td=2000;
				while((d=Remote())==0 && td!=0);
				if(d!='Y'&&d!='y') break;
				if(i=='R')
				{
					DeftVal(0);
					LmWrite();
				}
				else
				{
					DeftVal(1);
					BsWrite();
				}
				DisParam();	
				break;				
			}
		}
	}
}
void BsWrite(void)
{
	EEWrite(0x30,StdR0 % 256);
	EEWrite(0x31,(StdR0>>8) % 256);
	EEWrite(0x32,(StdR0>>16) % 256);
	EEWrite(0x33,(StdR0>>32) % 256);
	EEWrite(0x40,StdC0 % 256);
	EEWrite(0x41,(StdC0>>8) % 256);
	EEWrite(0x42,(StdC0>>16) % 256);
	EEWrite(0x43,(StdC0>>32) % 256);
}
void LmWrite(void)
{
	EEWrite(0x10,MinR % 256);
	EEWrite(0x11,MinR / 256);
	EEWrite(0x12,MaxR % 256);
	EEWrite(0x13,MaxR / 256);
	EEWrite(0x14,STD_RESISTOR % 256);
	EEWrite(0x15,STD_RESISTOR / 256);
	EEWrite(0x16,nR % 256);
	EEWrite(0x17,nR / 256);
	EEWrite(0x20,MinC % 256);
	EEWrite(0x21,MinC / 256);
	EEWrite(0x22,MaxC % 256);
	EEWrite(0x23,MaxC / 256);
	EEWrite(0x24,STD_CAPACITOR % 256);
	EEWrite(0x25,STD_CAPACITOR / 256);
	EEWrite(0x26,nC % 256);
	EEWrite(0x27,nC / 256);
}
void DisParam(void)
{
	ComPrint("Parameter:\n");
	ComPrint("MinR=  ");DisplayData(0x80,MinR*10);ComPrint(" KΩ\n");
	ComPrint("MaxR=  ");DisplayData(0x81,MaxR*10);ComPrint(" KΩ\n");
	ComPrint("MinC=  ");DisplayData(0x82,MinC);ComPrint(" PF\n");
	ComPrint("MaxC=  ");DisplayData(0x83,MaxC);ComPrint(" PF\n");
	ComPrint("StdR=  ");DisplayData(0x83,nR*10);ComPrint(" KΩ\n");
	ComPrint("StdC=  ");DisplayData(0x83,nC);ComPrint(" PF\n");
	ComPrint("StdR0= ");LongPrint(StdR0);ComPrint("\n");
	ComPrint("StdC0= ");LongPrint(StdC0);ComPrint("\n");
}
unsigned long LngRead(unsigned char a)
{
	unsigned long d;
	char i;
	d=0;
	for(i=3;i>=0;i--)
	{
		d<<=8;
		d+=EERead(a+i);
	}
	return(d);
}
unsigned int GetInt(void)
{
	unsigned char d;
	unsigned int re;
	re=0;
	d=0;
	while(1)
	{
		if(RI)
		{
			d=SBUF;
			RI=0;
			if(d>'9' || d<'0') break;
			re=re*10+d-'0';
			td=10; //50ms
		}
		if(d!=0 && td==0) break;
	}
	return(re);
}
bit EEWrite8(char d)
{
	char i;
	bit re;
	SCL=0;
	for(i=0;i<8;i++)
	{
		d<<=1;
		SDA=CY;
		SCL=0;
		SCL=0;
		SCL=1;
		SCL=1;
		SCL=1;
		SCL=0;
	}
	SDA=1;
	SCL=0;
	SCL=0;
	SCL=1;
	re=SDA;
	SCL=1;
	SCL=1;
	SCL=0;
	return(re);
}
unsigned char EERead8(void)
{
	char i;
	char d;
	d=0;
	SCL=0;
	for(i=0;i<8;i++)
	{
		d<<=1;
		SCL=0;
		SCL=1;
		if(SDA) d++;
		SCL=1;
		SCL=1;
		SCL=0;
	}
	return(d);
}
void EEStart(void)
{
	SCL=0;
	SDA=1;
	SCL=0;
	SCL=1;
	SDA=0;
	SCL=1;
	SCL=1;
	SCL=0;
}
void EEStop(void)
{
	SCL=0;
	SDA=0;
	SCL=0;
	SCL=1;
	SDA=1;
	SCL=1;
	SCL=1;
	SCL=0;
	SDA=0;
}
bit EEWrite(char ad,char d)
{
	char i;
	for(i=0;i<100;i++)
	{
		EEStart();
		if(EEWrite8(0xa0)) {EEStop();continue;}
		i=0;
		if(EEWrite8(ad)) {EEStop();continue;}
		i=0;
		if(EEWrite8(d)) {EEStop();continue;}
		EEStop();
		DelayMs(20);
		return(0);
	}
	return(1);
}
unsigned char EERead(char ad)
{
	char i;
	char d;
	for(i=0;i<100;i++)
	{
		EEStart();
		if(EEWrite8(0xa0)) {EEStop();continue;}
		i=0;
		if(EEWrite8(ad)) {EEStop();continue;}
		i=0;
		EEStart();
		if(EEWrite8(0xa1)) {EEStop();continue;}
		i=0;
		d=EERead8();
		EEStop();
		return(d);
	}
}
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) return(1);
		td=10;	//50ms
		td=10;while(!TI) if(td==0) return(0);
		if(st[i]==0xa)
		{
			SBUF=0xd;TI=0;
			td=10;while(!TI) if(td==0) return(0);
		}
		SBUF=st[i];TI=0;
	}
	return(0);
} 
/*void CalC(char i)
{
	float f;
	f=4.0*TestData[i]/4000;
	f=sqrt(1-f)/2;
	f=f*4000+0.5;

⌨️ 快捷键说明

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