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

📄 whx40318.c

📁 流量计程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/*********************************************************************************************/
/*新电路板。实现4个接收电流环(即四个4-20毫安到1-5伏转换,加入3-fell)ok ,     修互感器    */
/*日期:2003年12月24日。时间:08点40分.1本实验为cod与监控仪的通信实验;(扩展了串行口的情况下)*/
/*2>流量计与监控仪的子窜口进行通信,加上了电脑的通信协议,实现双流量计通信                   */
/*进行485的传输,与宋利强的电脑连接                                                          */
/*加入了cod显示子程,包括BCD_FLOAT子程.                                                      */
/*加入了交大的30秒传一次;仅传输流量值和cod值。                                              */
/* 以rs232来采集流量计瞬时值                  0xf948;                                        */
/*加入FAH命令用于采集怡文的COD值。加入4-20ma的采集部分。                                    */
/*加入短信模块,手机号码用键盘输入。服务器传送控制命令1:实时值。2定时发送值.稳定 3加延迟。  */
/*改rx_232接收命令  ,区分互感器与4-20ma. 可修改流量计量程。                                 */
/*********************************************************************************************/
 #include<math.h>
 #include<absacc.h>
 #include<intrins.h>
 #include<reg51.h>
 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 #include<ctype.h>
 #define  YEAR_ADR    XBYTE[0xf909]
 #define  MONTH_ADR   XBYTE[0xf908]
 #define  DAY_ADR     XBYTE[0xf907]
 #define  HOUR_ADR    XBYTE[0xf904]
 #define  MIN_ADR     XBYTE[0xf902]
 #define  SEC_ADR     XBYTE[0xf900]
 #define  PC_8255     XBYTE[0xfb10]
 #define  PA_8255     XBYTE[0xfb00]
 #define  PB_8255     XBYTE[0xfb08]
 #define  CON_8255    XBYTE[0xfb18]
 #define  AD_0809     XBYTE[0xfa00]
 #define  SEC_12887   XBYTE[0xf901]
 #define  MIN_12887   XBYTE[0xf903]
 #define  HOUR_12887  XBYTE[0xf905]
 #define  CONA_12887  XBYTE[0xf90a]
 #define  CONB_12887  XBYTE[0xf90b]
 #define  CONC_12887  XBYTE[0xf90c]
 #define  LCD_CON     XBYTE[0xfc00]
 #define  LCD_DATA    XBYTE[0xfc01]
 #define  LCD_STATE   XBYTE[0xfc02]
 #define  MIMA        33333

bit	secflg;
bit     ruflg;
bit     sms_change_ok,sms_ok,sms_state,sms_send_begin;
bit     sms_state_v1,sms_state_v2;
bit     rx_ack2=1,rx_data2=1;rx_end2=1;
sbit    wdog  =0xB3;
sbit    P16   =0x96;              /*控制MAX485*/
sbit    P17   =0x97;              /*控制fsoc为9600的RS232*/
sbit    ADRO_0=0x90;              /*上位机传输数据*/
sbit    ADRO_1=0x91;
sbit    ADRI_0=0x93;              /*下位机传输数据*/
sbit    ADRI_1=0x94;


unsigned char k;
xdata float     sl;                                /*瞬时流量  */
xdata float	fsl;                            /*缓存流量值*/
xdata float     cod;                                    /*cod值     */
    /*float     fsl1;*/
xdata float     codma=0,itv2=0,itv3=0,itv4=0;     /*用4-20ma来采集模拟cod值*/
unsigned char ADC_VALUE;

float 	  zjsl;                                   /*流量计的立方单位计数器*/
unsigned char	count30s=0,count59s=0;            /*rs232或485的计数脉冲*/
xdata   unsigned char   ary[10];
xdata   unsigned char   chflag[8];
xdata   unsigned char   phonenum[6];
idata	unsigned char	year;
idata	unsigned char	month;
idata	unsigned char	day;
xdata	unsigned char	insyear,insmonth,insday,curmonth,curyear;

xdata	unsigned char	lastday[12],lm[8],ln[8],led_bz;
xdata	unsigned long	total;
xdata	unsigned int	hday[12][31];
xdata	unsigned int  	worktime[8][12][31];
xdata   unsigned char   data_cod_value[8][7];
xdata   unsigned char   temp_data_cod_value[7];
idata   unsigned char   *ppp;                        /*datatrans用的指针*/

 idata unsigned char verify0=0,ii=0;
 bit  rx_ack=1,rx_data=1,rx_end=1;
 idata unsigned char *pp;                        /*子串口1用的指针*/

 idata unsigned char verify10=0,verify11=0,ii1=0,ii11=-1;
 bit   rx_ack1=1;
 idata unsigned char *pp1;                       /*子串口2,cod用的指针*/
 xdata unsigned char temp_verify=0;

 idata unsigned char  ii2=0,ii20=0,ii21=0;       /*子串口3用的指针*/

 xdata unsigned char TIME_MIN,TIME_HOUR,SMS_COMMAND,DELAY_MIN;
 unsigned int btoi(unsigned int x, unsigned int y)/*byte to int */
{xdata unsigned  int i,temp=0;
 for(i=0;i<=y;i++)
   temp=XBYTE[x+i]*pow(10,y-i)+temp;
 return temp; /*x=0xf920;x=0xf924;*/
}

 void cod_tran_code(bit adr0,bit adr1,unsigned char temp)/*子串口传输字节数据子程*/
 {  TI    =0;
    ADRI_0= adr0;
    ADRI_1= adr1;
    SBUF  = temp;
    while(!TI);
    TI    = 0;
    ADRI_0= 1;
    ADRI_1= 1;
 }

void watchdog()
{ wdog=1;
        ;;
  wdog=0;
        ;;
}


 receive()  interrupt 4
{ EA=0;
  if(RI)
  { RI=0;
    switch ( P1&0x03 )
   {case 0:if (rx_ack2)
             { if (SBUF==0xD7) { ii2=1;goto end; }
               if (ii2==1)
                 { if (SBUF<=147) { ii21=SBUF; rx_ack2=0; ii2=0;goto end; }
                   else { switch (SBUF)
                           { case   0xFF: break;                        /*字节长度不符*/
                             case   0xFD: sms_change_ok=1; break;      /*模块工作,灯全亮*/
                             case   0xFC: if (ii20<3){ sms_state=1; ii20++;} /*发送失败三次,不发*/
                                          else { sms_state=0; ii20=0;}
                                          break;
                             case   0xFB: sms_state=1; break;          /*模块忙*/
                             case   0xFA: sms_change_ok=1; ii20=0;break;  /*发送成功*/
                             default    : break;
                           } rx_ack2=1;ii2=0;
                        }
                 }
            }
           else if ( rx_data2 )
                  { if (ii2<=5&&SBUF==phonenum[ii2] ) { ii2++ ; goto end; }
                    else if (ii2==6)
                            switch(SBUF)
                          { case  0: if (ii21==8) { SMS_COMMAND=0;sms_send_begin=1;} break;
                            case  1: ii2++;sms_state_v1=1;goto end;
                            case  2: ii2++;sms_state_v2=1;goto end;
                            default: break;
                          }
                    else if (sms_state_v1)
                           { TIME_MIN=1440/SBUF;/*次数转换为分钟数*/
                             if (TIME_MIN>=60) TIME_HOUR=TIME_MIN/60;
                             SMS_COMMAND=1; sms_send_begin=1;
                           }
                    else if (sms_state_v2)
                           { DELAY_MIN=SBUF; SMS_COMMAND=2;sms_send_begin=1;}
                  }
           err3: rx_ack2=1;rx_data2=1;rx_end2=1;sms_state_v1=0;sms_state_v2=0;ii2=0;ii21=0; break;
    case 1:if(rx_ack1)
            { for(;ii1<14;)
             { ii1++;
               if(ii1<8) { *pp1=SBUF; verify10^=SBUF; pp1++; } /*异或校验*/
               else verify11^=SBUF;
               if (ii1<14)  goto end;
             }
             if ( (ii1==14)&&(verify11==verify10) ) { rx_ack1=0; goto end;}
            err1: rx_ack1=1;ii1=0;verify10=0;verify11=0;pp1=&temp_data_cod_value;
            }
            break;
    case 2: if(rx_ack)
              { for(;ii<=4&&SBUF==0x40;)
                   { ii++;
                     if(ii==5) { rx_ack=0; ii=0; }
                     goto  end;
                   }
                  if(ii<5||ii>5) goto err;
              }
            else if(rx_data)
                     { for(;ii<=3;)
                         {  ii++;
                            *pp=SBUF;
                            verify0^=*pp;              /*异或校验*/
                            pp++;
                            goto end;
                         }
                       if( (ii<4||ii>4)||(SBUF!=verify0) ) goto err;
                            rx_data=0;
                            ii=0;
                            goto end;
                     }
              else if(rx_end)
                      for(;ii<=4&&SBUF==0x23;)
                         { ii++;
                           if(ii==5) { sl=fsl; goto  err; }
                           goto  end;
                         }
         err: rx_ack=1;rx_data=1;rx_end=1;ii=0;verify0=0;pp=&fsl;
         break;
  case 3:break;
  default: break;
  }
 }
 end: TI=0;EA=1;
}
float BCD_FLOAT(x,y)
  unsigned char x,y;
{ unsigned char H_valuex,L_valuex,H_valuey,L_valuey;
  L_valuex=x&0x0f;                                      /*个*/
  L_valuey=y&0x0f;                                      /*百*/
  H_valuex=(x&0xf0)>>4;                                 /*十*/
  H_valuey=(y&0xf0)>>4;                                 /*千*/

  return ( H_valuey*1000+L_valuey*100+H_valuex*10+L_valuex );
}

void datatrans_232()
{
char *pp;
unsigned char xx=0;
unsigned char verify=0;
unsigned int ii=0;
    TI=1;
    for(ii=0;ii<=4;ii++)
       	{
	 while(!TI);
	 TI=0;
	 SBUF=0x40;
	}
    for(ii=0;ii<=7;ii++)
	 {
	  while(!TI);
	  TI=0;
	  xx=chflag[ii];
	  SBUF=xx;
	  verify=verify^xx;
	 }


    for(ii=8;ii<=11;ii++)
	 {
	  while(!TI);
	  TI=0;
	  SBUF=0x03;xx=0x03;verify=verify^xx;
	  }

    pp=&sl;
    for(ii=0;ii<=3;ii++)
	  {while(!TI);

	   TI=0;
	   SBUF=*pp;xx=*pp;verify=verify^xx;
	      pp=pp+1;
	   }
    for(ii=0;ii<=27;ii++)
        {   while(!TI);
	    TI=0;
	    SBUF=0;xx=0;verify=verify^xx;
        }
    pp=&cod;
    for(ii=0;ii<=3;ii++)
        {  while(!TI);
	   TI=0;
	   SBUF=*pp;xx=*pp;verify=verify^xx;
           pp=pp+1;
        }


    for(ii=0;ii<=499;ii++)
           {
	    while(!TI);
	    TI=0;
	    SBUF=0;xx=0;verify=verify^xx;
	    }

    while(!TI);
    TI=0;
    SBUF=verify;
    for(ii=0;ii<=4;ii++)
	    {
	     while(!TI);
	     TI=0;
	     SBUF=0x23;
            }
}

busy()
{ bit flg=1;
     char s;
   while(flg)
     { s=LCD_STATE;
       flg=(bit)(s&0x80);
     }
}
readtime()
{ curyear=YEAR_ADR;
  year=YEAR_ADR;
  month=MONTH_ADR;
  day=DAY_ADR;
}

delay(unsigned char t)     /*delay 200us,t=30;Because adc0809 is 460kHZ,so it change is 157us*/
 {  unsigned char i;
     for(i=0;i<=t;i++)
            ;

  }
xs(sdz,str,su)
    unsigned char  sdz,str[10],su;
   {  char i;
     busy();
     LCD_CON=sdz;
     for(i=0;i<=su;i++)
      {
       busy();
       LCD_DATA=str[i];
      }
    }

 qinping()
{ LCD_CON=1;
  LCD_CON=1;
}
lcd_init()
 {   char i;
     for(i=0;i<=3;i++)
      {
        LCD_CON=0x30;
        delay(250);
       }
      LCD_CON=0x38;
      delay(10);
      LCD_CON=0x08;
      delay(10);
      LCD_CON=0x01;
      delay(10);
      LCD_CON=0x06;
      delay(250);
      LCD_CON=0x0c;
      delay(250);
   }

sys_init()
  {  sms_state=0;
     sms_change_ok=0;
     sms_send_begin=0;
     sms_ok=0;
     sms_state_v1=0;
     sms_state_v2=0;
     EA=0;
     SCON=0x50;

     IP=0x10;                    /*置中断优先极,串口的高*/
     TMOD=0x21;                  /*主机波特率为9600,从为2400*/
     PCON=0x80;
     TH1=0xfa;
     TL1=0xfa;

     CON_8255=0x88;              /*8255的口为A-B, C低四位输出;C高4为输入*/
     CONB_12887=0xa6;
     SEC_12887=0xc0;
     MIN_12887=0xc0;
     HOUR_12887=0xc0;
     CONB_12887=0x26;
     CONA_12887=0x20;

     lcd_init();
     qinping();

     xs(0xc3,"HANJIE ",6);
     xs(0xcb,"SHUMA",4);
     xs(0x9b,"--OK--",5);
     secflg=1;
     zjsl=0;

     TR1=1;
     IT0=1;                      /*脉冲方式*/
     IE=0x91;
  }



month_clr(unsigned char mon)
{  unsigned char i,j;
  if(mon!=curmonth)
    {
      for(i=0;i<=30;i++)
       {
         hday[mon][i]=0;
       }
      for(i=0;i<=7;i++)
        {
          for(j=0;j<=30;j++)
            {
              worktime[i][mon][j]=0;
            }
        }
   }
   curmonth=mon;

 }
unsigned char  a_d(unsigned char ch)
 { unsigned  int y=0;
   unsigned char adc,i;
   for (i=0;i<=9;i++)
      { AD_0809=ch;
        delay(30);
        adc=AD_0809;
        y=y+adc;
      }
   adc=y/10;

   return(adc);
  }
 unsigned char   adc(unsigned char ch)/*4-20mA用的*/
 { xdata unsigned int  y=0;
   xdata unsigned char adc,j,m=0;
   for (j=0;j<=19;j++)
       { AD_0809=ch;
         delay(30); /*delay 200us ,Because adc0809 is 460kHZ,so it change is 157us*/
         adc=AD_0809;
         if (adc>=51)
           { m++;
             adc=adc-51;
             y=y+adc;
           }
        }
   if (m==0)
      return(0);
   else
    { adc=y/m;
      return(adc);
    }
}
itv_caiji( unsigned char i,float *temp,unsigned int j)
{   xdata float temp_itv=0;
    ADC_VALUE=adc(i);            /*4-20ma的1*/
    temp_itv=ADC_VALUE;
    if (temp_itv!=0)
        { temp_itv=temp_itv*1.25;
          temp_itv=temp_itv*btoi(j,3);
          *temp   =temp_itv/255;
        }
 }

zd1s() interrupt 0
{
  unsigned char  d,m,h,min,x,i,bb,s;
  watchdog();
  secflg=1;
  x=CONC_12887; /*12887的中断复位*/
  if(ruflg!=1)
    { m=MONTH_ADR;
      d=DAY_ADR;
      h=HOUR_ADR;
      min=MIN_ADR;
      s=SEC_ADR;
      month_clr(m);
      lastday[m-1]=d;

      if(chflag[4]==3)  itv_caiji(4,&codma,0xf920);/*互感器不工作,4-20ma工作*/
      if(chflag[5]==3)  itv_caiji(5,&itv2 ,0xf924);
      if(chflag[6]==3)  itv_caiji(6,&itv3 ,0xf928);
      if(chflag[7]==3)  itv_caiji(7,&itv4 ,0xf92c);


      x=a_d(3);
      sl=1.51*x;
      sl=pow(sl,1.85);
      sl=0.00246*sl*0.25; /* 流量50*x */
      sl=sl*btoi(0xf944,3);
      zjsl=zjsl+sl;
      if(zjsl>=1000)
        { total+=1;
          hday[m-1][d-1]+=1;
          zjsl=zjsl-1000;
        }
      worktime[3][m-1][d-1]+=1;
      bb=1;
      led_bz=0;
      for (i=0;i<=7;i++)
         { if (XBYTE[0xf930+i]==0)
               chflag[i]=3;
           else
             { chflag[i]=0;
               x=a_d(i);
               if (x<lm[i]&&x>ln[i])
                 { chflag[i]=1;
                   led_bz=led_bz|bb;
                 }
               if(s==0)
                  worktime[i][m-1][d-1]+=1;
             }
            bb=bb<<1;
         }
      PB_8255=led_bz;

    }
      count30s++;
      count59s++;
      if(TIME_MIN>=60) x=0;
      else x=1;
      if  ( sms_state || (s==0 && ((x && (min+DELAY_MIN)%TIME_MIN==0)||(min==DELAY_MIN && h%TIME_HOUR==0))) ) /*电脑为59秒传送一次*/
         { count59s=0;              /*高电平RS485有效*/
           EA=0;
           TI=1;
           while(!TI);TI=0;SBUF=0xD7;            /*包头D7*/
           while(!TI);TI=0;SBUF=54;
           for (i=0;i<=5;i++) { while(!TI);TI=0;SBUF=phonenum[i];}  /*电话号码*/
           while(!TI);TI=0;
           if(sms_state) SBUF=SMS_COMMAND;      /*回控制字*/
           else SBUF=255;
           for (i=0;i<=7;i++) { while(!TI);TI=0;SBUF=chflag[i]; } /*设备运行状况*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -