📄 intermit.c
字号:
#include "KKZQ.H"
//
//=====================================================================================
// RAM资源
// 占用 17 个字节
// rcard_buf[6] 6个字节 卡号接收缓冲区
// time_100ms_count 1个字节 100ms计数器
// time_500ms_count 1个字节 500ms计数器
// time_2s_count 1个字节 2s计数器
// byte_num 1个字节 韦根通讯用
// length 1个字节 接收到韦根通讯计数器
// watch_car_time 1个字节 韦根监视器计数器
//uchar idata oplock_on_time; //程序使用的开锁继电器持续导通时间
//uchar idata slock_on_time; //开锁继电器持续导通时间
//uchar idata sopen_wait_time; //开门后等待时间 (即延迟关门时间)
//idata uchar opopen_wait_time; //程序使用的开门等待进入时间
//idata uchar set_input_reg; //设置的信号采集方式及监控方式寄存器
//===================================================================================
// EEPROM 地址分配
// 0x0000 - 0x1000 256 x 16字节 用户信息存储区 最大250个用户信息 占用64页 EEPROM
// 0x1000 - 0x3000 512 x 16字节 事件存储区 (最多存储512事件) 占用128页EEPROM
// 0x3000 - 0x3040 4 x 16字节 工作日准进时段 (4张表格 每个表格对应4个准进时段,一张表格占用16个字节)
// 0x3040 - 0x3050 1 x 16字节 非工作日准进时段(1张表格 表格对应4个准进时段,一张表格占用16个字节)
// 0x3080 - 0x3e80 16 x 7 x 32 星期准进时段-->对应16张表格 每个表格包含7天(星期一 --- 星期日)
// 每天包含6个准进时段 每个时段4个字节
// (每天的时段24个字节,占用EEPROM半页)
// 0x3e80 - 0x3f80 2 x 128 节假日时间存储区(最多保存128个假日) 每个节日占用2个字节 xx:yy xx 月 yy 日
//
// 0x3fc0 - 0x3fc1 刷卡器用户数量
// 0x3fc2 - 0x3fc3 休息日设定存储区 每星期2天
// 0x3fc4 门锁继电器执行时间 最大25.6秒
// 0x3fc5 开门后延迟时间 最大25.6秒
// 0x3fc6 - 0x3fca 历史事件计数器,当前历史纪录序号存储区 5个字节
// 0x3fcb 节假日天数计数器
//===========================================================================================
bit time_10ms_flag=0;
bit time_100ms_flag=0;
bit buz_flag=0; //=1,蜂鸣器当前处于工作状态
bit buz_on_flag=0; //=1,蜂鸣器当前处于通电状态
bit wait_hopflag=0; //=1,手动开门动作已发出,等待开门标志
bit time_1s_flag=0; //1秒时间到
bit w1s_flag=0; //上电时间超过1秒
uchar buz_on=10; //蜂鸣器鸣叫时通电时间
uchar buz_num=0; //蜂鸣器鸣叫次数
uchar time_1s=10;
uchar idata rcard_buf[12]; //卡号接收缓冲区
uchar idata time_100ms_count=0;
uchar idata door_state_shake;
uchar idata addr_shake=0;
uchar idata addr_reg=0;
uchar idata handshake;
void state_din(); //读钥匙开门,手动开门及门磁状态
void read_addr(void); //读本机地址
void init(void); //初始化函数
void read_wdata();
void clr_card_buf();
void proc_10ms();
void init(void)
{
P0 = 0xff;
P1 = 0xdf;
P2 = 0xff;
P3 = 0xfb;
TMOD= 0x01;
SCON= 0X50;
TH0 = 0xdc;
TL0 = 0x30;
//--------------------------------------------------
// 通讯初始化
RCAP2H=0XFF; //9600波特率
RCAP2L=0Xdc;
TH2=0XFF;
TL2=0Xdc;
T2CON=0X34;
com_step=0;
com_num=0; //清接收计数器
com_acc=0; //累加和
time_100ms_count=0;
clr_card_buf();
read128buf(1,index_addr); //用户卡数量
card_index=eeprom_buf[0];
TR0 = 1;
IE=0X92;
}
//==============================================================================
//filename : time_0
//功 能 : 定时器0中断处理程序,定时时间 10ms
// 1. 监视读卡完毕时刻, 如果读卡器在30MS时间内不再有新脉冲出现
// 认为读卡结束
// 2. 监视通讯是否中断, CPU 与上位机链路接通处于接收数据状态,
// 如果 30MS 时间内不再有新脉冲出现,认为掉线,停止接收
// 3. 同步键盘去抖
//==============================================================================
//
void time_0(void) interrupt 1
{ TL0=0xb0; TH0=0xdc;
time_10ms_flag=1;
if(buz_flag) //蜂鸣器当前处于工作状态
{ if(--buz_on==0)
{ if(buz_on_flag) //上一个周期蜂鸣器处于通电状态
{ buz_on_flag=0; buzzer=1;//关蜂鸣器
if(--buz_num==0)buz_flag=0;
else buz_on=40;
}
else{buz_on_flag=1; buzzer=0; buz_on=10;}//开蜂鸣器
}
}
if(++time_100ms_count>=10)
{ time_100ms_count=0; time_100ms_flag=1;
time_10ms_flag=0; w1s_flag=1; //上电时间超过1秒
if(--time_1s==0)
{ time_1s=10; time_1s_flag=1; //1秒时间到
time_100ms_flag=0;
if(link_flag){if(--link_time==0)link_flag=0;}
}
}
}
//
//==========================================================================================
//
// filename : state_din()
// 功 能 : 读钥匙开门,手动开门及门磁状态
// wait_hopflag=1; 手动开门动作已发出,等待开门标志
// mon_open_flag=1; 正在监视开门过程
// door_open_flag=1; 当前门处于开状态
// 返 回 值 :
//
//==========================================================================================
//uchar sys_state2; //远程监控用系统状态信息
// D7 紧急驱动输入
// D6 联动输入2
// D5 联动输入1
// D4 = 0, 联动输出继电器关闭 =1 加电驱动
// D3 = 0, 门关闭, =1 门开启
// D2 = 0, 红外输入正常 =1 报警
// D1 = 0, 手动按键松开 =1 按下
// D0 = 0, 门控电磁继电器关闭 =1 加电驱动
//
//uchar sys_state1; //远程监控用系统状态信息
// D7 = 0, 实时时钟芯片工作正常
// D6 = 0, 数据存储器工作正常
// D5 = 0, 系统共电电源工作正常
// D4 保留
// D3 = 0, 不监视门磁, =1 监视门磁
// D2 = 0, 不监视红外, =1 监视红外
// D1 = 0, 门控电磁继电器关闭, =1 门控电磁继电器处于加电状态
// D0 = 0, 正常工作, =1 处于报警状态
//
void state_din()
{
P2=0XFF;
handshake<<=1;
if((!hand_open)||(!key_open))handshake|=1;
if(handshake==0xff) //检测到手动开门
{ sys_state2|=0x02;
if((!wait_hopflag)&&(!mon_open_flag))
{ wait_hopflag=1; //手动开门延时标志时间
hand_step=1;
door_aralm_flag=0; //清开门告警标志
hwait_time=50; //手动开门延时时间=5秒
if(door_open_flag)mark023_status|=0x40; //设置门原来是处于打开状态
else mark023_status&=0x30;
}
}
else if(handshake==0)sys_state2&=0xfd;
//--------------------------------------------------------------------------
//读门磁状态
door_state_shake<<=1;
if(door_pin)door_state_shake|=1;
if(door_state_shake==0xff){sys_state2|=0x08;door_open_flag=1;} //开门状态
else if(door_state_shake==0){sys_state2&=0xf7;door_open_flag=0;}//关门状态
}
//==============================================================================
//filename : read_addr
//功 能 : 读本机地址和通讯波特率
// D7 = 0 波特率 = 19200dps ON
// D7 = 1 波特率 = 9600dps OFF
// D6 - D0 本机通讯地址
//==============================================================================
void read_addr()
{ uchar i,j,s;
P0=0XFF; s=P0;
j=0;
for(i=0;i<6;i++)
{ j>>=1;
if(s&0x80)j|=0x20;
s<<=1;
}
addr_shake<<=1;
if(j!=addr_reg)addr_reg=j;
else
{ addr_shake|=1; //上次读取的本机地址
if(addr_shake==0xff)
{ i=j/16;
if(i>9)txd_buf[2]=i+0x37;else txd_buf[2]=i+0x30;
i=j&0x0f;
if(i>9)txd_buf[3]=i+0x37;else txd_buf[3]=i+0x30;
}
}
txd_buf[0]=0x31; txd_buf[1]=0x30;
txd_buf[4]=0x38; txd_buf[5]=0x30;
}
//==============================================================================
//filename : read_wdata()
//功 能 : 与读头通讯, 采用串行移位寄存器方式发送数据,dt1传送数据
// dt0 传送同步时钟,在 dt0=0时数据有效,dt0=1时改变数据
//
//==============================================================================
void read_wdata()
{
uchar i,j,k,s;
next_card_flag=0;
i=0;j=0;
while(i<12)
{ if(ready){clr_card_buf();next_card_flag=1;return;}
dt0=0; rcard_buf[i]<<=1;
if(dt1)rcard_buf[i]|=1;
if(++j>7){j=0;++i;}
dt0=1; k=5;
while(k)--k;
}
dt0=1;
if(rcard_buf[11]!=0x12){clr_card_buf();next_card_flag=1;return;}
//------------------------------------------------------------------------------
//判断程序接收到的数据是否正确
if(rcard_buf[10]&0x01){clr_card_buf();next_card_flag=1;return;} //最后1位=1 则错误
k=0; s=1;
for(i=0;i<10;i++) //列校验,偶校验; 行校验,异或校验;
{ j=rcard_buf[i];
if(j&0xe0){clr_card_buf();next_card_flag=1;return;}
ACC=j; if(P){clr_card_buf();next_card_flag=1;return;}
k^=j;
if(i>1)
{ j>>=1; //计算列校验值
if((i&0x01)==0)rcard_buf[s]=j*16;
else {rcard_buf[s]+=j;++s;}
}
}
k^=rcard_buf[10]; k&=0x1e;
if(k){clr_card_buf();next_card_flag=1;return;}
rcard_buf[0]=0;
for(i=0;i<5;i++)set_user_buf[i]=rcard_buf[i];
for(i=0;i<12;i++)rcard_buf[i]=0;
open_order=card_open();
if(open_order!=0){next_card_flag=1;buz_num=3;}
else buz_num=1;
buzzer=0; buz_flag=1; buz_on_flag=1; buz_on=10;
save_open_record();
}
void clr_card_buf()
{
uchar i;
for(i=0;i<12;i++)rcard_buf[i]=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -