聚丰项目 > 自动灌溉

自动灌溉

农业是用水大户,近年来农业用水量约占经济社会用水总量的62%,部分地区高达90%以上,农业用水效率不高,节水潜力很大。大力发展农业节水,在农业用水量基本稳定的同时扩大灌溉面积、提高灌溉保证率,是促进水资源可持续利用、保障国家粮食安全、加快转变经济发展方式的重要举措。 我们开发的自动灌溉可以有效解决目前的问题。

zhaobolove zhaobolove

分享
3 喜欢这个项目
团队介绍

zhaobolove zhaobolove

团队成员

赵波 工程师

分享
项目简介
农业是用水大户,近年来农业用水量约占经济社会用水总量的62%,部分地区高达90%以上,农业用水效率不高,节水潜力很大。大力发展农业节水,在农业用水量基本稳定的同时扩大灌溉面积、提高灌溉保证率,是促进水资源可持续利用、保障国家粮食安全、加快转变经济发展方式的重要举措。 我们开发的自动灌溉可以有效解决目前的问题。
硬件说明

自动灌溉系统由控制器、泵房触摸屏、团部信息中心、云端服务组成。

控制器作为系统核心设置泵房,由触摸屏对其状态进行监控。同时系统设置有无线GPRS网络,供应急使用。

团部信息中心与泵房连接通过以太网的方式连接,查看控制器数据、视频信息等。z


这里的控制器 是 :开发板 NUCLEO-F401RE

blob.png


blob.png


软件说明

本项目中, 控制器的开发 ,是重点

软件采用:

mbed. 在线编译器

网址 https://www.mbed.com/en/platform/cloud/#

进入 后,点击 开发, 然后选择开发板



部分代码如下:


/*********************************************************************************/

//宏定义

/*********************************************************************************/


int xdata ModDI ;//0-16

int xdata ModDO ;

char xdata  Read[45][2];

char xdata  Hold[178][2];


sbit P3_2=P3^2;

/*---------------------------------------------------------------------------

调用方式:定时器0

函数说明: 1ms

---------------------------------------------------------------------------*/


void InitTimer0()

{


TMOD=TMOD&0xF0;

TMOD |= 0x01;//F8CD =1000@22.1184

TL0 = 0xCD  ;//1085ns= FC18@11.0592 1000ns=FC18@12M

TH0 = 0xF8;

TR0 = 1;

ET0 =1 ; // 定时器0中断  

}

/*---------------------------------------------------------------------------

调用方式:串口1

函数说明:串口初始化,不倍速0xFD波特率9600 @11.0592  or 19200 @22.1184

0xFA波特率9600 @22.1184 

---------------------------------------------------------------------------*/

void initUart1(void)

{

SCON=0x50;//PCON &= 0x7F;//波特率不倍速

TMOD=TMOD&0x0f;

TMOD=TMOD|0x20;

TH1=0xFA;

TL1=0xFA; 

TR1=1; 

ES=1;

 }

void SendByte1( char cSend)

{

SBUF=cSend;

while(!TI);

TI = 0;  //发送, 当发送完毕硬件置1.

}

void SendStr1(char  *pStr,unsigned char len)

{

unsigned char i=0;

  unsigned char j=1;

/*do{

    SendByte1(pStr[i++]);

while(j++);

     }while(i<len);   */

   for(i=0;i<len;i++) //

      {

   SendByte1(pStr[i]);         //发送当前字符

while(j++);//51单片机12M晶振,1us*255=2.6ms

 }



}


/*---------------------------------------------------------------------------

调用方式:串口1

函数说明:串口初始化,不倍速0xFD波特率9600 @11.0592  19200 @22.1184

---------------------------------------------------------------------------*/

void initUart2(void)

{

    S2CON = 0x50;   //串口2工作在方式1  10位异步收发 S2REN=1允许接收

    BRT = 0xFA;   //独立波特率发生器初值  高4位 0:T0 12T 0:T1 12T 0:串口0 12T 1:允许独立波特率运行

    AUXR = 0x10;    //BRTR=1 独立波特率发生器开始计数 低4位,0:不倍频  0:12T   0:使用1KRAM  0:串口1选T1产生波特率

    IE2 =0x01;//开串口2中断  ES2=1

}

void SendByte2(char dat)

{

S2BUF =dat;                    //写数据到UART2数据寄存器

    while(!(S2CON&S2TI));  //若S2TI=0,在此等待

    S2CON&=~S2TI;  //S2TI=0

}


void SendStr2(char str[], unsigned char n)

{

    unsigned char i=0;

unsigned char j=1;

if(n<25)

for(i=0;i<n;i++) //检测字符串结束标志

      {

   SendByte2(str[i]);         //发送当前字符

while(j++);//51单片机12M晶振,1us*255=2.6ms

 }

}


/*-------------------------------------------------------------------

软件延时

--------------------------------------------------------------------*/

void InitADC()

{

unsigned int i=5000;

    P1ASF = 0xF0;                   //设置P1口为AD口   0x14=P1.2,1.4位AD

    ADC_RES = 0;                    //清除结果寄存器

    ADC_CONTR =ADC_POWER | ADC_SPEEDLL; //打开ADC电源 转换周期540

    while(i--);                       //ADC上电并延时

}


unsigned char GetADCResult(unsigned char ch)

{

    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;

    _nop_();                        //等待4个NOP

    _nop_();

    _nop_();

    _nop_();

    _nop_();                        //等待4个NOP

    _nop_();

    _nop_();

    _nop_();

    while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成

    ADC_CONTR &= ~ADC_FLAG;         //Close ADC


//return ADC_RES;

    return (ADC_RES <<2 + ADC_LOW2);    //返回ADC结果

//return (ADC_RES*4 + ADC_LOW2); 

} //float( ADC )*4.85/1024 ,  4.85为电源电源即参考电压

// float (ADC) * 2.5/ ADCref, ADCref为2.5V的参考电压读数 串330-470电阻TL431


unsigned int ADCbufA[7];

unsigned int ADCbufB[7];

unsigned int ADCbufC[7];

unsigned int ADCbufD[7]; 

unsigned int readADC(unsigned char ch,unsigned int Buf[])

{

char i,j,N=7;

unsigned int temp;

   

for(i=0;i<6;i++)//后面的数据依次向前推。最前的数据丢掉。

Buf[i]=Buf[i+1];


    Buf[6]= GetADCResult(ch) <<2 + ADC_LOW2;  //把最新的数据放最后



   for (j=0;j<N-1;j++)  //重新排序

   {

      for (i=0;i<N-j;i++)

      {

         if ( Buf[i]>Buf[i+1] )

         {

            temp = Buf[i];

            Buf[i] = Buf[i+1]; 

            Buf[i+1] = temp;

         }

      }

   }

   temp=0;

   for(i=1;i<(N-1);i++)   //去掉最小,最大值,求和

   {  

      temp = temp + Buf[i];

   }

return temp/5;  //求平均

}


/*********************************************************************************/

//变量定义

/*********************************************************************************/

bit bDoAuto ;  

bit bConfirm ;

bit bManStop;


bit bBKAuto ;  

bit bBKChange ;

bit bBKNG ;  

bit bBKDoing ;

 

sbit DO_Fa = P0^0;

sbit DO_Pump = P0^1;

sbit DO_2 = P0^2;

sbit DO_3 = P0^3;


sbit DI_0 = P0^4;

sbit DI_1 = P0^5;

sbit DI_2 = P0^6;

sbit DI_3 = P0^7; 



bit flagA=0;

bit flagB=0;

bit bSend=0;

bit err=0;

bit bStandby=1;

bit bTimeUp=0;//手动定时时间关

bit bStop=0;// 手动停止

unsigned char rx_countA=0; 

unsigned char rx_countB=0; 


char xdata RxBufA[100];

char RxBufB[5];

char xdata ModBK [100];

char TxCom [8];        

unsigned int timeoutA =0;        

unsigned int timeoutB =0;


unsigned int oneSecond =0;


unsigned int nTimeUp=0;


unsigned char ChangeDelay=0;


unsigned char DecodeAddr=1;


unsigned char nStopDelay=0;



union var

{  

       char c[6];  

       unsigned long i;  

}p;


struct node

{

    int X00:1;     //位段a,占4位

    int X01:1;

    int X02:1;

    int X03:1;

    int X04:1;

    int X05:1;     //位段a,占4位

    int X06:1;

    int X07:1;

    int X10:1;     //位段a,占4位

    int X11:1;

    int X12:1;

    int X13:1;

    int X14:1;

    int X15:1;     //位段a,占4位

    int X16:1;

    int X17:1;   

};


union varnode

{  

       struct node D;  

       int Mod;  

}DI,DO;



void update()

{

  

//  ModDI=  (char)DI_3<<7 | (char)DI_2<<6 | (char)DI_1<<5 | (char)DI_0 <<4 |(char)bBKDoing<<3 | (char)bBKNG<<2 |(char)bBKChange << 1 | (char)bBKAuto ; ;;

//  ModDO= (char)!DO_3<<7 | (char)!DO_2<<6 | (char)!DO_Pump<<5 | (char)!DO_Fa <<4 |(char)bBKDoing<<3 | (char)bBKNG<<2 |(char)bBKChange << 1 | (char)bBKAuto ; ;;



    DI.D.X00= bBKAuto; 

DI.D.X01= bBKChange;  

DI.D.X02= bBKNG; 

DI.D.X03= bBKDoing;

 

DI.D.X04= DI_0; 

DI.D.X05= DI_1;

DI.D.X06= DI_2;

DI.D.X07= DI_3;   


   ModDI=DI.Mod;





    DO.D.X00= bDoAuto;//手自动

DO.D.X01=bConfirm;//确认

DO.D.X02=bManStop;//手动停

 

//DO.D.X03=buf[4]!=0?1:0;

 

DO.D.X04=!DO_Fa; //DO -00

DO.D.X05=!DO_Pump;  //DO-01



   ModDO=DO.Mod;





}


void sendGroup()

{

 TxCom[0]= 06 ;// Group:06 32 N1 N2 N3 N4 0x0d先发高位后发低位


 TxCom[1] = Hold[3][0] ;  

 TxCom[2] = Hold[3][1] ;

 TxCom[3] = Hold[4][0] ;

 TxCom[4] = Hold[4][1] ;

 TxCom[5] = Hold[5][0] ;      

 TxCom[6] = Hold[5][1] ;


 SendStr2(TxCom,7);

 bSend=1;

}

void sendCheck(char addr ,char cmd)

{

 TxCom[0]= 02 ;// Group:06 32 N1 N2 N3 N4 0x0d先发高位后发低位


 TxCom[1]= addr  ; 

 

 switch(cmd)

 {  

 case 1:  // read status

TxCom[2]= 0x15  ;

break;

 case 2:  // ctrol On

TxCom[2]= 0x11  ;

break;

   case 3:  // ctrol Off

TxCom[2]= 0x22  ;

break;

 case 4:  // Reset

TxCom[2]= 0x77  ;

break;


 }


 SendStr2(TxCom,3);

 bSend=1;

}

void ManStop(unsigned int i)

{

DO_Pump=DO_OFF;

   

if(bStop==0)nStopDelay =0;

bStop=1;

    if(nStopDelay >= i) 

{

bConfirm=0; 

p.i=0 ;

 sendGroup();


  nStopDelay =0;

bManStop=0;

bTimeUp=0;

nTimeUp=0;

}

}




//#define GetBitH(dat,i) ((dat&((int)1<<i)) 1:0)

//#define SetBitH(dat,i) ((dat)|=((int)1<<(i)))

//#define ClearBitH(dat,i) ((dat)&=(~((int)0x01<<(i))))



 //int a = 127;  bit_set(&a,8,1);

 //  position是指定位(取值范围为1~48);flag表示置0还是置1操作

void SetBit(  unsigned char position, bit flag)

{

unsigned long a = _lrol_(1,position-1);// 1<<(position-1);

    if (flag)

        p.i |= a;


    else

        p.i &= ~a;


Read[20][0]=p.c[0];

Read[20][1]=p.c[1];

Read[21][0]=p.c[2];

Read[21][1]=p.c[3];

Read[22][0]=p.c[4];

Read[22][1]=p.c[5];

}


void SetBitNG(  unsigned char position, bit flag)

{

unsigned long a = _lrol_(1,position-1);// 1<<(position-1);

    if (flag)

        p.i |= a;


    else

        p.i &= ~a;


Read[23][0]=p.c[0];

Read[23][1]=p.c[1];

Read[24][0]=p.c[2];

Read[24][1]=p.c[3];

Read[25][0]=p.c[4];

Read[25][1]=p.c[5];

}

 /*

bit GetBit(unsigned char position)//1-48

{

unsigned long a = _lrol_(1,position-1);


if(p.i&a==0x1)

 return 1;

return 0;

}  */


 /*---------------------------------------------------------------------------

函数说明:CRC 高位字节值表

---------------------------------------------------------------------------*/

static unsigned char code Cal_CRC_Hi[] = {

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,                                                             

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 

} ;

/*---------------------------------------------------------------------------

函数说明:CRC低位字节值表

---------------------------------------------------------------------------*/

static unsigned char code Cal_CRC_Lo[] = {

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,

0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,

0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,

0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,

0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,

0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,

0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,

0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,

0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,

0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,

0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,

0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,

0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,

0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,

0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,

0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,

0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,

0x43, 0x83, 0x41, 0x81, 0x80, 0x40 

};

unsigned int CRC_chek(unsigned char *puchMsg, unsigned char usDataLen)

{

unsigned char uchCRCHi = 0xFF ;    // 高CRC字节初始化 

unsigned char uchCRCLo = 0xFF ;    // 低CRC 字节初始化

unsigned int  uIndex ;                  // CRC循环中的索引 


while (usDataLen--)                // 传输消息缓冲区  

  {

    uIndex = uchCRCHi ^ *puchMsg++ ; // 计算CRC         

    uchCRCHi = uchCRCLo ^ Cal_CRC_Hi[uIndex] ;

    uchCRCLo = Cal_CRC_Lo[uIndex] ;

  }

  //    uchCRCHi=1;

  //uchCRCLo=2;

return (((unsigned int)(uchCRCLo) << 8) | uchCRCHi) ;

//return (uchCRCHi << 8 | uchCRCLo) ;

}





void ProcessModbus(char buf[],count)

{

char i;

unsigned int temp;

char addr,len;

//int crcData=buf[count]*256 + buf[count-1];

//    if(crcData==CRC_chek(buf,count) && buf[0]==0x01 )

addr=buf[3];

    if( buf[0]==0x01 )

{ 

switch(buf[1])

{

  case 0x01:  // 读 数字输出


   ModBK[0]=0x01; //buf[0]

ModBK[1]=0x01; //buf[1] buf[2,3]=RegAddr

ModBK[2]=0x01;

ModBK[3]=ModDO ;

temp=CRC_chek(ModBK,4);

ModBK[5]=(char)(temp%256);

ModBK[6]=(char)temp/256;


SendStr1(ModBK,6);


  break; 

  case 0x02:  // 读 数字输入


     ModBK[0]=0x01; //buf[0]

ModBK[1]=0x01; //buf[1] buf[2,3]=RegAddr

ModBK[2]=0x01;

ModBK[3]=ModDI ;

temp=CRC_chek(ModBK,4);

ModBK[5]=(char)(temp%256);

ModBK[6]=(char)temp/256;


SendStr1(ModBK,6);

  break;

  case 0x05:  // 写 数字输输出


switch(buf[3])

{

case 0:

bDoAuto=DO.D.X00= buf[4]!=0?1:0;//手自动

break;


case 1:

bConfirm=DO.D.X01=buf[4]!=0?1:0;//确认

break;


   case 2:

bManStop=DO.D.X02=buf[4]!=0?1:0;//手动停

break;

case 3:

DO.D.X03=buf[4]!=0?1:0;

break;

case 4:

DO_Fa=DO.D.X04=buf[4]!=0?1:0; //DO -00

break;

case 5:

DO_Pump=DO.D.X05=buf[4]!=0?1:0;  //DO-01

break;

case 6:

DO.D.X06=buf[4]!=0?1:0;

break;

case 7:

DO.D.X07=buf[4]!=0?1:0;

break;

 

}

 

SendStr1(buf, count+1);



  break;


  case 0x03://读 多个Hold

 

ModBK[0]=0x01; //buf[0]

ModBK[1]=0x03; //buf[1] buf[2,3]=RegAddr

len= buf[5];

ModBK[2]=len*2;

 

for(i=0;i<len;i++)

{

ModBK[3+2*i]=Hold[addr][1];       //第一个字节存放高位值  //电流[16]L,[17]H

ModBK[4+2*i]=Hold[addr][0];   //第二个字节存放地位值

addr++;

}

temp=CRC_chek(ModBK,2*len+3);

ModBK[3+2*len]=(char)(temp%256);

ModBK[4+2*len]=(char)temp/256;


SendStr1(ModBK,2*len+5);


  break;

  case 0x06: //写一个 Hold 返回相同

  

  Hold[buf[3]][1]=buf[4];

  Hold[buf[3]][0]=buf[5];

  SendStr1(buf, count+1);

  break;

  case 0x10://写多个 hold

   

   ModBK[0]=0x01; //buf[0]

ModBK[1]=0x10; //buf[1] buf[2,3]=RegAddr

ModBK[2]=buf[2] ; 

ModBK[3]=buf[3];

ModBK[4]=buf[4];

ModBK[5]=buf[5];

       for(i=0;i<buf[5];i++)

       {

               Hold[buf[3]][1]  =buf[7+2*i];

               Hold[buf[3]++][0]=buf[8+2*i];

       }

       temp=CRC_chek(ModBK,6);  

       ModBK[6]=(char)(temp%256);

       ModBK[7]=(char)temp/256;

       SendStr1(ModBK,8);


  break;   

  case 0x04: //读 多个Read


ModBK[0]=0x01; //buf[0]

ModBK[1]=0x04; //buf[1] buf[2,3]=RegAddr

ModBK[2]=buf[5]*2;

 

for(i=0;i<buf[5];i++)

{

ModBK[3+2*i]=Read[buf[3]][1];       //第一个字节存放高位值  //电流[16]L,[17]H

ModBK[4+2*i]=Read[buf[3]++][0];   //第二个字节存放地位值

}

temp=CRC_chek(ModBK,2*buf[5]+3);

ModBK[3+2*buf[5]]=(char)(temp%256);

ModBK[4+2*buf[5]]=(char)temp/256;

SendStr1(ModBK,2*buf[5]+5);


  break;      

}

P3_2=1;  

}

else

P3_2=0;

}



/*********************************************************************************/

//   主函数

/*********************************************************************************/


void main(void)

{

 

  InitTimer0();

  initUart1();

  initUart2();

 

  InitADC();


  EA=1;


  P0M1= 0xFF;   //  1111,1111  高4位设置10. 高阻输入

  P0M0=0x0F;//0000,1111  低4位设置11,开漏输出,


  P0=0x0F;//低4位 输出为1,经过8550,不吸合。


  while(1)

  {

if( DI_0 || DI_1) //压力,变频器异常停泵 报警

{

bBKNG=1;

DO_Pump=DO_OFF;

bBKDoing=0;


if( bBKNG==0)

{

if(bDoAuto  )//自动模式

  {

bBKAuto =1;

bBKChange=1;


bManStop=0;

DO_Fa=DO_ON; //出水阀

DO_Pump=DO_OFF;//泵

  Read[2][0] =ChangeDelay;


if(ChangeDelay >=6  && bBKChange )

{

ChangeDelay=0;  

bBKChange=0;

  }

if(bConfirm)//确定  bConfirm设为1bConfirm

{    

//开始根据设置的逻辑进行灌溉; ----------------------------------------------------------

bStandby=1;





if(ChangeDelay >=10  && DO_Pump==0 )

{

ChangeDelay=0;  

DO_Pump=DO_ON;

   bBKDoing=1;

   bStandby=1;

flagB=1;

  }   

  }

    else   ///重新设置 bConfirm设为0

   {

   DO_Pump=DO_OFF;

bBKDoing=0;

bStandby=0;

flagB=0;

}

  

  }

else //手动模式

  {

bBKAuto =0;

bBKChange=1;  

DO_Fa=DO_ON; //出水阀

DO_Pump=DO_OFF;//泵


Read[2][0] =ChangeDelay;

if(ChangeDelay >=6  && bBKChange )

{

ChangeDelay=0;  

bBKChange=0;

  }

if(bConfirm) //确定  bConfirm设为1

{

   

sendGroup();  //执行手动的泵

if(ChangeDelay >=10  && DO_Pump==0 )

{

ChangeDelay=0;  

DO_Pump=DO_ON;


bBKDoing=1; 

bStandby=0;

bStop=0;


flagB=1;

bStandby=1;

  }

}

else////重新设置 bConfirm设为0

   {

 DO_Pump=DO_OFF;


bBKDoing=0; 

bStandby=0;

flagB=0;

}

 

switch(Hold[2][0])//手动停止方式

{

case 0:// 人工按停止

if(bManStop)

{  


 ManStop(10);

     

}

break;

case 1://定时到停止

 if(bBKDoing)

 {

  bTimeUp=1;

  if(nTimeUp >= ( Hold[6][1]<<8 + Hold[6][0] ))

 {

   

 ManStop(10);

 }

 }

break;

case 2://水量到停止

/* if( >= ( Hold[6][1]<<8 + Hold[6][0] ))

 {

 DO_Pump=DO_OFF;

 }

*/

if(bBKDoing)  

// if( Read[nHumidity][1]<<8+Read[nHumidity][0] >= ( Hold[6][1]<<8 + Hold[6][0] ))

 {

 

 ManStop(30);


 }

break;

case 3://湿度到停止

if(bBKDoing)  

// if( Read[nHumidity][1]<<8+Read[nHumidity][0] >= ( Hold[6][1]<<8 + Hold[6][0] ))

 {

 

 ManStop(30);


 }


break;

}

   

  }

 }


 

    if(flagA)

{

  

   

  // 处理modbus

  //SendStr1(RxBufA,rx_countA);  


ProcessModbus(RxBufA,rx_countA-1);


     bDoAuto =Hold[1][0]^0;  

 bConfirm=Hold[1][0]^1;

 bManStop=Hold[1][0]^2;

 bConfirm=Hold[1][0]^3;

rx_countA=0;         

   timeoutA =0; 

 flagA=0;


}

if(flagB || err)

{

  if(bStandby )

  {

  if(err)

{

  err=0;

  //NG 写入

  SetBitNG( DecodeAddr, 1) ;

}

else if( DecodeAddr==RxBufB[1])

{

 //OK 写入 ,ONOFF写入RxBufB

  SetBit(DecodeAddr,(bit)(RxBufB[2]&0x1));

<

演示效果

blob.pngblob.png

blob.png

blob.png

评论区(0 )