/*the main programe structure*/
#include <stdio.h>
#include <reg51.h>
#include <math.h>
unsigned char ge,shi, bai, qian, jiaozhun,cr0,cr1,cr2,cr3,cr4,FSCode=2,RangeCode=3;
unsigned char FSCodeM=0,RangeCodeM=0;
char RangeM,sp3;
char SelectF=0,SelectR=0;/*ControlCode=22;/*31;*/
int Y=0,eoc=0,temp=0,i=0,j=0,Rref,Radjust;
int Rx=0;
void rcm(),dcvm(),readbcd(),zeroc();
void delay(void)
{
;
}
void delay1(void)
{/*extern int i;*/
for(j=0;j<3000;j++){;}
}
void delay50ms()
{ /*extern int i; */
for(j=0;j<5000;j++){;}
}
void EOCR() /*转换结果读取函数*/
{ /*extern int Y; */
LP1: P3|=0X08;/*while(!P3^3); wait EOC,get the ad convertion,*/
delay(); /*need delay??*/
sp3=P3;
sp3&=0X08;
if(sp3==0) goto LP1; /*test the P3^3 0 or 1*/
else
P3&=0X7F; /*P3.7置零,写控制信号WD有效*/
P1|=0X0F;
delay();
P1=0X88;
delay();
delay();
P3=0X80;
P1&=0XF7;
delay(); /*delay*/ /*Tacc=3.25us*/
delay();
P1=0XF0; /*无效地址7*/
P1|=0XF0; /*先对p1高四位数据口置1*/
delay();
jiaozhun=P1;
P1=0X01; /*个位寄存器地址=1*/
P1|=0XF0;
delay();
ge=P1;
P1=0X02; /*十位寄存器地址=2*/
P1|=0XF0; /*先对p1高四位数据口置1*/
delay();
shi=P1; /*保存十位数据,应右移四位*/
P1=0X03; /*百位寄存器地址=3*/
P1|=0XF0; /*先对p1高四位数据口置1*/
delay();
bai=P1; /*保存百位数据,应右移四位*/
P1=0X04; /*千位寄存器地址=4*/
P1|=0XF0;
delay();
qian=P1;
ge>>=4;
shi>>=4;
bai>>=4;
qian>>=4;
jiaozhun>>=4;
if(i<50){
Y=ge;
Y=Y+shi*10;
Y=Y+bai*100;
Y=Y+qian*1000;
}
else {
temp=ge;
temp=temp+shi*10;
temp=temp+bai*100;
temp=temp+qian*1000;
/*temp=jiaozhun; */
P1=0X0C;
P3&=0X77; /*P3.7置零,写控制信号WD有效*/
i=0;
SelectF=0;
}
/*y=ge+shi*10+bai*100+qian*1000;*/
Y=Y-temp;
if(Y>=6000){Y=Y-10000;}
/*Y=Y+55;*/
/*if(Y>4500&&Y<5000){Y=Y-4932;} */
P1=0X08;
P3&=0X7F;
delay();
delay();
P3|=0X80;
/*jiaozhun>>=4;*/
/*Y=Y-jiaozhun;
/*P3&=0XF7; /*INT1=0;/*IE1=0;*/
}
void WCCF()
{
cr0=cr0*16; /*根据电路要求左移4位**/
cr1=cr1*16;
cr2=cr2*16;
cr3=cr3*16;
cr4=cr4*16;
/*P3|=0X80;
delay();*/
P3&=0X7F; /*P3.7置零,写控制信号WD有效*/
delay();
P1|=0X0F; /*P1.3=1,即RD无效,地址=7wu*/
/*P1=0X88; /*HOLD=1,RD无效*/
delay();
P1=0X88; /*HOLD=1,RD无效*/
delay();
P1|=0X0F; /*,RD=1 ,adress=7防止干扰*/
delay();
cr0|=0X08;
P1=cr0; /*由于电路的要求cr0 之前已经左移4位 对寄存器0写入控制字*/
delay();
P1|=0X0F; /*防止不稳定情况*/
cr1|=0X09;
P1=cr1; /*对寄存器1写入控制字*/
delay();
P1|=0X0F;
cr2|=0X0A;
P1=cr2; /*对寄存器2写入控制字*/
delay();
P1|=0X0F; /*防止不稳定情况*/
cr3|=0X0B;
P1=cr3; /*对寄存器3写入控制字*/
delay();
P1|=0X0F; /*防止不稳定情况*/
cr4|=0X0C;
P1=cr4; /*对寄存器4写入控制字*/
delay();
P1|=0X0F; /*完成对寄存器的写入*/
P1=0X08; /*HOLD=0,RD无效*/
delay();
P3|=0X80; /*P3.7置1,写控制信号WD无效*/
/*delay();*/
}
void MVF() /*电压测量函数FSCode=1 or 2*/
{/*P3=0XF1;
FSCodeM=FSCode;
RangeCodeM=RangeCode;
cr0=0X00;
cr4=0X01;
cr1=0X05; /*filter short and filter on =1*/
if(FSCode==1){cr3=0X0A;} /*直流电压测量*/
else {cr3=0X06;} /*交流电压测量*/
switch(RangeCode)
{case 1: /*400mv量程*/
P3=0XF9; /*400mV量程电压测试前端继电器控制电路可以与电阻测量电路相同*/
cr1=0X0D;
cr2=0X00;
cr3&=0X0D;
break;
case 2: /*4V量程*/
cr1=0X05;
cr2=0X01;
break;
case 3: /*40V量程*/
cr2=0X02;
break;
case 4: /*400V量程*/
cr2=0X04;
break;
case 5: /*4000V量程 实际为1000V*/
cr2=0X08;
break;
}
WCCF(); /*写控制字*/
}
void MRF() /*电阻测量函数FSCode=3*/
{ /*P3=0XF0; /*前端形成电阻测量电路*/
FSCodeM=FSCode;
RangeCodeM=RangeCode;
cr0=0X00; /*此处可以进行优化*/
cr1=0X05;
cr3=0X09; /*ohms measurement*/
cr4=0X01;
switch(RangeCode)
{case 1: /*400 欧姆量程 xxx.x*/
cr2=0X08;
Rref=1; /*参考电压为1k Rref=0.1*/
Radjust=20; /*待调后决定*/
break;
case 2: /*4k 欧姆量程 x.xxx*/
cr2=0X04;
Rref=10; /*参考电压为10k*/
Radjust=24; /*待调后决定*/
break;
case 3: /*40k欧姆量程 xx.xx*/
cr2=0X02;
Rref=10; /*参考电压为101k*/
Radjust=6; /*待调后决定*/
break;
case 4: /*400k欧姆量程 xxx.x*/
cr2=0X01;
Rref=10; /*参考电压为1.11M*/
Radjust=6; /*待调后决定*/
break;
case 5: /*4M欧姆量程 x.xxx*/
cr1=0X0D;
cr2=0X00;
Rref=10; /*参考电压为10M*/
Radjust=2; /*待调后决定*/
break;
case 6: /*40M欧姆量程 xx.xx*/
cr1=0X0F; /*待详查核对*/
cr2=0X00;
cr4=0X01;
Rref=10;
Radjust=6; /*待调后决定*/
break;
}
WCCF(); /*写控制字*/
}
void MCF() /*测量电路通断FSCode=4*/
{ /*P3=0XF0; /*前端形成通断测试电路*/
FSCodeM=FSCode;
cr0=0X00; /*此处可以进行优化*/
cr1=0X05;
cr3=0X09; /*ohms measurement*/
cr4=0X01;
cr2=0X08; /*用400 欧姆量程*/
Rref=1; /*参考电压为1k*/
WCCF();
/*if(-50<Y<50) /*test continuity, if less than 50 OHM, mesn the circuit is shorten*/
/* {cr0=0X06; /*set the information of beeper on*/
/* WCCF(); }
*/
}
void MDF() /*测量二极管函数FSCode=5,400mv 输入,VCR_C=1 DIODE_TEST_C=1*/
{/* P3=0XF5; /*前端形成二极管测试电路*/
FSCodeM=FSCode;
cr0=0X00; /*此处可以进行优化*/
cr4=0X01;
cr1=0X0F; /*除以5的模式*/
cr2=0X00;
cr3=0X08;
WCCF();
}
void MIF() /*电流测试函数,对应功能选择码是4(DC) or 5(AC) 先仅设置一个档位*/
{ /*P3=0XF3; /*前端形成电流测量电路*/
FSCodeM=FSCode;
RangeCodeM=RangeCode;
cr0=0X00; /*此处可以进行优化*/
cr4=0X09;
cr1=0X01; /**/
cr2=0X00;
if(FSCode==4){cr3=0X08;} /*直流电流测量*/
else {cr3=0X04;} /*交流电流测量*/
WCCF();
}
main()
{
/*RESTAR: i=1; */
/* while(1) /*endless loop*/
P3&=0X7F;
P1=0X68;
delay();
P1=0X00;
delay();
RESTAR: if(FSCode==1||FSCode==2)
{P3=0XF0; /*控制继电器,形成电压测试电路*/
LPV1: MVF();
LPV2: EOCR(); /*读取转换结果*/
Y=Y+55;
Y=Y+0; /*数据结果处理 待补*/
if(FSCode==FSCodeM&&RangeCodeM==RangeCode) goto LPV2;
if(!RangeCodeM==RangeCode) goto LPV1;
/*else break; */
}
else if(FSCode==3)
{P3=0XF9; /*前端形成电阻测量电路*/
P3=0XE9;
delay();
LPR1: MRF();
LPR2: EOCR(); /*读取转换结果*/
if(Y>4500&&Y<5500)
{Y=Y-4952; /*可以省去,说明输入为空,资料给定值也为49520*/
Rx=0;
}
else{ Y=Y+Radjust; /*数据结果处理 待补*/
if(RangeCodeM==1)
{Rx=Y*10;
}
else{ Rx=Y*Rref;}
Rx=Rx/5; /*转换代码到结果的转换公式*/
}
Rx=Rx+0;
if(FSCode==3&&RangeCodeM==RangeCode) goto LPR2;
if(!RangeCodeM==RangeCode) goto LPR1;
/*else break; */
}
else if(FSCode==4||FSCode==5)
{P3=0XF3; /*前端形成电流测量电路*/
LPI1: MIF();
LPI2: EOCR(); /*读取转换结果*/
/*数据结果处理 待补*/
if(FSCodeM==FSCode&&RangeCodeM==RangeCode) goto LPI2;
if(!RangeCodeM==RangeCode) goto LPI1;
/*else break; */
}
else if(FSCode==6)
{//P3=0XF1;