📄 dq2.c
字号:
#include <reg52.h>
#include <math.h>
#define uint unsigned int
#define ulong unsigned long
#define uchar unsigned char
//#define th 0x27
//#define tl 0x11
sbit busy=P3^2;
sbit pol=P0^0;
sbit ov=P0^1;
sbit clr=P1^0;
sbit windows=P1^1;
sbit swspdt=P1^2;
sbit range=P1^7;
sbit switch1=P1^4;
sbit switch2=P1^5;
sbit xiaoyin=P3^7;
sbit led_clock=P1^3;
sbit led_data=P1^6;
int i_0,i_1,i_2,i_3,i_4,h_1,r,i_5,i_6,i_7,i_8;
ulong t0,t1;
uchar dis_val[6],sign,dot1;
uchar dis_num[11]={0x03,0xf3,0x26,0x62,0xd2,0x4a,0x0a,0xe3,0x02,0x42,0xff};
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, black//
uchar dis_1[6]={0xfe, 0x92, 0x0e, 0x1f, 0x1f, 0x03};
// - , H, E, L, L, O ,0k//
uchar dis_2[6]={0xfe,0x0e,0xbe,0xbe,0x3a,0xbe};
// - , E, R, R, O, R //
void delay(n)
{
ulong ii;
for(ii=0;ii<n;ii++)
{
;
}
}
//---------------------------------------------
//-------------------------------------------------------
void display(s,dot)
uchar dot;
uchar s[6];
{
int k;
uchar i,j;
i_3=pol;
if(i_3==1)
{
s[0]=0xff;
sign=0;
}
else
{
s[0]=0xfe;
sign=1;
}
r=range;
if(dot!=0)
{
switch(r)
{
case 1: s[4]&=0xfd; dot1=4; break;
case 0: s[3]&=0xfd; dot1=3; break;
}
}
if(s[1]==0x03)
{
for(i=1,j=0;i<6;)
{
if(s[i]==0x03)
{
s[i]=0xff;
i++;
}
else
break;
}
}
//-----------------------------------------------display+xiaoyin--------------
xiaoyin=0;
for(i=0;i<6;i++)
{
for(k=0;k<8;k++)
{
led_clock=0;
led_data=(bit)(s[i]&0x01);
s[i]>>=1;
led_clock=1;
}
}
xiaoyin=1;
//-----------------------------------------------------------------------------
}
void display1(s,dot)
uchar dot;
uchar s[6];
{
int i,k;
i_3=pol;
if(i_3==1)
{
s[0]=0xff;
sign=0;
} //----------------------------------------------
else
{
s[0]=0xfe;
sign=1;
}
r=range;
if(dot!=0)
{
switch(r)
{
case 1: s[4]&=0xfd; dot1=4; break;
case 0: s[3]&=0xfd; dot1=3; break;
}
}
//-----------------------------------------------------------------------
xiaoyin=0;
for(i=0;i<6;i++)
{
for(k=0;k<8;k++)
{
led_clock=0;
led_data=(bit)(s[i]&0x01);
s[i]>>=1;
led_clock=1;
}
}
xiaoyin=1;
//-----------------------------------------------------------------------
}
/*数码转换子程序*/
void hex_dec(ulong da)
{
uint i;
ulong var=10000;
if(da==0)
{
for(i=1;i<6;i++)
dis_val[i]=dis_num[0];
}
else
for (i=1;i<6;i++)
{
dis_val[i]=da/var;
da=da-dis_val[i]*var;
var=var/10;
dis_val[i]=dis_num[dis_val[i]];
}
}
/*计数器1的中断*/
void timer1() interrupt 3
{
h_1++;
}
main()
{
clr=0;
display(dis_1,0);
delay(400);
TMOD=0x5d;
TR0=0;
TR1=0;
delay(10);
while(1)
{
TMOD=0x5d;
TR0=0;
TR1=0;
delay(10);
clr=0;
if (swspdt) /*当打到5V挡时*/
{
meas:
switch1=0; /*选用10k积分电阻*/
switch2=1;
h_1=0;
while(busy)
{;}
while(!busy)
{;}
/*设定T1为计数方式,计数40000个产生中断*/
EA=1;
ET1=1;
TR1=1;
TH1=0X63;
TL1=0Xc7;
if (!swspdt)
goto zero;
/*40000个数记到时产生中断,并关闭计数器*/
while(!h_1)
{;}
clr=1;
TR1=0;
h_1=0;
if (!swspdt)
goto zero;
/*等待电流信号*/
while(!windows)
{
if (!swspdt)
goto zero;
}
/*电流信号到来时开时钟*/
clr=0;
while(!busy)
{;}
/*用计数器T0计BUSY线的长度*/
TH0=0x00;
TL0=0x00;
TR0=1;
/*用计数器T1计10000个数*/
TH1=0xd8;
TL1=0xf0;
TR1=1;
while(!h_1);
/*正向积分过程完成后改换积分电阻*/
switch2=0 ;
switch1=1 ;
while(busy)
{;}
TR0=0;
i_1=TH0*256+TL0;
i_1-=10000;
i_2=i_1;
hex_dec(i_1);
i_4=ov;
if (i_4==1)
{
display(dis_2,0);
clr=1;
goto l1;
}
else
display(dis_val,1);
delay(80);
i_1=i_2;
clr=1;
//----------------------------------------------
/*通讯部分------------------------------------*/
i_8=i_1;
i_5=i_8%100;
i_6=i_8/100;
i_6=i_6%100;
i_7=i_8/10000;
i_7=i_7%100;
SCON=0x50;
PCON=0x00;
TMOD=0x22;
TH1=0xf3;
TL1=0xf3;
TR1=1;
SBUF=sign;
delay(80);
SBUF=dot1;
delay(80);
SBUF=i_7;
delay(80);
SBUF=i_6;
delay(80);
SBUF=i_5;
delay(80);
TR1=0;
//-------------------------------------------------
l1: delay(1);
}
else /*当打到0挡时*/
{
zero:
switch1=0; /*选用10k积分电阻*/
switch2=1;
clr=0;
h_1=0;
while(busy)
{if(swspdt)
goto meas;
}
while(!busy)
{
if(swspdt)
goto meas;
}
/*设定T1为计数方式,计数40000个产生中断*/
EA=1;
ET1=1;
TR1=1;
TH1=0X63;
TL1=0Xc7;
if(swspdt)
goto meas;
/*40000个数记到时产生中断,并关闭计数器*/
while(!h_1)
{if(swspdt)
goto meas;
}
clr=1;
TR1=0;
h_1=0;
if(swspdt)
goto meas;
/*等待延时信号*/
delay(1000);
if(swspdt)
goto meas;
/*延时信号到来时开时钟*/
clr=0;
while(!busy)
{if(swspdt)
goto meas;
}
/*用计数器T0计BUSY线的长度*/
TH0=0x00;
TL0=0x00;
TR0=1;
/*用计数器T1计10000个数*/
TH1=0xd8;
TL1=0xf0;
TR1=1;
if(swspdt)
goto meas;
while(!h_1)
{
if(swspdt)
goto meas;
}
/*正向积分过程完成后改换积分电阻*/
switch2=0 ;
switch1=1 ;
while(busy)
{if(swspdt)
goto meas;
}
TR0=0;
i_1=TH0*256+TL0;
i_1-=10000;
if (i_1<0) i_1=-i_1; //--------------------------------------------------------------------
hex_dec(i_1);
if(swspdt)
goto meas;
i_4=ov;
if (i_4==1)
display(dis_2,0);
else
display1(dis_val,1);
if(swspdt)
goto meas;
delay(8000);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -