#include "type.h"
//******************************************************************************
// 名称:门禁模拟
//编写:Lerny
//模拟现实中门禁系统,可以输入密码进入也可以呼叫住户,再由住户按下开门按键
//实现改密码功能,密码保存在24c02中能保证掉电不丢失密码。八个LED灯分别代表
//8家住户,其中开门按键为共用,还带有忘记密码恢复按钮,模拟恢复出厂设置,
//显示部分为LCD1602。程序共分为3种模式,分别为 等待输入 密码修改 呼叫住户
//3种模式,其中等待输入是主要状态,所以在进入密码修改 呼叫住户模式后如果
//长时间没有操作能自己切换到等待输入模式。
//
//等待输入模式:当密码长度不为6位,显示长度错,当密码长度为6位但不正确则
// 提示密码输入错误,错误提示信息将显示大概2S后消失,密码正确
// 则开门灯点亮,关门灯熄灭,液晶屏显示门打开。并自动计时10S左
// 右自动关门,也可以手动按关门键。
//
//密码修改模式:进入密码修改模式提示输入旧密码,密码正确后输入新密码,这时
// 会将新密码写入24c02保存。如果使用者长时间未做操作将切换回等
// 待输入模式。
//
//呼叫住户模式:提示输入住户门牌,如果输入门牌存在,则点亮相应的灯,如果
// 用户按开门键,熄灭灯,显示提示门打开,门在10S时间左右关闭,
// 如果使用者长时间未做操作将切换回等待输入模式。
//******************************************************************************
//***********************************
//接收键盘值
//***********************************
unsigned char ucKeyVal;
//***********************************
//用于液晶屏欢迎语的地址通过
//对变量的自加实现地址的变换
//从而实现滚动显示
//***********************************
unsigned char ucStrSet;
//***********************************
//定时器中的计数变量,液晶屏滚动
//速度通过该变量实现
//***********************************
unsigned char ucCount;
//***********************************
//用于标记液晶屏刚开始显示停顿时间
//***********************************
unsigned char ucLockTime;
//***********************************
//用于标记液晶屏显示末尾的停顿时间
//***********************************
unsigned char ucStringList;
//***********************************
//密码输入是 '*' 号显示位置设定
//***********************************
unsigned char ucCharSet = 5;
//***********************************
//密码校验比较结果
//1:密码正确 0:密码错误
//***********************************
unsigned char ucCheckResult;
//***********************************
//数字输入次数的计算
//***********************************
unsigned char ucAddr;
//***********************************
//清除输入内容索引
//***********************************
unsigned char ucIndex;
//***********************************
//开关门状态显示清楚时间计数
//***********************************
unsigned char ucDisStateClearCount;
//***********************************
//开门后关门的倒计时
//***********************************
unsigned char ucCloseTimeIndex;
//***********************************
//错误输入显示时间
//***********************************
unsigned char ucErrorDisTime;
//***********************************
//错误、关门输入标记
//***********************************
unsigned char ucErrorDisFlag;
//***********************************
//错误、关门输入显示清除标记
//***********************************
unsigned char ucErrorClear;
//***********************************
//运行模式标记
//***********************************
unsigned char ucModeFlag;
//***********************************
//切换显示内容后重新设置地址标记
//***********************************
unsigned char ucModeWaitFirst;
unsigned char ucModeChangePasswordFirst;
unsigned char ucCallFirst;
//***********************************
//开门后关门的倒计时显示缓存
//***********************************
unsigned char idata ucCloseTime[11] = {'0','0','1','2','3','4','5','6','7','8','9'};
//***********************************
//呼叫倒计时显示缓存
//***********************************
unsigned char idata ucCallTimeDis[11] = {'0','0','1','2','3','4','5','6','7','8','9'};
//*******************************************
//修改ucDisTable数组内字符串即
//可修改液晶屏第一行显示的值
//*******************************************
unsigned char idata ucStrTable[100];
//********************************************
//系统默认密码
//********************************************
unsigned char ucPasswordBuf[6] = {'1','2','3','4','5','6'};
//********************************************
//用来比较密码是否正确
//********************************************
unsigned char ucCheckPassword[6];
//********************************************
//退出密码修改模式标记
//********************************************
unsigned char ucExitChangePassword;
//********************************************
//退出密码修改模式计数
//********************************************
unsigned char ucExitChangePasswordCount;
//********************************************
//第一步骤完成标记
//********************************************
unsigned char ucVerifyVal;
//********************************************
//楼层信息显示位置设定
//********************************************
unsigned char ucFloorCharSet = 6;
//********************************************
//保存用户输入楼层信息
//********************************************
unsigned char ucFloor[3];
//********************************************
//楼层信息共分为3个字符保存ucDatAddr
//用来保存当前输入为第几位
//********************************************
unsigned char ucDatAddr;
//********************************************
//呼叫消息标记位,必须等待户主响应或
//等待响应时间到才能继续其他操作
//********************************************
unsigned char ucMesFlag;
//********************************************
//呼叫计数,用一段时间模拟户主是否在,时
//间到则户主不在退出呼叫模式或再次呼叫
//********************************************
unsigned char ucCallTime;
//********************************************
//呼叫时间到,清除当前显示消息标记
//********************************************
unsigned char ucCallMesClear;
//********************************************
//呼叫倒计时显示
//********************************************
unsigned char ucCallTimeIndex;
//********************************************
//模式切换后若无操作则开始计数
//当计数到一定值就自动切换为
//等待模式,只要有数字键按下
//就清零该变量
//********************************************
unsigned char ucOperateCount;
//*********************************************
// 定时器初始化子程序
//*********************************************
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = 0x3c; //高位送值
TL0 = 0xaf; //低位送值
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器开关打开
}
//*********************************************************************
// 密码输入函数
//调用本函数能将用户输入键值保存到pEnterBuf地址中
//主要用于密码输入与密码修改,能判断输入密码是否为
//6位数,是则返回 1 ,不是则返回 0 并显示密码长度有误
//*********************************************************************
unsigned char KeyboardEnter(unsigned char *pEnterBuf)
{
//判断输入是否为数字,是数字则处理,不是或如果门为打开,或显示错误信息则不做处理
if(ucNumFlag && OPEN && !ucErrorDisFlag)
{
//将输入密码保存到用来比较的数组
pEnterBuf[ucAddr] = ucKeyVal;
ucAddr ++;
//有按键按下等待操作计数清零
ucOperateCount = 0;
//密码显示为 ’*‘ 号
LCD_Write_Char(ucCharSet,1,'*');
ucCharSet ++;
}
//如果输入密码后按下取消键则重新输入
if(ucKeyVal == ESC)
{
LCD_Write_String(0,1," ");
ucCharSet = 5;
ucAddr = 0;
}
//按下确认键后开始比较输入密码是否为系统密码
if(ucKeyVal == ENTER)
{
//有按键按下等待操作计数清零
ucOperateCount = 0;
//复位 '*' 号显示位置
ucCharSet = 5;
//判断长度是否为6位
if(strlen(pEnterBuf) == 6)
{
基于51单片机门禁系统模拟仿真设计资料 包含源程序及仿真文件
版权申诉
5星 · 超过95%的资源 76 浏览量
2021-10-30
08:35:05
上传
评论 3
收藏 300KB RAR 举报
xiaofang3106
- 粉丝: 45
- 资源: 508
最新资源
- QuestionTwo.java
- QuestionOne.java
- OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 南京邮电大学数学实验:熟练掌握 Matlab 软件的基本命令和操作
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 2017校招真题校园招聘真题算法题(37道)Python源码.zip
- 基于单片机protues仿真的多功能自动饮水机系统设计(仿真图、源代码、演示视频)
- 论文《一种修复流程挖掘事件日志中缺失活动标签的深度学习方法》翻译
- 智慧电厂相关资料发电控制的方式
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页