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

📄 pump_watch.c

📁 程序为监测报警
💻 C
📖 第 1 页 / 共 2 页
字号:

//485通讯协仪*********************************************************************
// 主机发送:  D9------校验和
//			   D8------报警数据第25-32路
// 			  D7------报警数据第17-24路
//			   D6------报警数据第 9-16路
//			   D5------报警数据第 1- 8路
//             D4------报警状态码
//			   D3------主机当前的按键操作码
//			   D2------数据接收方的机器号码
//			   D1------数据发送方的机器号码
//			   D0------帧起始标志  0xff

#include "REG52.H" 
#include "stdio.h"
#include "stdlib.h"
#include "ABSACC.H"
//#include "math.h"
#include <rtx51tny.h>
#define  INT     0  
#define  MAIN    1  
#define  AD_CNV  2  
#define  DISPLAY 3 
#define  ALARM   4 
#define  serialer  5

#define  RESET   1
#define  MUTE    2
#define  TEST    3
#define  SET_DAT 4
#define  MAX485_send  0xFF                                   //485发送定义
#define  MAX485_REC   ~0X80                                  //485接收定义
#define  COMM_BUF_SIZE 10									 //串行接收缓存大小
#define uchar  unsigned char
#define uint   unsigned int
//***************************************************************************************
//用于设置的全局变量定义***************************************************************** 

unsigned char  alarm_delay[32];      						//定义延时报警缓存
//unsigned char  alarm_fz[32];      					   	//定义延伸分组设置
unsigned char  alarm_cou[4];      							//定义报警是否可恢复 0锁存,1可自动恢复
unsigned char  slect_no_nc[4];								//定义选取择常开常闭输入的缓存
unsigned char  match_number;								//用于保存本机机器号 
unsigned char  comm_in_buf[42];								//串口接收缓存
unsigned char  comm_out_buf[42]; 							//串口接收缓存
unsigned char  alarm_out_slect[4];							//设置报警选择

//用于报警的全局变量定义******************************************************************
//****************************************************************************************
 unsigned char  delay_time[32];                             //用于延时的时间寄存单元
 unsigned char  alarm_data[4];	                            //定义最终报警数据
 unsigned char  in_buf[4];                                  //定义报警输入缓存
 unsigned char  MUTE_buff[4]={0,0,0,0};						//定义消音暂存报警单元
 unsigned char  MUTE_out[4]={0x0,0x0,0x0,0x0};				//定义消音后的输出单元
 unsigned char  dis_buf[4];//           				    //定义显示缓存共4个字节
 unsigned char  key_buf;									//定义按键缓存
 unsigned char  COMM;                           			//串口控制缓存
 unsigned char  *comm_send_point;							//串口发送指针
 unsigned char   comm_rec_point=0;							//串口接收指针	
 unsigned char   Alarm[9]={0,0,0,0,0,0,0,0,0};				//定义报警
 unsigned char  line;
 unsigned char  cnt;
////位地址定义****************************************************************************
 bit   SEND;												//需要发送标志
 bit   mu;   												//消音标志位
 bit   comm_send_over;										//串口发送完毕位
 bit   comm_rec_over;										//串口接收完毕位
 bit   power_fault;											//电源故障标志
 bit   set;												    //设置
 bit   commstart;											//串口开始接受标志
 bit   power_up;											//上电
 bit   lpmute_f;											//失电报警消音标志			
 sbit  mute = P1^7;											//消音按键定义
 sbit  test = P3^3;											//试灯键定义
 sbit  reset= P3^2;											//复位键定义 sbit  FMQ  = P1^5;											//蜂鸣器控制引脚定义
 sbit  LPD  = P1^3;											//失电报警检测					  
 sbit  LPF  = P1^4;											//失电报警输出
 sbit  YS   = P1^6;											//延伸报警继电器输出//*****************************************************************************
//*****************************************************************************
//函数预定义*******************************************************************
void alarm_in(void);
void delay_alarm(void);
void time_delay_copy(void);
extern uchar nbyteRead(uchar addr, uchar nbyte, uchar *index);//  addr 要读取的地址 nbyte 读取的字节
extern uchar nbyteWrite( uchar addr, uchar nbyte,uchar *index);
//*****************************************************************************
//*****************************************************************************
//报警输出函数*****************************************************************
 void alarm_out(void){
    //主机才执行
	  uchar count;
  if (match_number==0){
		Alarm[8]=Alarm[0]|Alarm[1]|Alarm[2]|Alarm[3]|Alarm[4]|Alarm[5]|Alarm[6]|Alarm[7]; 
					  } 					//如果机号为0,则给Alarm[8]赋值
	for (count=0;count<4;count++){
         dis_buf[count]=alarm_data[count];  //将报警值存入显示缓存
	                              }
         if (((Alarm[8]!=0)&&(mu==0))||((power_fault)&&(!lpmute_f)&&(key_buf!=RESET))){  FMQ=1;	 } //操作蜂鸣器
		   if (power_fault) LPF= 0;	        //如果失电点亮失电指示灯
		 os_wait(K_TMO,150,0);              //延时(为了闪亮)
		 
	for (count=0;count<4;count++){
	     dis_buf[count]=MUTE_out[count];    //将消音处理的值存入报警缓存
		FMQ = 0;
		if (!lpmute_f)LPF =1;				  }
		 os_wait(K_TMO,150,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])){
	          YS=0;}		
	else{YS=1;}	   							//继电器输出判断

                     }
//*****************************************************************************
//*****************************************************************************
//按键读取函数*****************************************************************
//*****************************************************************************
 void key_read(void){
   if (!reset||!test||!mute){         		//如果有键按下
      os_wait(K_TMO,1,0);             	    //延时去抖动
	  if (!reset) key_buf = RESET ;         //复位键
	  if (!mute)  key_buf = MUTE  ;         //消音键
	  if (!test)  key_buf = TEST  ;         //试灯键
	  if (!mute&&!test) key_buf=SET_DAT;    //同时按下消音键和测试键为设置					  
                            }
	  //else {os_wait(K_TMO,20,0);if (comm_send_over==1){key_buf=0;comm_send_over=0;}} //***********按键放下清空缓冲区

	  LPD =1;
	  if  (LPD) {  power_fault=1; }         //主电源失电检测
	  else{power_fault=0;lpmute_f=0;} 		//否则清除失电报警信号


 					}
//串口发送程序*****************************************************************
//*****************************************************************************
//输入:count 要发送的数据长度(字节)
//      P     要发送数据的起始地址指针
  void comm_send(char count,char *p){
       	ES=0;									 //禁止串口中断
		COMM=MAX485_send;                        //将485串口转换器置为发送状态
		XBYTE[0XA000]=line&COMM;
		os_wait(K_TMO,2,0);					     // 延时稳定
		while(count>0){
		 if (!TI){SBUF=*p;count--;p++;}	         //发送数据
		 while(!TI){os_wait(K_TMO,1,0);}		   
		   TI=0;								 //等待发送完毕
		              }
		COMM=MAX485_REC;						 //485串口转回接受状态 

		XBYTE[0XA000]=line&COMM;
		ES=1; 								     //允许串口中断
	         						}
//*****************************************************************************
//*****************************************************************************
//初始化函数,对程序进行初始化操作
void init(void){                      	//初始化设置程序
    char k;
	comm_out_buf[0]=0xff;				//初始化comm_out_buf[0],帧起始	
for (k=0;k<4;k++){
     alarm_data[k]=0;                  	//初始化数据单元
	 dis_buf[k]=0;
	 MUTE_out[k]=0; 	  
                 }
	lpmute_f=0;							//初始化各标志位						
	mu   =0;
	FMQ =0;								
	cnt =0;
	time_delay_copy();
	for	(k=0;k<9;k++)Alarm[k]=0;
	match_number = (~P1)&0x07;          //读取本机机器号
			   }

void init1 (void)
{   char k;
    TMOD =TMOD|0X20; 						 //定时器1工作于方式2
	TL1  =0XF3;
	TH1  =0XF3;
	SCON =0X50;								 //8位数据位1位停止位无校验位
	PCON =0X80;								 //波特率倍增
	ES=1; 									 //允许串口中断
	TR1=1;									 //启动波特率发生器
	key_buf=0;								 //初始化串口缓冲区
	set = 0;							 
	commstart=0;
	COMM =MAX485_REC;						 //初始时485串口处于接收状态
	comm_rec_point=0; 						 //接收指针为0
    nbyteRead(0, 4, slect_no_nc );			 //从24c02中读取相应数据
	nbyteRead(4, 4, alarm_out_slect );
	nbyteRead(8, 4, alarm_cou );
	nbyteRead(12,32,delay_time );  
    for (k=0;k<32;k++){
    alarm_delay[k]= delay_time[k];			//重新设定延时时间
    power_up=1;
                          }

}
//******************************************************************************
//******************************************************************************
//延时时间重新设定函数**********************************************************
//******************************************************************************
void time_delay_copy(void){
unsigned char kk;
                           
for (kk=0;kk<32;kk++){
  alarm_delay[kk]= delay_time[kk];				//重新设定延时时间
                          }
					  }

//******************************************************************************
//******************************************************************************
//串行口中断函数
serial()interrupt 4 using 3{
   unsigned char k;
   if (RI){
       RI=0;									//清除串行接收中断标志
	   ES=0;
	   k=SBUF;							   		
	   if ((!commstart)&&(k==0XFF)){
	        comm_in_buf[comm_rec_point]=k;
	        commstart=1;comm_rec_point++;ES=1;return;}

	   if (commstart){
	   comm_in_buf[comm_rec_point]=SBUF;  		//将接收到的串口数据存入接收缓存
	   comm_rec_point++;				   		//调整接收指针
	                  }
	   if( comm_rec_point>=COMM_BUF_SIZE){
	       commstart=0;
		   comm_rec_point=0;
		   if (comm_in_buf[9]==(comm_in_buf[0]^comm_in_buf[1]^comm_in_buf[2]^comm_in_buf[3]^comm_in_buf[4]^comm_in_buf[5]^comm_in_buf[6]^comm_in_buf[7]^comm_in_buf[8])	)				  //和校验判断
		   {	
		   		 comm_rec_over=1 ;  					//置位接收完毕标志
			}
		   //else {comm_rec_over=0;}
	   									 }
          }
						   
			ES=1;			   }
//*******************************************************************************
//数据接收处理程序***************************************************************
void serial_cl(void){
     uchar i;
	 uchar k;
     if(comm_rec_over){								 //如果所有数据接收完毕
	 	if (!set){	 		 						 //非设置状态
	 		if (match_number==0){					 //机号为0时,读入Alarm[]
	 			Alarm[comm_in_buf[1]]=comm_in_buf[4];
   		 Alarm[8]=Alarm[0]|Alarm[1]|Alarm[2]|Alarm[3]|Alarm[4]|Alarm[5]|Alarm[6]|Alarm[7];  //主机才执行
		 		if(Alarm[8]!=0){					 //处理报警:Alarm[8]!=0即有新报警,清消音标志
					mu=0;
		 						} 
	//	  else {Alarm = Alarm&(~(comm_in_buf[1]+1));}//如果没有报警,则清除相应从机的报警位
			   return;
		  					  }

			if (match_number!=0) key_buf= comm_in_buf[3]; //非0机子,存入按键状态
         	if (key_buf==SET_DAT) set =1;				  //判断是否需进入设置
			if 	(key_buf==MUTE){
				   for (k=0;k<4;k++){MUTE_out[k]=alarm_data[k];}  //消音处理
					 FMQ=0;mu=1;//key_buf=0;
									}
	    if (match_number==comm_in_buf[2]){			       //如果需要本机作出应答
		  		if (comm_in_buf[3]!=SET_DAT){ SEND = 1;	} }//允许发送信号准备回应
        	comm_rec_over=0; 						       //清除接收完毕标志
		  	return;
	 				}
	   else { if(match_number==comm_in_buf[2]){         //设置状态下,如果是对本机操作
		  		  switch (comm_in_buf[3]){				//判断命令代码
				  case 1:{
						 if (comm_in_buf[1]==9){
				         for(i=0;i<4;i++){ 			 //设置数据类型是输入方式
				  		 slect_no_nc[i]=comm_in_buf[i+5];}
						 nbyteWrite(0, 4, slect_no_nc ); }
						 else { init();	
	   							os_create_task (ALARM);  
	  							os_create_task (AD_CNV);	  
	   							set =0;            }
				  		 }break;

				  case 2:{ 							 
				          for(i=0;i<4;i++) {			 //设置数据类型是输入方式
				  		 alarm_out_slect[i]=comm_in_buf[i+5];  }
						 nbyteWrite(4, 4, alarm_out_slect );
						  }break;

				  case 3:{ 
				          for(i=0;i<4;i++){ 			  //设置数据类型是报警锁存
				  		  alarm_cou[i]=comm_in_buf[i+5];}
						  nbyteWrite(8, 4,alarm_cou );							
						  }break;
				  case 4:{ 
				          for(i=0;i<4;i++){ 			  //设置数据类型是延时时间 
				  		  delay_time[i+comm_in_buf[4]]=comm_in_buf[i+5];}
						  
						  if (comm_in_buf[4]==28) nbyteWrite(12, 32,delay_time );							
						  }break;

				  case 7: {							  //回应
				          SEND =1;
				  		  }break;
		  						  }
	 	 
	                    comm_rec_over=0; } 
						comm_rec_over=0;return;     }
						}
					}
//					}
 //******************************************************************************
 //****************************************************************************** 	
void  RE32  (unsigned char *point,unsigned char dt ){
unsigned char i,k;
  for (i=0;i<8;i++){
    for (k=0;k<4;k++){

⌨️ 快捷键说明

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