📄 main.c
字号:
///////////////////////////////////////////////////////////////////////////////
//
// Hopinfo Copyright.
//
// www.chinahopeinfo.com.cn
//
// 2005.04.26
//
// 审阅:黄平生
//
// 主程序,串口通信、菜单管理、中断管理、初始化
//
///////////////////////////////////////////////////////////////////////////////
#include "Global.h"
///////////////////////////////////////////////////////////////////////////////
// 控制器参数
struct Para
{
uchar Wiegand_format; // 1、韦根通信1 个字节,3 种选择,1~4
uchar Machine_addr; // 2、终端编号1 个字节,1~254
uchar Area_addr; // 3、终端区域编号1 个字节,1~240
uchar Secu_class; // 4、安全等级1 个字节,1~10
uchar Match_mode; // 5、匹配模式1 个字节,1~2
uchar Lock_para; // 6、锁控参数1 个字节,1~3
uchar Baudrate; // 7、串口速率1 个字节,1~6
};
union Para_u
{
uchar para_dat[7];
struct Para Actual_para;
}Para_ee; // 控制器参数
///////////////////////////////////////////////////////////////////////////////
// 内部存储区变量 0~128字节
data uchar cur_time[15]; // 系统当前时间显示存储区 XXXX年XX月XX日XX时XX分XX秒星期X
data uchar time[10]; // 读取时钟存储区
// 中断或系统
data uchar pulse=0; // 蜂鸣次数
data uchar key; // 键盘值
data uint time_out; // 通用超时定时器
data uchar on_timer=10; // 蜂鸣开启时延
data uchar off_timer=5; // 蜂鸣关闭时延
data uchar second=217; // 秒中断计数
data uchar door_state; // 门控状态
// 显示
data uchar u8CursorX; // 光标X坐标列
data uchar u8CursorY; // 光标Y坐标行
data uchar cs; // 显示片选
// SPI通信包参数
data char User_id[6]; // 用户编号0~65534
data char groupclass; // 用户分组信息
data uchar checksum; // 校验和
data uchar testchecksum; // 接收到的校验和
data uchar MSG=0; // 信息号
data uchar CSH; // 校验和ASC高字节
data uchar CSL; // 校验和ASC低字节
data uint SOHptr; // SPI缓冲区头指针
data uint ETXptr; // ETX位置
data uint CommandLen; // 命令体长度
// 韦根通信和485通信地址
idata uchar laddr; // 地址低字节ASC码
idata uchar haddr; // 地址高字节ASC码
idata uchar areaaddr; // 分组地址
idata uchar decaddr; // 设备地址
// 韦根通信包参数
data ulong Wiegand_dat; // 韦根通信数据
data uchar Wiecnt_max; // 韦根通信长度
data uchar Wgnd_count; // 韦根数据位计数
bdata bit recv_end; // 韦根接收结束
bdata bit W_rec_end; // 韦根写记录结束
bdata bit Odd; // 韦根校验位
bdata bit Even;
bdata bit sec_flag=0; // 秒计数标志
bdata bit KP; // 按键按下状态
bdata bit KM; // 按键抬起状态
bdata bit reverse; // LCD底色显示控制
bdata bit HandwareErr=FALSE; // 指纹模块工作状态
bdata bit ack; // 时钟I2C总线通信应答状态
bdata bit maxtrans=FALSE; // 大/小数据传输状态
bdata bit user_pass=FALSE; // 用户比对是否通过标志
bdata bit tele_alarm_on; // 布控/撤控标志
bdata bit alram_on=TRUE; // 防拆报警布防
bdata bit alram_off=TRUE; // 防拆报警撤防
bdata bit managemode=FALSE; // 管理员比对操作
data uchar Menu_state=0; // 菜单当前状态
// 小数据量串口通信
data uint recv_ctr; // 接收数据终止指针
data uint trans_ctr; // 发送数据指针
data uint trans_size; // 发送数据大小
data uchar disp_buf[12]; // 显示缓冲区
data uchar esc_count; // ESC按键计数
bdata bit comm_ok; // 通信状态
///////////////////////////////////////////////////////////////////////////////
// 内部存储区变量 128~256字节,其中系统用41字节
idata char matchmode; // 匹配模式
idata char lockmode; // 锁控方式
idata char wieformat; // 韦根格式
idata uchar baudrate; // 波特率
idata uint SOH_crt; // 数据包开始指针
idata char Start_user_id[6]; // 开始用户编号
idata char End_user_id[6]; // 终止用户编号
idata char Start_time[5]; // 开始时间
idata char End_time[5]; // 终止时间
idata char Security_level; // 安全等级0~4
idata char ManageClass; // 管理分类'M'管理用户'G'普通用户
idata char AppClass; // 应用分类'F'指纹用户'P'密码用户
idata char Password[7]; // 密码
///////////////////////////////////////////////////////////////////////////////
// 外部存储区变量 256~1280字节
xdata uchar SPIbuf[BUFSIZE]; // SPI和串行通信缓冲区
xdata uchar RTrecord[MAX_REALREC_SIZE]; // 实时记录缓冲区
xdata uchar recv_buf[RCVBUFSIZE]; // 接收数据缓冲区
xdata uchar trans_buf[TRANSBUFSIZE];// 发送数据缓冲区
xdata char tele_code[12]; // 报警电话号码
///////////////////////////////////////////////////////////////////////////////
// 中断1服务列程
// 10ms定时中断服务
///////////////////////////////////////////////////////////////////////////////
void timer0_isr() interrupt 1
{
TR0=0;
TH0=0xb8;
TL0=0x00; // 10ms
TR0=1;
Rstwdt(); // 喂狗
kbscan(); // 键盘扫描
if(pulse) // 蜂鸣器鸣叫处理
{
if(on_timer>0)
{
speaker=0; // 开启蜂鸣
on_timer--;
}
else
{
speaker=1; // 蜂鸣器关闭
if(off_timer>0)off_timer--;
else
{
pulse--; // 鸣叫次数
on_timer=10; // 蜂鸣器鸣叫时间 10*10ms
off_timer=5; // 蜂鸣器关闭时间 5*10ms
}
}
}
if(time_out>0)time_out--; // 通用定时器
if(!(second--)) // 秒标志
{
second=217; // 2.17秒,避免秒节点对齐
sec_flag=1;
}
}
///////////////////////////////////////////////////////////////////////////////
// 系统硬件初始化
///////////////////////////////////////////////////////////////////////////////
void Init()
{
idata uint i;
// 缓冲区变量初始化
maxtrans=FALSE; // 缺省数据为小数据量传输模式
recv_ctr=0;
trans_ctr=0;
trans_size=0;
// 变量初始化
for(i=0;i<6;i++) User_id[i]=0;
for(i=0;i<6;i++) Start_user_id[i]=0;
for(i=0;i<6;i++) End_user_id[i]=0;
for(i=0;i<7;i++) Password[i]=0;
for(i=0;i<5;i++) Start_time[i]=0;
for(i=0;i<5;i++) End_time[i]=0;
for(i=0;i<12;i++) disp_buf[i]=0;
for(i=0;i<12;i++) tele_code[i]=0;
tele_alarm_on=FALSE;
door_state=0x0f; // 门控状态
esc_count=0;
KP=0;
KM=0;
Menu_state=Menu_top;
// 系统寄存器设置
T2CON=0x30; // 设置T2为波特率生成器
TH2 = 0xff ;
TL2 = 0xb8; // 波特率设为9600bps
RCAP2H=0xff;
RCAP2L=0xb8;
TR2 = 1; // 允许T2中断
SCON=0x50; // 设置串行口通信格式
TCON|=0x05;
TMOD=0x11; // 定时器T2设为8位自动重装,T0为16位定时器
TH0=0xb8;
TL0=0x00; // 10ms
TR0=1; // 允许T0中断
P0=0xff;
P1=0xff;
Dir=0; // 不允许485发送
backlt=0; // 打开背光
P2=0xff;
P3=0xff;
P4=0xff;
ET0=1; // 允许T0中断
IT0=1;
IT1=1;
EX0=1; // 开放INT0
EX1=1; // 开放INT1
PS=1; // 串口为低级中断
COMENABLE; // 允许串口中断
ENABLE; // 允许所有中断
}
///////////////////////////////////////////////////////////////////////////////
// 系统硬件初始化
///////////////////////////////////////////////////////////////////////////////
void main(void)
{
idata uchar i;
idata uchar temp;
reset:
KC1=0;KC2=0; // 按键硬件初始化
GLCD_LcdInit(); // 液晶屏初始化
backlt=0; // 打开背光
GLCD_ClearScreen ();
DispLogo(); // 显示公司信息
ParaInit(); // 系统参数初始化
Init(); // 系统设置初始化
pulse=1;
if(wieformat>0) // 门禁模式
W_init(); // 韦根通信初始化
Baud_Init(); // 波特率
TURN_ON(); // 指纹摸板复位
Set_class(); // 设置MSS安全等级
disptime();
while(1) // 系统主循环处理
{
managemode=FALSE; // 非管理操作标志
if(key) // 键盘处理
{
backlt=0; // 打开背光
key_judge(); // 判键值
if(key=='X') // 连续按ESC键超过3秒
{
key=0;
goto reset; // 退出循环复位
}
key_proc(); // 用户常规操作
key=0;
}
host_proc(); // 处理上位机信息
if(!HandwareErr) // 指纹模块硬件复位
{
COMDISABLE; // 不允许串口
if(!maxtrans)
password_normal_work(); // 密码应急操作
TURN_ON(); // 指纹摸板复位
Set_class(); // 设置MSS安全等级
COMENABLE; // 允许串口
}
// 防拆报警检测
if(wieformat==1) // 自定义门禁方式
{
temp=10;
do{temp--;}while(Tamper&(temp>0)); // 防拆报警
if(temp==0)
{
door_state|=0x80; // 修改报警门控状态
if(wieformat==1) // 自定义门禁方式
{
if(alram_on) // 防止通信失败重发三次
{
for(i=0;i<10;i++)
Wait10ms();
tamper_alarm(); // 向门控器通过韦根报警
for(i=0;i<10;i++)
Wait10ms();
tamper_alarm(); // 向门控器通过韦根报警
for(i=0;i<10;i++)
Wait10ms();
alram_on=FALSE;
alram_off=TRUE;
}
}
}
else
{
door_state&=0x7f; // 修改报警门控状态
if(wieformat==1) // 自定义门禁方式
{
if(alram_off)
{
for(i=0;i<10;i++)
Wait10ms();
tamper_alarm_off(); // 向门控器通过韦根撤除报警
for(i=0;i<10;i++)
Wait10ms();
tamper_alarm_off(); // 向门控器通过韦根撤除报警
for(i=0;i<10;i++)
Wait10ms();
alram_off=FALSE;
alram_on=TRUE;
}
}
}
Wiegand_recv(); // 接收韦根数据
}
if(sec_flag) // 秒标志
{
disptime();
sec_flag=0;
if((wieformat==1)&&(lockmode!=2)) // 自定义门禁方式且不是联动方式收集实时状态信息
{
getdevstate(); // 获取门控状态
for(i=0;i<10;i++)
Wait10ms();
}
temp=(door_state&0xf0);
temp=temp>>4;
RTrecord[19]=Hex_ascii(temp); // 门状态
temp=(door_state&0x0f);
RTrecord[20]=Hex_ascii(temp);
for(i=0;i<14;i++) RTrecord[i+5]=cur_time[i];
if(user_pass)
{
user_pass=FALSE;
for(i=0;i<5;i++) RTrecord[i]=User_id[i];
}
else
{
for(i=0;i<5;i++) RTrecord[i]=0x39;
}
if((cur_time[6]==0x30)&&(cur_time[7]==0x31) // 01日
&&(cur_time[8]==0x30)&&(cur_time[9]==0x33) // 03时
&&(cur_time[10]==0x30)&&(cur_time[11]==0x30) // 00分
&&(cur_time[12]==0x30)&&(cur_time[13]<0x32)) // 00~02秒
{
Cal_sensor(); // 每月的01日03时00分00~02秒校正传感器
}
backlt=1; // 关闭背光
}
} // 系统主循环
}
///////////////////////////////////////////////////////////////////////////////
// 键盘扫描处理
///////////////////////////////////////////////////////////////////////////////
void kbscan()
{
idata uchar key_in;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -