⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dq2.c

📁 基于单片机89C52的冲击检流计的源代码
💻 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 + -