📄 pump_watch.c
字号:
//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 + -