📄 door.c
字号:
#include "KKZQ.H"
//339724325
//=======================================================
uchar xdata new_card[14];
bit new_record_flag; //新刷卡开门标志
bit mon_open_flag=0; //是否监视开门过程
bit door_open_flag=0; //=1,当前门处于开状态
bit open_okflag=0; //=1, 已经执行了开门动作
bit shut_okflag=0; //=1, 已经执行了关门动作
bit next_card_flag=1; //可以读下一张卡标志
uchar idata oplock_on_time; //程序使用的开锁继电器持续导通时间
uchar idata door_step=0; //开门步骤寄存器
// door_step=1 ---- 继电器已打开,等待开门状态
// door_step=2 ---- 继电器通电时间已到, 关闭继电器
// door_step=3 ---- 没有开门指令时监控门状态
//==============================================================================
uchar sys_state2; //远程监控用系统状态信息
// D7 紧急驱动输入
// D6 联动输入2
// D5 联动输入1
// D4 = 0, 联动输出继电器关闭 =1 加电驱动
// D3 = 0, 门关闭, =1 门开启
// D2 = 0, 红外输入正常 =1 报警
// D1 = 0, 手动按键松开 =1 按下
// D0 = 0, 门控电磁继电器关闭 =1 加电驱动
//---------------------------------------------------------
//uchar output_reg=0; //输出控制及状态指示
//=0; 允许读系统时间
//=1; 禁止读写系统时间
//=2; 要求立即写系统时间
uchar mark023_status; //刷卡开门,远程开门,手动开门,事件纪录的状态
// D7 = 0 --- 未确认用户密码; =1,确认
// D6 = 0 --- 原来门处于关闭状态; =1,开状态
// D5 = 0 --- 在规定时间内进入, =1,为开门进入
// D4 = 0 --- 在开门等待进入延时后,门已关闭, =1,门还开着
// D3 = 0 --- =1,开门进入后关闭了红外监控; =0,保持原状
// D2 ------- 保留
// D1 = 0 --- 外接分体卡; =1,内置主体卡
// D0 = 0 --- 红外监控原来是关闭的; =0,保持原状
//==============================================================================
//==============================================================================
uchar idata open_order=0xff; //开门命令代码
// =1, 刷卡开门
// =2, 远程开门
// =3, 手动开门
//==============================================================================
//
uchar hand_step=0; //监视手动开门步骤寄存器
uchar hwait_time=0; //监视手动开门时间寄存器
void aralm_record(uchar as); //初始化告警记录缓冲区
void init_date_record(); //初始化告警记录时间缓冲区
void save_open_record(); //初始化开门记录缓冲区
void mon_open_step(); //监视刷卡开门,远程开门,手动开门过程
void no_order_open(); //没有开门指令时监视门状态
void exit_mon_door(); //退出监视开关门状态
void door_onoff();
void hand_record(); //初始化手动开门记录缓冲区
void setup_record(uchar ud); //初始化设置状态改变时事件记录缓冲区 上位机改变时调用
void monhand_open(); //手动开门时监视门状态
//
//==============================================================================
//filename : no_order_open()
//功 能 : 没有开门指令时监视门状态
// 如果处于打开状态, 如果没有报警则报警并保存记录
// door_aralm_flag=1; //置非法开门告警标志
// aralm_record(2); //保存非法开门纪录
//STATUS :
//D7=0
//D6=0 原来门处于关状态, =1 开状态;
//D5=0 在规定时间内开门进入, =1 未开门进入;
//D4=0 在开门等待进入延时后,门已正常关闭, =1 仍然开的;
//D3=0
//D2=0
//D1=0
//D0=0
//==============================================================================
//
void no_order_open()//没有开门指令时监视门状态
{
//------------------------------------------------------------------------------
//开门状态
if(door_open_flag) //开门状态
{ if((mark023_status&0x40)==0) //门原来是关着的
{ mark023_status=0x40;
door_aralm_flag=1; //置非法开门告警标志
aralm_record(2); //纪录报警程序
}
}
//------------------------------------------------------------------------------
//关门状态
else if(mark023_status&0x40) //门原来是开着的
{ aralm_record(3); //非法开门, 现在关闭
door_aralm_flag=0; //清非法开门告警标志
open_order=0xff;
mark023_status=0;
}
}
//==============================================================================
//filename : monhand_open()
//功 能 : 监控手动开门的开与关动作
// wait_hopflag=1; 手动开门动作已发出等待开门
// hand_step=0, 监视解除
// hand_step=1, 等待开门 等待时间= 5秒
// hand_step=2, 等待关门,等待时间=20秒
// hand_step=3, 等待关门,等待时间=无限时间
//
// 手动开门命令发出后如果在5秒时间内开门则转到监视关门状态,如果在
// 5秒时间内没有开门则解除手动开门命令,再有开门动作视为非法开门
// 开门后必须在20秒内关门否则告警并解除手动开门命令
//==============================================================================
//
void monhand_open() //没有开门指令时监视门状态
{ if(hand_step==1) //手动开门动作已发出等待开门,等待时间5秒
{ if(door_open_flag) //开门状态
{ hand_step=2; //门已开,等待关门。等待时间20秒
hwait_time=200;
mark023_status&=0x50; //在规定时间内开门进入
hand_record();
}
else if(--hwait_time==0) //等待时间已到,手动开门命令解除
{ hand_step=0;
wait_hopflag=0;
mark023_status|=0x20; //在规定时间内没有开门进入
hand_record();
mark023_status=0; //置门原来状态 --- 开着的, =0关着的
}
}
else if(hand_step==2) //等待关门,等待时间20秒
{ if(!door_open_flag) //关门状态
{ hand_step=0; //门已关
wait_hopflag=0; //手动开门监视解除
mark023_status&=0x60;//在规定时间内没有开门进入
hand_record();
mark023_status=0; //门原来状态是关着的
}
else if(--hwait_time==0) //等待时间已到,手动开门命令解除
{ hand_step=0; //进入无限期等待关门动作
wait_hopflag=0; //手动开门监视解除
mark023_status|=0x10; //在规定时间内没有开门进入
hand_record();
mark023_status=0x40; //置门原来状态 --- 开着的, =0关着的
}
}
else if(hand_step==0)wait_hopflag=0;
}
//
//==============================================================================
//filename : mon_open_step()
//功 能 : 监视刷卡开门,远程开门,手动开门过程
//寄 存 器 : 1. door_step=1 ---- 驱动电机前进,时间1.2s
// door_step=2 ---- 电机断电,时间5s.在此期间检测们是否打开
// 在断电1秒后,关闭继电器
// door_step=3 ---- 等待关门
// 2. open_order --- 非法开门=0; 刷卡开门=1; 远程开门=2; 手动开门=3
//==============================================================================
//relay=1; //继电器断电
//uchar sys_state1; //远程监控用系统状态信息
// D7 = 0, 实时时钟芯片工作正常
// D6 = 0, 数据存储器工作正常
// D5 = 0, 系统共电电源工作正常
// D4 保留
// D3 = 0, 不监视门磁, =1 监视门磁
// D2 = 0, 不监视红外, =1 监视红外
// D1 = 0, 门控电磁继电器关闭, =1 门控电磁继电器处于加电状态
// D0 = 0, 正常工作, =1 处于报警状态
void mon_open_step()
{ switch(door_step)
{ case 1: if(++oplock_on_time>20) //2S
{ motor_power=1; //电机断电
oplock_on_time=50; //电机断电,等待开门时间=5s
door_step=2;
relay=0; //继电器供电
}
break;
case 2:
if(!open_okflag)
{ if(door_open_flag)
{ mark023_status&=0x50;//门已开,在规定时间内进入
open_okflag=1; //已经执行了开门动作
save_open_record(); //开门过程记录缓冲区
}
}
else if(!shut_okflag)
{ if(open_okflag&&!door_open_flag)
{ shut_okflag=1; //已经执行了关门动作
mark023_status&=0x40;//在开门等待进入延时后,门已关闭
save_open_record(); //开门过程记录缓冲区
}
}
if(--oplock_on_time==0) //等待开门时间已到
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -