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