门禁电子密码锁说明书(2)

2020-02-22 12:09

键。当数字键是输入对应的0~9数字的,返回键是取消所有调整返回到常态显示时间的,确认键是对用户或管理员的操作进行确认的,管理员模式下修改密码按键才有效,调时钟按键按下则暂停时钟走时进行时间修改。

按键的分配如图: 注:

1 2 3 U U:设置用户密码;

A:设置管理员密码; ESC:返回;

A 5 6 4 ENT:确认;

无 9 8 7 调时 0 ENT ESC 图2

数码管模块:常态下显示时间值,开锁模式下显示输入的密码状态,以‘-’来显示,管理员模式下全部显示’-’,调整时间时显示所调整的时间值。

继电器模块:当用户密码输入正确时由单片机发出指令让继电器工作打开门。 24C02模块:保存用户密码和管理员密码,与单片机通过I2C总线协议进行通信,I2C通信只有一根数据线SDA和一根时钟线SCL,通信前由单片机发出一个起始信号,之后在时钟线SCL高电平期间把数据线SDA上的数据发送给24C02,在时钟线高电平期间数据先上的数据必须保持,SCL为低电平是SDA上的数据才能发生改变,当发送完一个字节后从器件24C02会向单片机发送一个应答信号,单片机接收到应答信号后可以发出终止信号终止通信。

3、软件设计说明 主程序:

主程序是整个程序的主体,可以对各个子程序进行调用,协调各个子程序之间的联系,控制着整个系统的工作流程。系统上电后进入主程序,先对系统各个模块自检,后对系统初始化,之后就循环进行主流程工作。 主程序流程图: 拆字

开始 开机自检 初始化 按键检测 6

控制工作

图3

显示 核对密码 四、 局部程序设计说明

1、 按键检测程序 代码如下: void sm_key() {

int i=0,j; uchar a,b,c,k; key=0x0f; lb[4]=lb[3]; lb[3]=lb[2]; lb[2]=lb[1]; lb[1]=lb[0]; lb[0]=key; //滚动滤波存储 for(j=0;j<4;j++) { if(lb[j]!=lb[j+1]) //还要有两个单元不相等则退出函数 return; k=lb[j+1]; } pd[1]=pd[0]; pd[0]=k; //稳定状态的值存入pd[1]和pd[0] if((pd[1]==0x0f)&&(pd[0]!=0x0f)) //pd[1]是0x0f,pd[0]不是0x0f则按下 { key=0x0f; a=key&0x0f; key=0xf0; b=key&0xf0; c=a|b;//线反转后键状态值存入c while(c!=key_code[i]) i++; //查找第几个按键按下 keyvalue=i; if(y==0) {

seg=sdm[keyvalue]; //按键对应段码送出显示 x++;//记录按键按下次数 return; }

switch(keyvalue)//执行相应按键功能 {

case(0):k0(); break; case(1):k1(); break; case(2):k2(); break;

7

case(3):k3(); break; case(4):k4(); break; case(5):k5(); break; case(6):k6(); break; case(7):k7(); break; case(8):k8(); break; case(9):k9(); break; case(10):k10(); break; //case(11):k11(); break; case(12):k12(); break; case(13):k13(); break; case(14):k14(); break; case(15):k15(); break; } } }

程序开始先进行滚动存储,lb[5]这个数组用来存储最近5次按键状态值的,接着判断这5个单元内容是否相等,如果不等则退出该函数,相等则接着判断是否是按下,若pd[1]为0x0f且pd[0]不为0x0f则是按键按下,然后查表找到与当前按下的键状态值相等的位置,记录得到键值,执行对应键功能。 程序流程如图:

开始

按键是否按下 是 查找按键

返回

图4

2、 拆字程序 代码如下: void cz() {

if(y==1&&(ms==0||ms==4)) //常态和继电器工作下拆时间单元

8

执行键功能

{

seg_disp[0]=sdm[clk_value[0]/10]; seg_disp[1]=sdm[clk_value[0]]; seg_disp[2]=0x40;

seg_disp[3]=sdm[clk_value[1]/10]; seg_disp[4]=sdm[clk_value[1]]; seg_disp[5]=0x40;

seg_disp[6]=sdm[clk_value[2]/10]; seg_disp[7]=sdm[clk_value[2]]; }

if(y==2||y==3) //开锁模式和管理员模式把jm_disp[8]的内容给缓冲单元 {

seg_disp[0]=jm_disp[0]; seg_disp[1]=jm_disp[1]; seg_disp[2]=jm_disp[2]; seg_disp[3]=jm_disp[3]; seg_disp[4]=jm_disp[4]; seg_disp[5]=jm_disp[5]; seg_disp[6]=jm_disp[6]; seg_disp[7]=jm_disp[7]; } }

拆字程序在常态不做任何调整下和打开门时把时间值存储数组里面的内容拆到数码管显示缓冲单元里面暂存,当处于开锁模式或管理员模式下则把jm_disp[8]数组里面的内容一一对应赋给数码管显示缓冲单元,开锁模式下,每输入一个密码,jm_disp[8]单元里面就回存一个‘-’的段码,在界面上显示出密码输入的位数,管理员模式下,jm_disp[8]里面全部存一个相同的段码,让数码管显示当前是管理员操作界面。 程序流程如图: 否 是 否 是

开始 y=1? Y=2或y=3? 时间拆字 界面显示拆字 返回 9

图5

3、 显示程序 代码如下: void disp() {

int i; for(i=0;i<8;i++) //8个数码管逐个点亮 { switch(i) //送出位选码 { case(0):LSA=0; LSB=0; LSC=0; break; case(1):LSA=1; LSB=0; LSC=0; break; case(2):LSA=0; LSB=1; LSC=0; break; case(3):LSA=1; LSB=1; LSC=0; break; case(4):LSA=0; LSB=0; LSC=1; break; case(5):LSA=1; LSB=0; LSC=1; break; case(6):LSA=0; LSB=1; LSC=1; break; case(7):LSA=1; LSB=1; LSC=1; break; } if(y==0) { seg=0xff;//刚启动时数码管段码全1逐个检测数码管 Delay1ms(500); //亮0.5秒 } else { seg=seg_disp[i]; //数码管显示缓冲单元的段码点亮数码管 Delay1ms(1); } seg=0x00; //消除窜显 } }

刚启动系统时,显示程序逐个检测数码管,把数码管8段全部点亮,自检完成后,显示程序把数码管显示缓冲单元里的内容送出到数码管段码口点亮数码管,使之显示相应的数据,该程序里是8个数码管逐个点亮过去,每显示完一个数码管都会灭掉数码管,等下一次循环在点亮下一个数码管,目的是为了消除数码管之间的窜扰显示。 程序流程如图:

10


门禁电子密码锁说明书(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:洛阳牡丹通讯股份有限公司生产实习方案2015

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: