📄 main4.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 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 + -