⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 KEIL C上的门禁控制器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////////
//
// 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 + -