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

📄 process.c

📁 湖北水文信息系统水位雨量采集器的C51源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

	for(i=0;i<3;i++)
	{
				cr_cfg[i]=0;
				new_cfg[i]=0;
	}
	
	if((RecBuf[7]>=0x30)&&(RecBuf[7]<=0x39)&&
		(RecBuf[8]>=0x30)&&(RecBuf[8]<=0x39)&&
		(RecBuf[9]>=0x30)&&(RecBuf[9]<=0x39))
  {

 		/*-----------设置最小采集时间---------------*/
		if((RecBuf[7]<=0x30)&&(RecBuf[8]<=0x30)&&(RecBuf[9]<0x31))
		{
				RecBuf[7]=0x30;
				RecBuf[8]=0x30;
				RecBuf[9]=0x31;
		}
		else if((RecBuf[7]>=0x37)&&(RecBuf[8]>=0x32)&&(RecBuf[9]>=0x30))	
		{
				RecBuf[7]=0x37;
				RecBuf[8]=0x32;
				RecBuf[9]=0x30;
		}//-----------设置最大采集时间---------------//		
	
		switch(RecBuf[3])
		{
	 		 case 1 : 
								i2c_addr=i2c_addr_rainconfig;
								for(i=0;i<3;i++)
      							 	cr_cfg[i]=RecBuf[7+i];	
      			 
								/*-----------更改雨量采集时间---------------*/
      					rain_cfg=CHAR_TO_INT(cr_cfg,3);      	 		
								break;

	 		 case 2 :										
								i2c_addr=i2c_addr_levelconfig;		 		
		 						for(i=0;i<3;i++)
      							cr_cfg[i]=RecBuf[7+i];	

								/*-----------更改水位采集时间---------------*/
      					level_cfg=CHAR_TO_INT(cr_cfg,3);							   			
								break;	
		}	

   /*-----------查找当前值并写入修改后的值---------------*/
    R_block(WPAGE0,RPAGE0,i2c_addr,cr_cfg,3);    
    if((cr_cfg[0]&0x80)==0x80)
    {
     		for(i=0;i<3;i++)
      			 	new_cfg[i]=RecBuf[7+i];		
     		new_cfg[0]|=0x80;     	
  			W_block(WPAGE1,i2c_addr,new_cfg,3);
				wait_1ms();

				cr_cfg[0]&=0x7f;
				W_block(WPAGE0,i2c_addr,cr_cfg,3);
    }
    else
    {
     		for(i=0;i<3;i++)
      			 	new_cfg[i]=RecBuf[7+i];	
     		new_cfg[0]|=0x80;     	
  			W_block(WPAGE0,i2c_addr,new_cfg,3);
				wait_1ms();

				R_block(WPAGE1,RPAGE1,i2c_addr,cr_cfg,3);				
				cr_cfg[0]&=0x7f;
				W_block(WPAGE1,i2c_addr,cr_cfg,3);
    }
    cl_ack_ct(RecBuf[5],RecBuf[3],1);
  }
	return 1;
}



/*******************************************************************
                     读配置函数               
函数原型:char Rd_cfg(void)
功  能:       
  
********************************************************************/
char Rd_cfg(void)
{
	uchar i;
	uchar cr_cfg[3];
	cs=0;
	 
	switch(RecBuf[3])
	{
	  case 1 : 
				i2c_addr=i2c_addr_rainconfig;
				SenBuf[3]=0x01; 			
				break;
	  case 2 :				
				i2c_addr=i2c_addr_levelconfig;
		  	SenBuf[3]=0x02; 								   			
				break;	
	}

	/*-----------查找当前值---------------*/ 
	R_block(WPAGE0,RPAGE0,i2c_addr,cr_cfg,3);	 
	if((cr_cfg[0]&0x80)!=0x80)
	{   
   		R_block(WPAGE1,RPAGE1,i2c_addr,cr_cfg,3);   		
	}	 
	cr_cfg[0]&=0x7f;
	 
	SenBuf[5]=(RecBuf[5]|0x80);    
	SenBuf[6]=0x03;
	 
	strncpy(&SenBuf[7],cr_cfg,3); 
	
	for(i=0;i<SenBuf[6]+7;i++)
			cs+=SenBuf[i];
      
	SenBuf[SenBuf[6]+7]=cs;
	SenBuf[SenBuf[6]+8]=FRAME_END_CHAR;
	Senlen=SenBuf[6]+9;
	 
	return 1;
}


/*******************************************************************
                     写配置条件函数               
函数原型: char Wr_Conditions(void)
功  能:       
  
********************************************************************/
char Wr_Conditions(void)
{
	unsigned char i,j;
	unsigned char xdata cd_cfg[11][10],new_cd[11][10];
	
	cs=0;

	for(i=0;i<11;i++)
	for(j=0;j<10;j++)
  {
   		cd_cfg[i][j]=0x00;
			new_cd[i][j]=0x00;
	}

	for(i=0;i<RecBuf[6]/10;i++)
	for(j=0;j<10;j++)
  {
				new_cd[i][j]=RecBuf[9+j+10*i];
	}

	
	switch(RecBuf[3])
	{
	  case 1 : 	  						
				 i2c_addr=i2c_addr_rnct;
				 for(i=0;i<11;i++)
   			 {
   						rain_cd[i].cd_time=0;
							rain_cd[i].cd_data=0;
				 }				 
				 //-----------更改雨量门限---------------//
				 for(i=0;i<11;i++)
				 {
				 			rain_cd[i].cd_time=CHAR_TO_LONG(&new_cd[i][0],4);
							rain_cd[i].cd_data=CHAR_TO_LONG(&new_cd[i][4],6);
				 }				
				 new_cfg=1;
				 break;				 

	  case 2 :	
	  		i2c_addr=i2c_addr_lvct;
				for(i=0;i<11;i++)
   			{
   					level_cd[i].cd_time=0;
						level_cd[i].cd_data=0;
				}					
			    //-----------更改水位门限---------------//
			  for(i=0;i<11;i++)
				{
				 			level_cd[i].cd_time=CHAR_TO_LONG(&new_cd[i][0],4);
							level_cd[i].cd_data=CHAR_TO_LONG(&new_cd[i][4],6);
				}
				new_cfg=2;	
				break;
				
	}
	 
	 //-----------查找当前值并写入修改后的值---------------//     
	 R_block(WPAGE2,RPAGE2,i2c_addr,&cd_cfg[0][0],110); 
   if((cd_cfg[0][0]&0x80)==0x80)
   {    			
     		new_cd[0][0]|=0x80;
     	
  			W_block(WPAGE3,i2c_addr,&new_cd[0][0],110);
				wait_1ms();
				cd_cfg[0][0]&=0x7f;
				W_block(WPAGE2,i2c_addr,&cd_cfg[0][0],110);
   }
   else
   {
     		new_cd[0][0]|=0x80;
     	
  			W_block(WPAGE2,i2c_addr,&new_cd[0][0],110);
				wait_1ms();
				R_block(WPAGE3,RPAGE3,i2c_addr,&cd_cfg[0][0],110);				
				cd_cfg[0][0]&=0x7f;
				W_block(WPAGE3,i2c_addr,&cd_cfg[0][0],110);
   }  
   cl_ack_ct(RecBuf[5],RecBuf[3],1);
	 return 1;
}



/*******************************************************************
                     读配置条件函数               
函数原型:char Rd_Conditions(void)
功  能:       
  
********************************************************************/
char Rd_Conditions(void)
{
	uchar i,j;
	int k=0;
	unsigned char xdata cr_cd[11][10];
	 
	cs=0;

	for(i=0;i<11;i++)
	for(j=0;j<10;j++)
  {
			cr_cd[i][j]=0x00;
	}

	switch(RecBuf[3])
	{
	  case 1 : 
					i2c_addr=i2c_addr_rnct;
					SenBuf[3]=0x01; 			
					break;
	  case 2 :				
					i2c_addr=i2c_addr_lvct;
		  	 	SenBuf[3]=0x02; 								   			
					break;	
	}
	 
	R_block(WPAGE2,RPAGE2,i2c_addr,&cr_cd[0][0],110); 
	wait_1ms();

	if((cr_cd[0][0]&0x80)!=0x80)
	{   
   			R_block(WPAGE3,RPAGE3,i2c_addr,&cr_cd[0][0],110);   		
	} 
	cr_cd[0][0]&=0x7f;
	 
	SenBuf[5]=(RecBuf[5]|0x80);  
	 
	SenBuf[6]=0;
	 
	for(i=0;i<11;i++)
	{
	 		if((cr_cd[i][5]==0x00)&&(cr_cd[i][6]==0x00)&&(cr_cd[i][7]==0x00)
							  &&(cr_cd[i][8]==0x00)&&(cr_cd[i][9]==0x00))
			{
					continue;
			}
			else
			{
	 				for(j=0;j<10;j++)
     			{		
	 						SenBuf[9+j+10*k]=cr_cd[i][j];
	 				}
					k++;
					SenBuf[6]+=10;
			}
	}
	 
	SenBuf[7]=(char)(k/10)+0x30;
	SenBuf[8]=(char)(k%10)+0x30;
	SenBuf[6]+=2;

	for(i=0;i<SenBuf[6]+7;i++)
			cs+=SenBuf[i];
      
	SenBuf[SenBuf[6]+7]=cs;
	SenBuf[SenBuf[6]+8]=FRAME_END_CHAR;
	Senlen=SenBuf[6]+9;
	 
	return 1;
}




/*******************************************************************
                     初始化配置函数               
函数原型: 
功  能:       
  
********************************************************************/
char Wr_i2c(void)
{
	unsigned char i;
	unsigned char xdata init[128];
	unsigned char page;
	
	for(i=0;i<sizeof(init);i++)
  {
   		init[i]=0xff;
	}	
  
  switch(RecBuf[7])
  {
  	case  0 : page=WPAGE0;break;
  	case  1 : page=WPAGE1;break;
  	case  2 : page=WPAGE2;break;
  	case  3 : page=WPAGE3;break;
  	case  4 : page=WPAGE4;break;
  	case  5 : page=WPAGE5;break;
  	case  6 : page=WPAGE6;break;
  	case  7 : page=WPAGE7;break;
  	
  }	  
	W_block(page,i2c_addr_rainfall,init,sizeof(init));
	
  cl_ack_ct(RecBuf[5],RecBuf[3],1);
	return 1;
}



/*******************************************************************
                     读配置函数               
函数原型:
功  能:       
  
********************************************************************/
char Rd_i2c(void)
{
		uchar i;
		unsigned char wpage,rpage;	 
		unsigned char xdata init[128];		
		
		switch(RecBuf[7])
  	{
  		case  0 : wpage=WPAGE0;rpage=RPAGE0;break;
  		case  1 : wpage=WPAGE1;rpage=RPAGE1;break;
  		case  2 : wpage=WPAGE2;rpage=RPAGE2;break;
  		case  3 : wpage=WPAGE3;rpage=RPAGE3;break;
  		case  4 : wpage=WPAGE4;rpage=RPAGE4;break;
  		case  5 : wpage=WPAGE5;rpage=RPAGE5;break;
  		case  6 : wpage=WPAGE6;rpage=RPAGE6;break;
  		case  7 : wpage=WPAGE7;rpage=RPAGE7;break;
  	}
	 
		R_block(wpage,rpage,i2c_addr_rainfall,init,sizeof(init)); 		

		for(i=0;i<sizeof(init);i++)
    {		
			 	SenBuf[i]=init[i];
		}

		Senlen=sizeof(init);
	 
		return 1;
}

/*******************************************************************
                     时间同步函数               
函数原型: char Set_time(void)
功  能:       
  
********************************************************************/
char Set_time(void)
{
	unsigned int set_time;
	unsigned char i;
	
	if((RecBuf[7]>=0x30)&&(RecBuf[7]<0x33)&&
		(RecBuf[8]>=0x30)&&(RecBuf[8]<=0x39)&&
		(RecBuf[9]>=0x30)&&(RecBuf[9]<=0x39))
  {		
			set_time=CHAR_TO_INT(&RecBuf[7],3);
		
			level_1min=(set_time%60)*50;  //水位采集上报秒间隔定时20ms
			rain_1min=(set_time%60)*50;   //雨量采集上报秒间隔
	
			r_time=set_time/60;      //雨量采集上报间隔
			l_time=set_time/60;      //水位采集上报间隔
			
			rfcd_1min=(set_time%60)*1000;   //雨量秒间隔
			
			save_time=set_time/60;   //雨量存储间隔
			
			for(i=0;i<11;i++)
	  			rfcd_time[i]=set_time/60;//雨量采集加报间隔定时1ms
	
			cl_ack_ct(RecBuf[5],RecBuf[3],1);
	}
	else
	{
			cl_ack_ct(RecBuf[5],RecBuf[3],0); 
	}
	return 1;
}


/*******************************************************************
                     处理函数               
函数原型: void process(void)
功  能:       
  
********************************************************************/
char process(void) 
{	
	char flag=0;
	
	if(r_end)
  {
		cs=0;
		SenBuf[0]=FRAME_START_CHAR;
		SenBuf[1]=add[0];
		SenBuf[2]=add[1];	
		SenBuf[4]=FRAME_START_CHAR;
	
		switch(fc_flag)
		{
			case 0x02 : 
								flag=Rd_collect();
								break;

			case 0x04 :				
								flag=Wr_cfg();					   			
								break;		

			case 0x05 :			   
								flag=Rd_cfg();
								break;	

			case 0x06 :			
								flag=Wr_Conditions();													   			
								break;

			case 0x07 :			
								flag=Rd_Conditions();								
								break;
									
			case 0x0a :			
								flag=config_basic_waterlevel();								
								break;	
			
			case 0x0b :
								flag=Set_time();								
								break;	
			
			case 0x0c :
								flag=config_Multiplier_rainfall();								
								break;								
										
			case 0x00 :			
								flag=Wr_i2c();													   			
								break;

			case 0x01 :			
								flag=Rd_i2c();								
								break;	

			default:                                                                                               
               	break;
		}
		rec_lamp=!rec_lamp;
  }  
  
  if(flag)
  { 			
		r_end=0;
		s_end=0;
		p_end=1;					
		con_485=S_CON;
		TI=1;
		send_lamp=!send_lamp;
		return 1 ;
  }
  	
  return 0 ;
}


⌨️ 快捷键说明

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