📄 main.c
字号:
#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 + -