#include <reg52.h>
#include <absacc.h>
#include <stdio.h>
//#include <intrins.h>
//定义位选和段选地址
#define SEG_SEL XBYTE[0X7fff]
#define BIT_SEL XBYTE[0Xbfff]
#define switch0 P1
#define fosc 12 //11.0592
//测量电阻时连入555电路的电容大小
#define C 1.0e-8 //10000
//测量电容时连入电路的两个电阻大小
#define Rs1 100000 //100K
#define Rs2 43000 //待测电阻
//单位转换定义的系数
#define M 1.0e6
#define pi 3.1415926535
typedef unsigned char uchar;
/*
R为测量电容时Rs1与Rs2之和
Inter_Count为信号一个高电平期间对内部时钟计数值时的定时器1中断溢出次数
N为555信号一个高电平期间对内部时钟计数值
l为待输出的显示数值
Mea为测量值
*/
float data R,N,Inter_Count, l, Mea;
/*定义动态显示时间所需的计数初值*/
unsigned int idata time0_times;
/*定义计数初值的高八位和低八位*/
unsigned char data time0_h,time0_l;
/*定义显示位和测量超出量程标志*/
unsigned char data display_bit,Lim_Flag;
unsigned char data j,i;
unsigned char bdata p;
unsigned int a[4];
//定义温度测量值
float last;
sbit z_3=P3^3;
//sbit x0=P1^0;
//sbit x1=P1^1;
sbit Button1=P1^0; //按键1测量电阻 指示灯1
sbit Button2=P1^1; //按键2测量电容 指示灯2
sbit Button3=P1^2; //按键3测量温度 指示灯3
sbit x3=P1^3; //标志K(千欧)或nF (纳法)-------DS5 指示灯5
sbit x4=P1^4; //标志M(兆欧)或uF(微法)--------DS4 指示灯4
sbit TMDAT=P1^7;
sbit DQ=P1^7;
//电参量到频率量转换所需函数
void count();
//隔一定时间读取开关值
void dmsec(unsigned int count);
//温度模块所需函数
void tmreset(void);
void tmstart(void);
float tmrtemp(void);
void tmpre(void);
bit tmrbit(void);
unsigned char tmrbyte(void);
void tmwbyte(unsigned char dat);
void tmstart(void);
float set_point(float l);
//显示模块所需函数
void OutPut(void);
void DisPlay(float l);
typedef void (*lpFunction)(); //define the fun type
lpFunction Restartup =0x0000; //(lpFunction)0x0000;
//Restartup();
char comp_r(void)
{
x3=1;
x4=1;
count();
N=TH1*256+TL1+Inter_Count*65536;
Mea=(N*12/M)/(fosc*0.69314718*C)-Rs1;
if(Mea>1000&&Mea<900000)
Mea=Mea*1.03;
else if(Mea>=900000)
Mea=Mea*1.015;
DisPlay(Mea);
return(1);
}
char comp_c(void)
{
x3=1;
x4=1;
count();
N=TH1*256+TL1+Inter_Count*65536;
Mea=(N*12/M)/(fosc*0.69314718*R);
Mea=Mea*(1.0e12);
DisPlay(Mea);
return(1);
}
char comp_temp(void)
{ x3=1;
x4=1;
dmsec(1);
tmstart();
dmsec(1000);
last=tmrtemp();
Mea=last;
DisPlay(Mea);
return(1);
}
void main()
{
//DisPlay(Mea);
//uchar k,l;
R=Rs1+Rs2;
/* //x3=x4=0;
Button1=Button2=Button3=0;
for(k=0;k<10;k++)
{
l=1;
SEG_SEL=0xff;
if(l==1) BIT_SEL=l;
else BIT_SEL=l*2;
dmsec(120);
}
*/
switch0=0xff;
Lim_Flag=0;
Inter_Count=0;
BIT_SEL=0;
//Restartup();
do
{
if(Button1==0) //(switch0==0x06)
{
comp_r();
}
else if(Button2==0) //(switch0==0x05)
{
comp_c();
}
else if(Button3==0) //(switch0==0x03)
{
comp_temp();
}
else if(switch0==7)
{Mea=0;}
else
Mea=-1;
//if(Mea>200000)
//dmsec(1500);
//else
//dmsec(700);
}
while(1);
}
void count()
{
TR1=0;
TR0=0;
TMOD=0x92;
TH1=0x00;
TL1=0x00;
EA=1;
ET1=1;
if((Button1==1)||(Button2==1)) //((x0==1)||(x1==1)) //测量脉冲宽度(电阻、电容)
{
while(z_3==1);
TR1=1;
while(z_3==0);
while(z_3==1);
TR1=0;
}
}
void dmsec(unsigned int count)
{
unsigned int i;
while(count--)
{
for(i=0;i<125;i++)
;
}
}
/*
void delay(int useconds)
{
int s;
for(s=0;s<useconds;s++)
;
}
unsigned char reset(void)
{
unsigned char presence;
DQ=0;
delay(29);
DQ=1;
delay(3);
presence=DQ;
delay(25);
return (presence);
}
void write_bit(char bitval)
{
DQ=0;
if(bitval==1) DQ=1;
delay(5);
DQ=1;
}
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp &=0x01;
write_bit(temp);
}
delay(5);
}
unsigned char read_bit(void)
{
unsigned char i;
DQ=0;
DQ=1;
for(i=0;i<3;i++) ;
return (DQ);
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=0;i<8;i++)
{
if(read_bit()) value|=0x01<<i;
delay(6);
}
return (value);
}
float read_temp(void)
{
unsigned char a1,b1,y1,y2,y3;
unsigned char y0;
float y;
reset();
write_byte(0xcc);
write_byte(0x44);
delay(5);
reset();
write_byte(0xcc);
write_byte(0xbe);
a1=read_byte();
b1=read_byte();
y0=a1&0x0f;
y=(y0&0x08)*0.5+(y0&0x04)*0.25+(y0&0x02)*0.125+(y0&0x01)*0.0625;
y1=a1>>4;
y2=b1<<4;
y3=y1|y2;
y+=y3;
return (y);
}
*/
void tmreset(void)
{
unsigned int i;
TMDAT=0;
i=103;
while(i>0) i--;
TMDAT=1;
i=4;while(i>0) i--;
}
void tmpre(void)
{
unsigned int i;
while(TMDAT);
while(~TMDAT);
i=4;while(i>0) i--;
}
bit tmrbit(void)
{
unsigned int i;
bit dat;
TMDAT=0;i++;
TMDAT=1;i++;i++;
dat=TMDAT;
i=8;while(i>0) i--;
return (dat);
}
unsigned char tmrbyte(void)
{
unsigned char i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return (dat);
}
void tmwbyte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
TMDAT=0;
i++; i++;
TMDAT=1;
i=8; while(i>0) i--;
}
else
{
TMDAT=0;
i=8; while(i>0) i--;
TMDAT=1;
i++;i++;
}
}
}
void tmstart(void)
{
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc);
tmwbyte(0x44);
}
float tmrtemp(void)
{
unsigned char a1,b1,y1,y2,y3;
unsigned char y0;
float y;
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc);
tmwbyte(0xbe);
a1=tmrbyte();
i=8; while(i>0) i--;
b1=tmrbyte();
y0=a1&0x0f;
y=(y0&0x08)*0.5+(y0&0x04)*0.25+(y0&0x02)*0.125+(y0&0x01)*0.0625;
y1=a1>>4;
y2=b1<<4;
y3=y1|y2;
y+=y3;
return (y);
}
void time0_int(void) interrupt 1 //定时分时显示中断
{
TH0=time0_h;
TL0=time0_l;
OutPut();
}
void counter1_int(void) interrupt 3 //测量脉冲宽度记数溢出中断
{
Inter_Count=Inter_Count+1; //记录溢出次数
TH1=0;
TL1=0;
}
void OutPut(void)
{
if(Lim_Flag==1) //错误报告
{
switch(j)
{
case 0:p=0xF9;break;
case 1:p=0xF7;break;
case 2:p=0xBF;break;
case 3:p=0xF7;break;
}
}
//带小数点显示的位置
else if(i==j) //((i==1&&display_bit==0x01)||(i==2&&display_bit==0x02)||(i==3&&display_bit==0x02))
{
switch(a[j])
{
case 0:p=0xBF;break;
case 1:p=0x86;break;
case 2:p=0xDB;break;
case 3:p=0xCF;break;
case 4:p=0xE6;break;
case 5:p=0xED;break;
case 6:p=0xFD;break;
case 7:p=0x87;break;
case 8:p=0xFF;break;
case 9:p=0xEF;break;
}
}
else
{
switch(a[j])
{
case 0:p=0x3F;break;
case 1:p=0x06;break;
case 2:p=0x5B;break;
case 3:p=0x4F;break;
case 4:p=0x66;break;
case 5:p=0x6D;break;
case 6:p=0x7D;break;
case 7:p=0x07;break;
case 8:p=0x7F;break;
case 9:p=0x6F;break;
}
}
BIT_SEL=0;
SEG_SEL=p;
BIT_SEL=display_bit;
j--;
if(j==-1) {j=3;} //循环显示
if(display_bit<0x08)
{
display_bit=display_bit*2;
}
else
{
display_bit=0x01;
}
}
void DisPlay(float l) //显示程序
{
long q;
if(1000000>l&&l>=10000) //43000
{
l=l/1000;
x3=0;
}
else if(1000000000>l&&l>=1000000)
{
l=l/1000000;
x4=0;
}
else if (0<l&&l<=10000)
{;}
else
Lim_Flag=1;
l=set_point(l);
q