电子密码锁

摘要:

随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤为突出,传统的机械锁,由于其构造的简单,安全性能低,无法满足人们的需要。在科学技术不断发展的今天,电子密码防盗锁作为防盗卫士的作用显得日趋重要。

本文介绍了基于单片机的电子密码锁的设计,该系统由STC89C52RC与EEPROM AT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、LCD显示、报警、开锁等电路模块。这种电路设计具有智能控制上锁、开锁、报警、修改密码和防试探按键输入等多种功能,设置的密码具有长度可变、保密性强、灵活性高等特点。

经检验,该密码控制系统具有设计方法合理,简单易行,成本低,安全实用等特点,具有一定的推广价值。

关键词:电子密码锁;报警;液晶显示 

Abstract:

As people living standard rise, how to realize the family security which is particularly prominent, the traditional mechanical locks, due to its simple structure, safety performance is low, cannot satisfy the needs of the people. In the science technology development today, electronic security guards anti-theft lock passwords as the role is becoming more and more important.

This paper introduces the electronic combination lock based on single chip design, this system and by STC89C52RC EEPROM AT24C02 as main control chip and data memory unit, combined with peripheral keyboard input, LCD display, alarm, the lock circuit module, etc. This circuit design is intelligent control locked, the lock, alarm, modify, password and the test key input DuoZhong function, password has a length variable, and confidentiality and highly flexible higher characteristic.

Upon examination, the password control system has the design method is reasonable, simple, low cost, safe and practical characteristics, has certain value of popularization.

Keywords:Cipher lock  、SCM 、  Alarm


                                     目录

摘要

1 引言

1.1 选题背景

1.2 电子密码控制简介

1.3 本设计所要实现的目标

2 系统设计方案的选择

2.1主控部分的选择

2.2 密码输入方式的选择

3 系统总体设计和主要芯片介绍

3.1 系统总体设计

3.2 主要芯片介绍

3.2.1 STC89C54RD+

3.2.2 LCD1602显示器

4 系统硬件设计

4.1 键盘输入模块

4.2 液晶显示模块

4.3 密码存储模块

4.4 复位模块

4.5 晶振模块

4.6 开锁模块

4.7 报警模块

5 系统软件设计

5.1 主程序流程图

5.2 键扫描流程图

5.3 开锁流程图

5.4 修改密码流程图

6 调试及设计总结

参考文献 19

附录A:硬件原理图 20

附录B:源程序

第一章 引言

1.1选题背景

在安全技术防范领域,具有防盗报警功能的电子密码控制系统逐渐代替传统机械式密码控制系统,克服了机械式密码控制的密码量少、安全性能差的缺点,使电子密码控制系统无论在技术上还是在性能上都大大提高了一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码控制系统,它除了具有传统电子密码控制系统的功能外,还引入了智能管理、专家分析系统等功能,从而使密码控制系统具有很高的安全性、可靠性,应用日益广泛。

1.2电子密码控制简介

电子密码控制是一种通过密码输入来控制电路或芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。电子密码控制不论性能还是安全性都已超过了机械类。其特点如下:

①保密性好,编码量多,远远大于机械控制。随机开锁成功率几乎为零。

②密码可变,用户可以随时改变密码,防止密码被盗,同时也可避免因人员的更替而使控制的保密性下降。

③密码输入保护,当输入密码多次错误时,报警系统自动启动。

④使用灵活性好,不像机械锁必须佩戴钥匙才能开锁。

⑤电子密码锁控制系统具有操作简单易行,一学即会的特点。

1.3本设计所要实现的目标

本设计采用单片机为主控芯片,结合外围电路,组成电子密码控制系统,用户想要打开锁,必须通过提供的键盘输入正确的密码才可以,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。密码可以由用户自己修改设定,只有当输入密码正确后才可修改密码,修改密码时必修输入两次,当前后输入的新密码一样时修改才算成功,防止误操作。


第二章 系统设计方案的选择

2.1主控部分的选择

方案一:采用数字电路控制方案

用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,将密码保存在JK触发器中,与输入密码通过比较器比较,判断结果是否相相符合。采用数字电路设计的方案好处就是设计简单,但控制的准确性和灵活性差,故不采用。

方案二:采用以单片机为核心的控制方案

选用单片机作为系统的核心部件,实现控制与处理的功能。单片机具有资源丰富、速度快、编程容易等优点。利用单片机内部的随机存储器(RAM)和只读存储器(ROM)及其引脚资源,外接液晶显示(LCD),键盘输入等实现数据的处理传输和显示功能,基本上能实现设计指标,因此综合考虑,本系统采用方案二。

2.2密码输入方式的选择

方案一:指纹输入识别

指纹识别技术主要涉及四个功能:读取指纹图像、提取特征、保存数据和比对。通过指纹读取设备读取到人体指纹的图像,然后要对原始图像进行初步的处理,使之更清晰,再通过指纹辨识软件建立指纹的特征数据。软件从指纹上找到被称为“节点”(minutiae)的数据点,即指纹纹路的分叉、终止或打圈处的坐标位置,这些点同时具有七种以上的唯一性特征。通常手指上平均具有70个节点,所以这种方法会产生大约490个数据。这些数据,通常称为模板。通过计算机模糊比较的方法,把两个指纹的模板进行比较,计算出它们的相似程度,最终得到两个指纹的匹配结果,从而判断输入结果的正确与否。考虑到本方案软硬件太过复杂,而且成本也高,故不采用。

方案二:矩阵键盘输入识别

由各按键组成的矩阵键盘每条行线和列线都对应一条I/O口线,键位设在行线和列线的交叉点,当一个键按下就会有某一条行线与某一条列线接触,只要确定接触的是哪两条线,即哪两个I/O口线,就可以确定哪一个键被触动。 行线和列线初始状态都为高电平,通过不断读行线口线,或者中断方式触发键位扫描。当发现有键按下,将列线逐一置低,其他列线置高,读行线口线。当某条列线置低时,某条行线也被拉低,则确定这两条线的交点处的按钮被按下。每个按键都可通过程序赋予功能,从而完成密码识别。本方案简单易行,故采用。


第三章 系统总体设计和主要芯片介绍

3.1系统总体设计

本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可。系统整体框图如图3.1所示。

   

图3.1系统整体框图

各模块功能如下:

1.键盘输入模块:分为密码输入按键与两个功能按键,用于完成密码锁输入功能。

2.显示模块:用于完成对系统状态显示及操作提示功能。

3.复位电路:完成系统的复位。

4.报警电路:用于完成输错密码时候的警报功能。

5.密码存储模块:用于完成掉电存储功能,使修改的密码断电后仍能保存。

6.开锁电路:应用继电器及发光二极管模拟开锁,完成开锁及开锁提示。

3.2主要芯片介绍

3.2.1 STC89C54RD+

STC89C54RD+ 系列单片机是宏晶科技推出的新一代超强抗干扰/ 高速/ 低功耗的单片机,指令代码完全兼容传统8051 单片机,12 时钟/ 机器周期和6 时钟/ 机器周期可任意选择,最新的D 版本内部集成MAX810 专用复位电路。其引脚图如图3.2所示。

图3.2 STC89C54RD+引脚图

特点:

1. 增强型6 时钟/ 机器周期,12 时钟/ 机器周期 8051 CPU

2. 工作电压:5.5V - 3.4V(5V 单片机) / 3.8V - 2.0V(3V 单片机)

3. 工作频率范围:0 - 40 MHz,相当于普通8051 的 0~80MHz.实际工作频率可达48MHz.

4. 用户应用程序空间 4K / 8K / 13K / 16K / 20K / 32K / 64K 字节

5. 片上集成 1280 字节 / 512 字节 RAM

6. 通用I/O 口(32/36 个),复位后为: P1/P2/P3/P4 是准双向口/ 弱上拉(普通8051 传统I/O 口)

P0 口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻。

7 . I S P (在系统可编程)/ I A P (在应用可编程),无需专用编程器/ 仿真器

可通过串口(P3.0/P3.1)直接下载用户程序,8K 程序3 秒即可完成一片

8. EEPROM 功能

9. 看门狗

10.内部集成MAX810 专用复位电路(D 版本才有),外部晶体20M 以下时,可省外部复位电路

11.共3 个16 位定时器/ 计数器,其中定时器0 还可以当成2 个8 位定时器使用

12.外部中断4 路,下降沿中断或低电平触发中断,Power Down 模式可由外部中断低电平触发中断方式唤醒

13. 通用异步串行口(UART),还可用定时器软件实现多个UART

14.工作温度范围: 0 - 75℃ / -40 - +85℃

3.2.2  LCD1602显示器

现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符,有8位数据总线DB0~DB7和RS,RW,E三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。

接口信号说明:

1602型LCD的接口信号说明如表3.1所示。

表3.1 1602型LCD的接口信号说明

第1脚

GND 电源地

第9脚

DB2双向数据线

第2脚

VDD +5V电源

第10脚

DB3双向数据线

第3脚

VO 液晶显示偏压信号

第11脚

DB4双向数据线

第4脚

RS  数据/命令选择端

第12脚

DB5双向数据线

第5脚

RW 读/写 选择端

第13脚

DB6双向数据线

第6脚

E 使能端

第14脚

DB7双向数据线

第7脚

DB0双向数据线

第15脚

BG VCC背光源正极

第8脚

DB1  双向数据线

第16脚

BG GND背光源负极

主要技术参数:

1602型LCD的主要技术参数如表3.2所示。

显示容量

16×2个字符

芯片工作电压

4.5~5.5V

工作电流

2.0mA(5.0V)

模块最佳工作电压

5.0V

字符尺寸

2.95×4.35(WXH)mm

表3.2  1602型LCD的主要技术参数

基本操作程序:

读状态:令RS=L,RW=H, E=H    输出:DB0~DB7=状态字

读数据:令RS=H,RW=H, E=H    输出:无

写指令:令RS=L, RW=L, DB0~DB7=指令码,E=高脉冲 输出:DB0~DB7=数据

写数据:令RS=H,RW=L, DB0~DB7=数据,E=高脉冲  输出:无


第四章 系统硬件设计

本系统外围主要矩阵键盘模块、液晶显示器模块、密码存储模块、复位模块、报警模块和开锁模块组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后进过单片机对用户输入的密码与保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警。

 4.1键盘输入模块

由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行和列组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。本设计中使用的这个3×4键盘不但能完成密码的输入还能作特别功能键使用。键盘的每个按键功能在程序设计中设置。其电路图如图4.1所示。

图 4.1键盘电路

4.2液晶显示模块

显示部分由液晶显示器LCD1602取代普通的数码管完成。开锁时,按下键盘上的开锁按键后,利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*,最多能输入6位密码。当密码输入完成时,按下确认键,如果输入的密码正确的话, LCD显示“Open”,单片机其中P1.4引脚会输出低电平,使电磁铁吸合,继电器开关跳转,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“Error”,P1.5输出的是低电平,电子密码锁不能打开,蜂鸣器报警。通过LCD显示屏,可以清楚地判断出密码锁所处的状态。其电路图如图4.2所示。

图4.2 LCD液晶显示

4.3密码存储模块

本设计采用STC89C54RD+单片机内部eeprom。在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。这样不光会增加开发成本,同时在程序开发上也要花更多的心思。在STC89C54RD+单片机中内置了EEPROM(其实是采用IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。

4.4复位模块

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C1上的电压很小,复位下拉电阻上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于

某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。增加手动复位按键是为了避免死机时无法可靠复位。当复位按键按下后电容C1通过R7放电。当电容C1放电结束后,RST端的电位由R7与R8分压比决定。由于R7<<R8 因此RST为高电平,CPU处于复位状态,松手后,电容C1充电,RST端电位下降,CPU脱离复位状态。R5的作用在于限制按键按下瞬间电容C1的放电电流,避免产生火花,以保护按键触电。其电路图如图4.4所示

图4.4 复位模块

4.5晶振模块

STC89C52RC引脚XTAL1和XTAL2与晶体振荡器及电容C1、C2按图4-5所示方式连接。晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C1的容量有关,但主要由晶振频率决定,根据实际情况,本设计中采用12MHZ作为系统的外部晶振。电容取值为33pF。其电路图如图4.5所示。

图4.5晶振模块

4.6开锁模块

开锁控制电路的功能是当输入正确的密码后将锁打开。系统使用单片机其中一引脚线发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开。用户通过键盘任意设置密码,并储存在EEPROM中作为锁码指令。开锁步骤如下:首先按下键盘上的开锁按键,然后利用键盘上的数字键0-9输入密码,最后按下确认键。当用户输入密码后,单片机自动识别密码,如果密码不符,则报警。只有当密码正确,单片机才能使继电器处于开锁状态。具体电路如图4.6所示。

图4.6开锁模块

4.7报警模块

报警部分由压电蜂鸣器及外围电路组成,当有键按下时,“叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,三极管导通蜂鸣器发出噪声报警。其电路图如图4.7所示。

图4.7报警模块
第五章 系统软件设计

软件设计由主程序、键盘扫描程序、开锁程序、修改密码程序、LCD显示程序、EEPROM读写程序等组成。

5.1主程序流程图

如图5.1所示为主程序流程图,程序运行开始,LCD初始化设置,让后进行按键扫描,如果按下开锁键则进入开锁子程序,如果按下修改键则进入修改密码子程序,程序运行结束返回。

图5.1 主程序流程图

5.2键扫描流程图

如图5-2所示为键盘扫描以及键值计算流程图,程序主要是检验是否有键按下,计算所按键的键值,最后执行相应的键值程序。

                   

  

     键盘扫描                                      键值计算

图5.2 键盘扫描流程图

5.3开锁流程图

 如图5.3为开锁流程图,程序主要完成判断输入密码是否正确,并完成相应的开锁或报警功能。

图5.3 开锁流程图

5.4修改密码流程图

如图5.4所示为修改密码流程图,程序主要完成检验前后密码是否一致,如果一致则存储新密码。

图5.4修改密码流程图


第六章 调试及设计总结

调试过程:

第一步:调试LCD显示程序。

第二步:调试键盘。通过在键盘上输入数字在LCD上显示。

第三步:调试单片机内部eeprom.通过送一个数字来验证单片机内部eeprom是否能读数据和存储数据。

第四步:调试整个程序。根据所要实现的功能将各个模块连接在一起。

总结:

在做本次设计时,通过查阅网络与图书馆搜集到的资料,再加上指导老师指点,结合生活中对密码锁的功能特性要求,设计出了这一套电子密码锁系统的主要硬件结构和软件结构,基本完成了课题的要求。不过由于了解的专业知识尚浅,对课题的研究经验的不足,使得在技术的解决与运用上显得粗糙了一些,特别是功能按键的设定。所幸该系统能基本上完成一个电子密码锁应有的功能特性:开锁提示,输错报警,密码修改,掉电存储。本系统用的是密码长度可变输入,密码输入方案比较多,相较于机械锁具,防盗能力已经相当不俗。这个系统软硬件设计简单,易于开发,成本较低,安全可靠,操作方便。

本次设计的电子密码锁是以手动键盘输入密码的,通过这几周对电子密码锁的研究学习,发觉这种密码输入方式可以进行改革。在越来越高科技化的今天,遥控控制显的愈发重要,今后的电子密码锁应该具有以红外技术或无线电技术为辅助的密码按键输入远程交互技术,这样就能远程输入密码完成操作。也可以放弃传统的按键输入密码模式,借助传感器技术运用声控来实现密码输入,又或者人脸识别技术,还有一种就是用户指纹输入方式,这些都可以使开锁的时间更短更方便。电子密码锁产业将向静态功耗更低,外围电路更简化,可提供的功能或控制口更多,更人性化高科技化的方向发展。

通过本次毕业设计的锻炼,我学到了很多有关电子密码锁的设计方法与工作原理,巩固了单片机知识。期间也碰到不少问题,比如系统调试时碰到过许多没有预料的错误,但经过仔细的审查,还是一一解决了。通过这次设计让我也深刻的体会到过程是很重要的,只有耐心细心努力地去把握过程,才能得到可喜的结果。


参考文献

[1] 潘新民.微型计算机控制技术实用教程.北京:电子工业出版社,2006.1

[2] 郭天祥.51单片机C语言教程.北京:电子工业出版社,2009.1

[3] 潘永雄.新编单片机原理与应用.西安:西安电子科技大学出版社,2007.2

[4] 赵景波.Protel 2004电路设计.北京:电子工业出版社,2007.4

[5] 何立民.单片机应用技术选编.北京:北京航空大学出版社,1998

[6] 叶启明.单片机制作的新型安全密码锁.家庭电子.2000,第六期:24-27

[7] 胡汉才.单片机原理及接口技术.北京:北京航空航天大学出版社,1993

[8] 涂时亮.单片微机控制技术.上海:复旦大学出版社,1994

[9] 杨文龙.单片机原理与应用.西安:西安电子科技大学出版社,1999

[10] 李明喜.新型电子密码锁的设计.机电产品开发与创新.2004,第八期

附录A:硬件原理图


附录B:源程序

#include<reg52.h> //头文件

#include<stdio.h>

#include"1602.h"

#include"delay.h"

#include"keyboard.h"

#include "j.h"

#include "beep.h"

#include "eeprom.h"

unsigned int cou=0;

void init (void);

void timestart(void);

void timestop(void);

void passwordinit(void); //密码初始化,上电前按住小数点键后松开即可

void key_lock(void);

unsigned char  password[16];//可以更改此密码做多组测试

bit passwordchange,beepflag;

unsigned char password_init[8]={1,9,8,9,1,1,1,1};

/*------------------------------------------------主程序------------------------------------------------*/

void init (void){ //上电初始化

TMOD = 0x01;         // 定时/计数器0,1工作于方式1   

    TH0 = 0x3c;          // 预置产生50ms时基信号   

    TL0 = 0xb0;   

    EA = 1;              // 开总中断   

   

}

main()

{

 unsigned char num,i,j,z=1,fpl,m;                  

 unsigned char passwordtemp[16];        //最大输入16个

 unsigned char passwordfrist[16];

 unsigned char inputtimes,inputtimes1;              //密码输入错误次数

 unsigned char passwordlength,PLEN;     //输入密码长度,实际密码长度sizeof(password)/sizeof(password[0]);//用于计算出实际密码长度

 bit Flag,flagfrist,flagsecond,flagthird,wrongflag,time_counter,in_flag;

 init ();

 LCD_Init();         //初始化液晶屏

 DelayMs(10);        //延时用于稳定

 LCD_Clear();        //清屏

 //beepflag=1;

 red=0;green=1;

 passwordinit();

 PLEN=readpassword();

 LCD_Write_String(0,0,"BOSS: ChengHua"); //写入第一行信息LCD_Write_String(0,1,"QQ: 1034723421   ");    //写入第二行信息

 while (1)         //主循环

 {

if(z==1)

{

LCD_Write_String(0,0,"BOSS: ChengHua ");   

    LCD_Write_String(0,1,"QQ: 1034723421    ");    

if(beepflag) LCD_Write_Char(15,0,'&');//模式设置,没有&符号,为静音模式

else LCD_Write_Char(15,0,' ');//

time_counter=0;

in_flag=0;

}

num=KeyPro();  //扫描键盘

if(num==12&&in_flag==0)    //蜂鸣器设置

{

beepflag=~beepflag;  

if(beepflag) LCD_Write_Char(15,0,'&');

}

if(num==11&&in_flag==0)   //进入改密码

{

passwordchange=1; //改密码标志

i=0;

z=0;

}

if(num==15||cou>=1000) //退出键退出,及超时退出

{

num=0xff;

i=0;

m=0;

z=1;

   timestop();  //清除时钟

passwordchange=0;  //改密码模式标志清零

inputtimes=0;  //输入次数清零

inputtimes1=0;

flagfrist=0;

flagsecond=0;

flagthird=0;

wrongflag=0;

in_flag=0;

key_lock();

}

if(z==0)

{

LCD_Write_Char(14,0,0x30+(50-(cou/20))/10);

LCD_Write_Char(15,0,0x30+(50-(cou/20))%10);

  }

if((num<10||(num==13&&i!=0)||num==14)&&passwordchange==0)  //如果扫描是按键有效值则进行处理

    {

z=0;

    if(i==0)    //输入是第一个字符的时候需要把改行清空,方便观看密码

{

if(time_counter!=1&&in_flag==0) timestart();

LCD_Write_String(0,0,"Input password");

    LCD_Write_String(0,1,"                ");//清除该行

}

if(i<16 && num<10)

{

       passwordtemp[i]=num;

       LCD_Write_Char(i,1,'*');//输入的密码用"*"代替

   i++;

   in_flag=1;

}

 

if(num==13&&i>=1) //删除一位

{

i=i-1;

LCD_Write_Char(i,1,' ');

}

if((14==num)|| (i==16))//输入按键值15或者密码输入到最大值16,表示输入结束,需要进行比对

    {

      passwordlength=i;  //计算输入密码长度

  i=0;  //计数器复位

  if(passwordlength==PLEN)//长度相等则比较,否则直接输出错误

       {

     Flag=1;//先把比较位置1

     for(j=0;j<PLEN;j++)//循环比较8个数值,如果有一个不等 则最终Flag值为0

        Flag=Flag&&(passwordtemp[j]==password[j]);//比较输入值和已有密码

            }

              if(Flag)//如果比较全部相同,标志位置1

  {

    LCD_Write_String(0,0,"Welcome back!           ");//清除该行

        LCD_Write_String(0,1,"Right Open!>>>>>");//密码正确显示的信息

timestop();

time_counter=0;

open();

z=1;

        inputtimes=0;//输入正确则次数清零,重新计数

        Flag=0;      //清除正确标志

       }

      else

           {

LCD_Write_String(0,1,"                ");//清除该行

LCD_Write_String(0,1,"Wrong! Retry!");//密码错误,提示重新输入

time_counter=1;   //输入错误标志

inputtimes++;//连续输入错误,则次数累加

if(inputtimes>=3)

         {

   LCD_Write_String(0,0,"Get out of here!        ");警告语

   LCD_Write_String(0,1,"Alart! Alart!    ");//报警            beep2();

   z=1;

   time_counter=0;

     }

         }

        }

    }

/******************************改密码模式****************************/

if((num<10||(num==13&&m!=0)||num==14||num==11)&&passwordchange==1)   {

z=0;

    if(m==0 && flagfrist==0)    //输入是第一个字符的时候需要把该行清空   {

if(time_counter!=1&&in_flag==0) timestart(); //仅初次按下按键开启倒计时

LCD_Write_String(0,0,"Old password  ");

    LCD_Write_String(0,1,"                ");//清除该行

}

if(m==0&&flagsecond==1)

{

 LCD_Write_String(0,0,"Input again    ");

     LCD_Write_String(0,1,"                       ");//清除该行

}

if(m<16 && num<10)

{

       if(flagfrist==0||flagsecond==1)  passwordtemp[m]=num;

   if(flagfrist==1&&flagsecond==0)  passwordfrist[m]=num;

       LCD_Write_Char(m,1,'*');//输入的密码用"*"代替

   m++;

   in_flag=1;

}

if(num==13&&m>=1)  //删除一位

{

m=m-1;

LCD_Write_Char(m,1,' ');

}

if((14==num)|| (m==16))//输入按键值14或者密码输入到最大值16,表示输入结束,需要进行比对

    {

      passwordlength=m;  //计算输入密码长度

  m=0;  //计数器复位

  if(passwordlength==fpl && flagfrist==1 && flagsecond==1)//长度相等则比较,否则直接输出错误

       {

    flagthird=1;//先把比较位置1   

for(j=0;j<fpl;j++)

flagthird=flagthird&&(passwordfrist[j]==passwordtemp[j]);  //新密码校验

if(flagthird==0)   

{

 wrongflag=1;

 LCD_Write_String(0,1,"                ");

     LCD_Write_String(0,1,"Wrong! Retry!");

}

else   wrongflag=0;

            }

  if(passwordlength!=fpl && flagfrist==1 && flagsecond==1)

  {

   wrongflag=1;

   LCD_Write_String(0,1,"                ");

LCD_Write_String(0,1,"Wrong! Retry!");

  }

  if(flagfrist==1&&flagsecond==0)   

   {

fpl=passwordlength;

flagsecond=1;

   }

  if((passwordlength==PLEN) && (flagfrist==0))//长度相等则比较,否则直接输出错误

       {

     flagfrist=1;//先把比较位置1

     for(j=0;j<PLEN;j++)//循环比较8个数值,如果有一个不等 则最终Flag值为0

 flagfrist=flagfrist&&(passwordtemp[j]==password[j]);// 第一轮比较  旧密码

            }   

              if(flagfrist==1 && flagsecond==0)//设置新密码

  {

    LCD_Write_String(0,0,"New password           ");//清除该行

        LCD_Write_String(0,1,"                       ");//密码正确显示的信息

inputtimes1=0;

time_counter=1;

       }

  else  if(flagsecond==1 && flagthird==0&&wrongflag==0)//再次输入新密码

  {

    LCD_Write_String(0,0,"Input again    ");//清除该行

        LCD_Write_String(0,1,"                       ");//密码正确显示的信息

inputtimes1=0;

time_counter=1;

       }

  else  if(flagthird==1)//如果比较全部相同,标志位置1

  {

    LCD_Write_String(0,0,"Modify success      ");//清除该行

        LCD_Write_String(0,1,"congratulations!       ");//密码正确显示的信息

for(j=0;j<fpl;j++)

{

password[j]=passwordfrist[j];

}

savepassword(fpl);

PLEN=fpl;

beep5();

z=1;

flagfrist=0;

flagsecond=0;

        flagthird=0;

passwordchange=0;

inputtimes1=0;     

       }

      else

           {

LCD_Write_String(0,1,"                ");

LCD_Write_String(0,1,"Wrong! Retry!");

inputtimes1++;//连续输入错误,则次数累加

wrongflag=0;

time_counter=1;

if(inputtimes1>=3)

         {

   LCD_Write_String(0,0,"Get out of here!        ");

   LCD_Write_String(0,1,"Alart! Alart!    ");

   beep2(); //报警30s

   z=1;

     }

         }

wrongflag=0;

        }

    }

  }

}

void tiem0(void) interrupt 1{   // T/C0中断服务程序(产生50ms时基信号)   

    cou++;                     // 软计数器加1   

TH0 = 0x3c;                // 重置定时常数   

    TL0 = 0xb0;   

}

void timestart(void)

{

cou=0;

 ET0 = 1;             // 定时/计数器0允许中断  

 TR0 = 1;

}

void timestop(void)

{

 TR0 = 0;

 ET0 = 0;             // 定时/计数器0允许中断

 cou=0;

}

void passwordinit(void)

{

unsigned char num,j;

num=KeyPro();  //扫描键盘

if(num==10)

{

  for(j=0;j<8;j++)

{

password[j]=password_init[j];

}

savepassword(8);

LCD_Write_String1(0,0,"Password initial ");    //写入第一行信息,主循环中不再更改此信息,所以在while之前写入

            LCD_Write_String1(0,1,"success!   ^v^");    //写入第二行信息,提示输入密码

DelayMs(3000);

}

}

void key_lock(void)

{

unsigned char i;

LCD_Write_String(0,0,"Keyboard locked ");    //写入第一行信息,主循环中不再更改此信息,所以在while之前写入

        LCD_Write_String(0,1,"Waiting  unlock.");    //写入第二行信息,提示输入密码

for(i=0;i<3;i++)

DelayMs(1000);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值