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

📄 pump_watch.c

📁 程序为监测报警
💻 C
📖 第 1 页 / 共 2 页
字号:
	comm_out_buf[k+5]=*(point+i*4+k);
	comm_out_buf[3]= dt;
	comm_out_buf[4]= i*4;
					  }
	comm_out_buf[0]=0xff;
	comm_out_buf[9]=comm_out_buf[0]|comm_out_buf[1]|comm_out_buf[2]|comm_out_buf[3]|comm_out_buf[4]|comm_out_buf[5]|comm_out_buf[6]|comm_out_buf[7]|comm_out_buf[8]; 
	comm_send(10,comm_out_buf);

  					}
					}


//系统初始化任务 初始化操作系统*************************************************
//******************************************************************************
void ini (void) _task_  INT{
init();	init1();  						 //初始化
os_create_task (MAIN);                   //按键任务
os_create_task (AD_CNV); 				 //报警读入
os_create_task (DISPLAY);				 //动态显示
os_create_task (ALARM);	 				 //报警输出
os_create_task (serialer);	 			 //串行通讯
os_delete_task (INT);
                             }
//*******************************************************************************
//*******************************************************************************
//第一个任务*********************************************************************
//按键处理***********************************************************************
void ssc (void) _task_  MAIN{
  uchar k ;
  uchar count; 
  while(1){  
  if (match_number==0){								//0号机才可执行读取键值
   key_read(); 
                      }                				//读取按键状态
   if (key_buf==MUTE){                              //如果是消音键
     for (k=0;k<4;k++){MUTE_out[k]=alarm_data[k];}  //消音处理
//	     os_wait(K_TMO,2,0);  
		 FMQ=0;mu=1;//key_buf=0;					//
         if (power_fault){lpmute_f=1;}             } 
		       	                                    //消音键处理结束

   if (key_buf==RESET){                             //如果是复位键
       init();	
	   os_create_task (ALARM);  					
	   os_create_task (AD_CNV);
	   set =0;YS=0 ;FMQ=0;
   					  }								//复位键处理结束 
   if (key_buf==TEST){								//如果是按下了试灯键
         os_delete_task (ALARM);                    //不允许报警输出
		 for (k=0;k<4;k++){
		  dis_buf[k]=0xff;							//点亮所有报警灯			
		                   }
		 FMQ = 1;YS=1;								//使蜂鸣器发声音,继电器输出
				      }
	if (key_buf==SET_DAT){							//进入设置状态
		os_delete_task (AD_CNV);
		os_delete_task (ALARM);
						 }
	for (count=0;count<4;count++){
        if (MUTE_out[count]>alarm_data[count]){	      //实现报警自动恢复
			MUTE_out[count]= alarm_data[count];
												}
			MUTE_out[count]= (alarm_data[count]&alarm_out_slect[count])|MUTE_out[count];//实现报警只显示 
		   // else {Alarm=match_number+1;mu=0;}		  //如果有新报警则置报警位同时清除消音标志位
								  }		  // 
		if (MUTE_out[0]>=alarm_data[0] && MUTE_out[1]>=alarm_data[1]&&MUTE_out[2]>=alarm_data[2]&&MUTE_out[3]>=alarm_data[3]){
		Alarm[match_number]=0;																															  }
        else {Alarm[match_number]=1;mu=0;} 			  //新报警判断
    
		 os_wait(K_TMO,2,0);			  
          }
	                         }
//******************************************************************************
//****************************************************************************** 
//第二个任务********************************************************************
//报警输出任务******************************************************************                      
void BEEP (void) _task_  ALARM{
while(1){
	alarm_out();  										//调用报警输出函数
//printf("%s\n",alarm_data);
os_wait(K_TMO,2,0);	
        }
                               }
//******************************************************************************
//******************************************************************************
//第三个任务   报警读入任务
void AD_CN (void) _task_  AD_CNV{
         
  while(1){	 
  	 alarm_in(); 									//调用报警读入函数
	 delay_alarm() ; 								//调用延时报警函数
  	 os_wait(K_TMO,2,0);	 
 

	       }
                            }


//**********************************************************
//********************************************************** 
////////////////////////动态扫描显示任务///////////////////////////////////

void disp (void) _task_  DISPLAY{
                            //扫描行  
  char  i    ;
  
  while(1){	

	 line=0xfe;                        //扫描行初值	
  	 for (i=4;i>0;i--){
     XBYTE[0XA000]=line&COMM;          //扫描行值输出
	 if (!set)						   //非设置状态,输出报警数据
    	XBYTE[0xc000]=~dis_buf[i-1];   //扫描列输入显示值 
	 else XBYTE[0xc000]=0xfe;		   //设置状态,则亮指定的标志灯	
	 os_wait(K_TMO,5,0);			   //延时增加亮度
	 line=(line<<1)+1;                 //扫描行换行		   
	 XBYTE[0xc000]=0xff;			   //全灭

	                  }
	  //os_wait(K_TMO,1,0);
           }
		                        }      //任务结束



///////////////////////////////////////////////////////////////////////////
///串口发送及接收处理任务
void comm_out (void) _task_  serialer{
       unsigned char temp, num;
       while(1){ 
	   serial_cl();								  //串口处理
 	   comm_out_buf[0]=0xff;					  //存入帧起始
	   comm_out_buf[3]=key_buf;					  //将主机按键状态存入缓存 
	   comm_out_buf[1]=match_number;			  //存入本机号码	   
	   comm_out_buf[4]=Alarm[match_number];		  //存入报警状态
	   comm_out_buf[5]=alarm_data[0];			  //报警数据0
	   comm_out_buf[6]=alarm_data[1];			  //报警数据1
	   comm_out_buf[7]=alarm_data[2];			  //报警数据2
	   comm_out_buf[8]=alarm_data[3];			  //报警数据3
   if (!set){									  //非设置状态下
	 if (match_number==0){ 						  //如果是主控板	   
		if (power_up==1)os_wait(K_TMO,30,0);
			power_up=0;
	   for (num=1;num<=8;num++){				  //循环发送7个分机号和复示器号(8号)
	   comm_out_buf[2]=num;						  //存入目标机机号
	   //comm_send_over=0; 						  //清除接收完毕信号	   
	   comm_out_buf[9]=comm_out_buf[0]^comm_out_buf[1]^comm_out_buf[2]^comm_out_buf[3]^comm_out_buf[4]^comm_out_buf[5]^comm_out_buf[6]^comm_out_buf[7]^comm_out_buf[8]; 
	   comm_send(10,comm_out_buf); 				  //发送数据 
	   
	   if (key_buf==SET_DAT){ set =1;
	   						 comm_out_buf[3]=key_buf;	
	   						 comm_send(10,comm_out_buf); 
							 }

	   	if (cnt++ >10)cnt=0;key_buf=0;			  //保证每次键值轮发后才清除
	   
	   comm_send_over=1;						  //置发送完毕位	   				          
	  for (temp=30;temp>0;temp--){ 				  //延时等待分机回应
		os_wait(K_TMO,3,0);	    	}	          //延时
		 serial_cl();							  //接受处理
	 							 }
	   os_wait(K_TMO,5,0);						 								 
								 }

	 if (match_number>0&&match_number<=7){ 		  //如果是其它检测板(不包括复示器)
	     comm_out_buf[0]=0xff;
	     comm_out_buf[1]=match_number;
		 comm_out_buf[2] = 0;					  //数据的发送对象是主控板
		 if (SEND){								  //如果可以发送数据
		 os_wait(K_TMO,1,0);					  //延时等待稳定
		 if (key_buf==SET_DAT) set =1; 
		 	
	     comm_out_buf[4]=Alarm[match_number];		  //存入报警状态
		 comm_out_buf[9]=comm_out_buf[0]^comm_out_buf[1]^comm_out_buf[2]^comm_out_buf[3]^comm_out_buf[4]^comm_out_buf[5]^comm_out_buf[6]^comm_out_buf[7]^comm_out_buf[8]; 
		 comm_send(10,comm_out_buf);			  //发送数据 

		 SEND =0;								  //发送完毕
		           }
	  
		// os_wait(K_TMO,10,0);
	 	 serial_cl();				  }			  //进行串口接收后的处理
  								 								   
	 			}
	else{										  //设置状态下
		serial_cl();
	    if (SEND){	
		comm_out_buf[0] = 255; 					  
		comm_out_buf[1] = match_number;
		comm_out_buf[2] = 9;					  //数据的发送对象是PC机
		os_wait(K_TMO,200,0); 
		os_wait(K_TMO,200,0);
		for (temp=0;temp<4;temp++){
		comm_out_buf[temp+5]=slect_no_nc[temp];   //存入要回应的输入方式数据
									  }
		comm_out_buf[3]=1;
		comm_out_buf[4]=0;
	    comm_out_buf[9]=comm_out_buf[0]^comm_out_buf[1]^comm_out_buf[2]^comm_out_buf[3]^comm_out_buf[4]^comm_out_buf[5]^comm_out_buf[6]^comm_out_buf[7]^comm_out_buf[8]; 
		comm_send(10,comm_out_buf);				  //发送数据

		
			for (temp=0;temp<4;temp++){
		comm_out_buf[temp+5]=alarm_out_slect[temp];//存入要回应的报警锁存数据
									  }
		comm_out_buf[3]=2;
		comm_out_buf[4]=0;
	    comm_out_buf[9]=comm_out_buf[0]^comm_out_buf[1]^comm_out_buf[2]^comm_out_buf[3]^comm_out_buf[4]^comm_out_buf[5]^comm_out_buf[6]^comm_out_buf[7]^comm_out_buf[8]; 
		comm_send(10,comm_out_buf);				  //发送数据



			for (temp=0;temp<4;temp++){
		comm_out_buf[temp+5]=alarm_cou[temp];    //存入要回应的报警锁存数据
									  }
		comm_out_buf[3]=3;
		comm_out_buf[4]=0;
	    comm_out_buf[9]=comm_out_buf[0]^comm_out_buf[1]^comm_out_buf[2]^comm_out_buf[3]^comm_out_buf[4]^comm_out_buf[5]^comm_out_buf[6]^comm_out_buf[7]^comm_out_buf[8]; 
		comm_send(10,comm_out_buf);				  //发送数据

		RE32  (&delay_time[0],4 ) ;
		SEND = 0;
		comm_in_buf[3]=0;
		
		    				   }} 															   
			os_wait(K_TMO,2,0);}  		 
								}
			 

////////外部信号读入函数///////////////////////////////////////////////////
////输入:无
////输出:外部输入状态存于in_buf[]中,共四个字节
void  alarm_in(void){
unsigned char temp1;
unsigned int  temp2;                     //定义临时变量
     temp2=0x2000;                       //输入首地址
	 for (temp1=0;temp1<4;temp1++){	    
	 in_buf[temp1]=XBYTE[temp2];         //读入外部状态
	// dis_buf[temp1]=XBYTE[temp2];	     //调试程序时使用直接存入显示缓存
	 temp2 =temp2+0x2000; 				 //地址偏移
	                              }                    }                    //函数结速
///////////////////////////////////////////////////////////////////////////

/////////报警延时判断函数//////////////////////////////////////////////////
////输入:in_buf[]中的数据
////输出:存入alarm_data[]中
void delay_alarm(void){
      unsigned char temp1,temp2;
	  unsigned long  temp4=0;
	  unsigned long  temp5=0;
	  unsigned long  temp6=0;

	 for (temp1=0;temp1<4;temp1++){	      //共32路,4字节
      temp4=temp4|(in_buf[temp1]&0xff);   //将32路的数据存到一个长整型变量中
	  temp5=temp5|(slect_no_nc[temp1]&0xff);
	  if(temp1<3){ temp4=temp4<<8;temp5=temp5<<8;}

	  
	   
	                               } 
		temp4=(~temp4)^temp5;             //处理常开常闭输入

      	os_wait(K_TMO,2,0); 

     	temp5=1;
		temp2=0;
	 for (temp1=0;temp1<32;temp1++){
	    temp6=temp4&temp5;                 //判断第temp1路有没有报警

		os_wait(K_TMO,2,0); 


	   if (temp6!=0){                      //不为0则有报警发生
	       if (alarm_delay[temp1]>0){
		       alarm_delay[temp1]--;
		                              }
		else{  if(temp1<=7) 
		              alarm_data[0]= alarm_data[0]&0xff|(temp6&0xff);
		       if(temp1>=8&&temp1<=15) 
			         alarm_data[1]=alarm_data[1]|	((temp6>>8)&0xff);	
		       if(temp1>=16&&temp1<=23)
			         alarm_data[2]=alarm_data[2]|	((temp6>>16)&0xff);		          
			   if(temp1>=24&&temp1<=31)
			         alarm_data[3]=alarm_data[3]|	((temp6>>24)&0xff);			            
			   	alarm_delay[temp2]=delay_time[temp2];                    //如果该路延时时间到则恢复初值	        
			}
		
		   
	                }
		 else {	if(temp1<=7)
		            alarm_data[0]=alarm_data[0] ^ (alarm_cou[0]&(temp5&0xff))&alarm_data[0];
		        if(temp1>=8&&temp1<=15)
				    alarm_data[1]=alarm_data[1] ^ (alarm_cou[1]&((temp5>>8)&0xff)) &alarm_data[1];	
		        if(temp1>=16&&temp1<=23)
				    alarm_data[2]=alarm_data[2] ^ (alarm_cou[2]&((temp5>>16)&0xff))&alarm_data[2];     
			    if(temp1>=24&&temp1<=31)
				    alarm_data[3]=alarm_data[3] ^ (alarm_cou[3]&((temp5>>24)&0xff))&alarm_data[3];
		        
		    	 alarm_delay[temp2]=delay_time[temp2];	                 //如果该路没有报警则重新设定该路的定时初值
		       }  
			 temp5<<=1;			 
			 temp2++;                                                    //当前路数加一(0—31路)			
			 os_wait(K_TMO,5,0);
	                               
								    }
			 os_wait(K_TMO,200,0);                                          //设定每次检测的时间			       
			//os_wait(K_TMO,255,0);

                      }


⌨️ 快捷键说明

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