毕业论文- 再度修改版

更新时间:2024-06-26 12:49:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

广州大学华软软件学院

本科毕业论文

论文题目 超市存包柜密码锁的设计

专 业 自动化(智能电子技术) 班 级 12级自动化(智能电子技术)1班 姓 名 汤展宏 学 号 1240909124

指导教师 李芳

广州大学华软软件学院电子系

2016年 4 月

摘要 针对超市商场的物品存放问题,提出一种随机密码的自动存包柜的设计方

法。系统采用了STC89C51单片机最小系统、AT24C02存储芯片、4X4矩阵键盘、LCD1062显示和报警系统,能产生一组5位随机密码,并有修改密码功能,断电能保存密码原状态,密码使用一次有效,有三次容错功能,三次错误输入后密码锁定并报警,根据光敏原件还能调节显示屏的亮度,达到节约用电。具有防盗报警等功能的电子存包柜代替需要携带钥匙、人员管理和安全性差的机械式锁已是必然趋势。

关键词 自动存包柜;随机密码;STC89C51;报警

I

ABSTRACT For supermarket goods storage problems,propose a design method of

random passwords of automatic lockers. The system uses the smallest single-chip system STC89C51, AT24C02 memory chip, 4X4 matrix keyboard, LCD 1062 displays and alarm system, that can produce a set of five random passwords, and change password function, power off can save passwords original state,password can only be used once, password can be wrong three times, after three wrong password locking and alarm, also adjust the brightness of the displays based on the photosensitive member, to save electricity. A burglar alarm electronic lockers is an inevitable direction, it will replace the portable key, poor security and personnel management mechanical locks.

KEY WORDS Automatic lockers;Random passwords;STC89C51;Alarm

II

目 录

1 前 言 ............................................................... 1

1.1 研究背景和意义 ................................................ 1 1.2 自动存包柜设计内容 ............................................ 1 2 总体设计 ............................................................ 3

2.1 电子密码锁设计的要求 .......................................... 3 2.2 设计方案的选定 ................................................ 3

2.2.1 采用数字电路控制 ........................................ 3 2.2.2 采用以单片机为核心的控制器件 ............................ 4

3 系统硬件电路设计 .................................................... 5

3.1 系统硬件电路 .................................................. 5 3.2 单片机的最小系统电路 .......................................... 5

3.2.1 复位电路 ................................................ 6 3.2.2 时钟电路 ................................................ 7 3.3 矩阵键盘设计电路 .............................................. 8 3.4 储存芯片电路设计 .............................................. 9 3.5 继电器驱动模块 ............................................... 10 3.6 声音提示模块 ................................................. 10 3.7 液晶显示电路设计 ............................................. 11 4 系统模块与程序设计 ................................................. 12

4.1 主程序模块 ................................................... 12 4.2 键盘扫描模块 ................................................. 13 4.3 修改密码模块 ................................................. 13 4.3 密码对比模块 ................................................. 14 5 系统安装与调试 ..................................................... 15

5.1 安装步骤 ..................................................... 15

5.1.1 检查原件的好坏 ......................................... 15 5.1.2 放置、焊接原件 ......................................... 15

III

5.1.2 焊接事项 ............................................... 15 5.2 调试 ......................................................... 16

5.2.1 软件调试 ............................................... 16 5.2.1 硬件调试 ............................................... 16

6 总 结 .............................................................. 17 参考文献 ............................................................. 18 附 录 ................................................................ 19

附录1:电子密码锁原理图 .......................................... 19 附录2:随机密码锁源代码 .......................................... 20 致 谢 ................................................................ 42

IV

1 前 言

1.1 研究背景和意义

作为保障消费者的权益,对自动存包柜消费升级的主要途径,自动存包柜在我们日常生活中扮演着日益重做的角色。目前,我国的自动存包柜行业还处于起步阶段,随着自动存包柜建设的推进,键释放出巨大的自动存包柜设备的需求。自动存包柜具有技术优势,替代老式存包柜的趋势较为明显。

过去的机械密码锁其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。针对这些锁具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。它的出现为人们的生活带来了很大的方便,有很广阔的市场前景。随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了真真的电子加密,用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码锁[11]。目前一些大超市的入口处,常有自动存包柜提供给顾客存取物品。并且根据用途和场合,其种类不断增多,例如数码锁,指纹锁,磁卡锁,IC卡锁,生物锁等。但较实用的还是按键式电子密码锁。

出于安全、方便等方面的需要许多电子密码锁已相继问世。但这类产品的特点是针对特定有效卡、指纹或声音有效,且不能实现远程控制,只能适用于保密要求高且供个人使用的箱、柜、房间等。由于数字、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子防盗锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子防盗锁,。组合使用信息也能够使电子防盗锁获得无穷扩展的可能,使产品多样化,组合使用电子信息是电子密码锁以后发展的趋势[9]。 1.2 自动存包柜设计内容

1

本设计的就是利用系统产生一组5位随机密码来控制柜门开关的自动存包柜系统。它是利用单片机STC89C51实现的,具有12个按键和LCD1602液晶显示屏显示5位随机密码。客户通过键盘输入随机密码可以进行存取包操作。此系统每组密码使用一次有效,有三次容错功能,并能够格局客户要求修改密码,密码输入三次错误后具有报警功能和密码锁定。整个系统稳定可靠,且有管理员密码,管理容易。柜门锁由电磁阀控制,当顾客需要存放包裹的时候,可以自行到存包柜前按下“确认键”取得密码,存包柜门会打开,如果顾客不需要这个密码时,可以按下“修改密码键”,然后输入自己确认的5位数为新密码。当关门后,顾客自能通过随机密码(若修改过自己密码的只能通过修改密码)来打开存包柜。如果顾客输入密码三次错误后,密码锁死并报警,直到管理员输入管理员密码才能解锁。

要求本系统由比较高的自动化程度,一般做到无人看守即可实现顾客自我存包,并且有光敏自动识别,白天不亮黑夜亮,这样可以节约用电,在现实中有着较高的实用功能。

2

2 总体设计

2.1 电子密码锁设计的要求

(1)基于STC89C52/51单片机,是整个电路的核心部分,其中震荡电路为输出工作的时序,复位电路使系统中的其他部件处于确定的初始状态。

(2)采用LCD1602液晶显示屏,显示光亮适中,背光采用的是光敏自动识别,白天不亮黑天亮,这样可以节约电能,随时都可以看的清楚屏幕。

(3)采用矩阵按键输入,键盘有16个按键,分别为0-9的数字键和存包键(随机产生密码)和去包键(确认密码)、删除键和修改密码键。

(4)当用户使用时能够自动分配一组5位数的密码,并开启锁;当存包柜锁上时输入密码则开启锁。

(5)用户取得密码后可以根据自己要求修改密码。 (6)密码输入错误3次,密码锁死并报警。 (7)断电保护,系统断电也可以保存密码。

(8) 用户忘记密码,可以使用管理员密码打开存包柜。 (9)存包柜能根据密码指示完成开锁,关闭动作。

2.2 设计方案的选定

2.2.1 采用数字电路控制

在电子存包柜电路的设计中,控制方法是核心技术。

用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过10秒(一般情况下,用户不会超过10秒,若用户觉得不便,还可以修改)电路将报警20秒,若电路连续报警三次,电路将锁定键盘2分钟,防止他人的非法操作[13]。采用数字电路设计的方案好处就是设计简单但控制的准确性和

3

灵活性差,故不采用。

2.2.2 采用以单片机为核心的控制器件

单片机总类繁多,选取时有必要一一比较,选取适合环境的单片机,获得最佳的性价比。选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持和服务等等因素[1]。基于以上因素本设计选用单片机STC89C51作为核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。当取得密码的用户需要开锁时,先按键盘的数字键0-9输入密码。密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误后密码锁定发出报警;当用户需要修改密码时,在取得密码时就要按下修改密码键,然后输入自己选择的5位数字确认为新密码,即修改密码成功。

可以看出采用以单片机为核心的控制灵活准确性好且保密性强还具有扩展功能,根据现实生活的需要此次设计采用此方案。

4

3 系统硬件电路设计

3.1 系统硬件电路

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

电源模块 单片机模块 显示模块 矩阵按键模块 报警模块 复位模块 开锁模块 晶振模块 光敏模块

图3-1 自动存包柜结构框图

3.2 单片机的最小系统电路

最小系统包括单片机及其所需的必要的电源、时钟、复位等部件,能使单片机始终处于正常的运行状态。电源、时钟等电路是使单片机能运行的必备条件,可以将最小系统作为应用系统的核心部分,通过对其进行存储器扩展、A/D扩展等,使单

5

片机完成较复杂的功能。如图3-2为最小系统电路图。

图3-2 最小系统电路图

3.2.1 复位电路

复位电路:最简单的复位电路就是在RST与VCC之间连接一个10UF电解电容,当通电时,RST维持一段很短的高电平状态,使单片机复位,很快电容充电满后,RST电平被拉低。单片机进入正常工作中。

一般应复位电路有手动或上电复位电路。复位电路的实现通常有两种方式:1)RC复位电路:RC复位电路的实质是一阶充放电电路。系统上电时该电路提供有效的复位信号RST(高电平)直至系统电源稳定后撤销复位信号(低电平);2)专用μP

6

监控电路:专用μP监控电路又称电源监视电路,具有上电时可靠产生复位信号和电源电压跌落到“门槛值”时可靠产生复位信号功能。前者实现简单,成本低,但复位可靠性相对较低;后者成本较高,但复位可靠性高,尤其是高可靠重复复位。对于复位要求高并对电源电压进行监视的场合,大多采用这种方式。

图3-2-1 复位模块图

3.2.2 时钟电路

时钟信号:单片机的XTAL2和XTAL1接晶振,这种结构通过晶振电容C1、C2与单片机内部结构组成一个时钟信号源,晶振的频率决定系统的时钟频率。STC89C51单片机的时钟信号通常有两种方式产生:一是内部时钟方式,二是外部时钟方式。内部时钟方式如图3-2-2所示。在STC89C51单片机内部有一振荡电路,只要在单片机的XTAL1(18)和XTAL2(19)引脚外接石英晶体(简称晶振),就构成了自激振荡器并在单片机内部产生时钟脉冲信号。图中电容C1和C2的作用是稳定频率和快速起振,电容值在5~30pF,典型值为30pF。晶振CYS的振荡频率范围在1.2~12MHz间选择,典型值为12MHz和6MHz。

7

图3-2-2 晶振模块图

3.3 矩阵键盘设计电路

每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要M条行线和N条列线,即可组成具有M×N个按键的键盘。由于本设计中要求使用16个按键输入,为减少键盘与单片机接口时所占用的I/O线的数目,故使用矩阵键盘。本设计中,矩阵键盘行线和单片机P1.4-P1.7相连,列线与单片机P1.0-P1.3相连而成的矩阵键盘设计电路图。

键盘扫描采用行扫描法,即依次置行线中的每一行为低电平,其余均为高电平,扫描列线电平状态,为低电平即表示该键按下。

由於这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,为了避免让单片机误判为多次输入同一按键,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。

8

图3-3 矩阵键盘设计电路

3.4 储存芯片电路设计

IC总线全称为芯片间总线,它在芯片间以两根连线实现全双工同步数据传送,一条数据线(SDA)和一条串行时钟线(SDL),可以很方便地构成外围器件扩展系统。本系统采用此芯片进行数据存储,存储系统连接如图3-4所示:

2

9

图3-4 存储芯片连接电路图

图中AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。第8脚和第4脚分别为正、负电源。第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,第6脚SCL为串行时钟输入线, SDA和SCL都需要和正电源间各接一个10 K的电阻上拉。第7脚需要接地。24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。

3.5 继电器驱动模块

电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。继电器一般有两股电路,为低压控制电路和高压工作电路。

图3-5 继电器驱动模块图

电路中继电器室通过PNP型三极管驱动,当阀值超过设定时,单片机会由高电平跳变成低电平,三极管导通继电器吸合,继电器起开关作用,可以驱动负载。

3.6 声音提示模块

10

蜂鸣器为发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声,本设计采用有源蜂鸣器。

图3-6 声音报警电路

三极管Q1起开关作用,其基极的低电平使三极管饱和导通,使蜂鸣器发声;而基极高电平则使三极管关闭,蜂鸣器停止发声。

3.7 液晶显示电路设计

液晶显示器(LCD)是一种功耗很低的显示器,它的使用非常广泛,比如电子表、计算器、数码相机、计算机的显示器和液晶电视等。电子密码锁中需要显示的信息比较多,为了能直观的看到结果,并且为了设计显的美观,使用总线和排阻进行简化连接方式,本设计采用液晶显示屏LCD进行显示,具体连接方式如图下所示。

11

3-7 液晶显示电路连接图

4 系统模块与程序设计

4.1 主程序模块

本系统软件设计由主程序、初始化程序、密码比较模块、键盘扫描程序、密码修改程序、LCD显示程序、EEPROM读写程序和延时程序等组成。主要程序设计流程图: 识别键盘 开始 系统初始化 N 输入密码 修改密码 N 密码修改成显示主界面 输入新密码 随机密码 再次输入新密码 开锁 Y 密码比较 Y N 重新输入 N 计算次数 Y 开锁 密码比较 Y 次数>N 报警 密码锁定结束 12

图4-1 主程序模块流程图 4.2 键盘扫描模块

键盘使用矩阵式键盘,由行和列组成,CPU对所有键盘进行监视,从而实现逐列扫描键盘确定被按键的具体位置、判断键盘上有无键按下、消除去抖动、判断闭合的键是否释放等功能。如下图所示,为键盘扫描流程图:

Y 建立有效标志 N 闭合键释放 Y 计算键值 建立无效标志 找到闭合键 扫描键盘 N 延时去抖动 按键闭合 Y 开始 N 还回

4-2 键盘扫描流程图

4.3 修改密码模块

13

取得密码情况下,可以选择“返回界面”和“修改密码”对密码进行重新设置,每设定一位就将密码送给AT24C02存储起来,当设置5位密码完毕后,系统将自动跳到程序开始,调用新设置的密码。下图为修改密码流程图。

N 修改密码 开始 Y

输入新密码 再次输入新密码

Y 密码比较 N 修改成功

还回 图4-3 修改密码流程图

4.3 密码对比模块 N 输入密码 N 计算次数 Y 开锁 密码比较 Y 开始 次数 >N 报警 密码锁定结束

14

图4-3 密码对比流程图

5 系统安装与调试

5.1 安装步骤

5.1.1 检查原件的好坏

按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测,一定要仔细认真。在检查好后才可上件、焊件,防止出现错误焊件后不便改正。

5.1.2 放置、焊接原件

按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。特别是容易损坏的元件要后焊,在焊集成芯片时连续焊接时间不要超过10s,注意芯片的安装方向。

5.1.2 焊接事项

准备焊接:清洁被焊元件处的积尘及油污,再将被焊元器件周围的元器件左右掰一掰,让电烙铁头可以触到被焊元器件的焊锡处,以免烙铁头伸向焊接处时烫坏其他元器件。焊接新的元器件时,应对元器件的引线镀锡。

加热焊接:将沾有少许焊锡和松香的电烙铁头接触被焊元器件约几秒钟。若是要拆下印刷板上的元器件,则待烙铁头加热后,用手或银子轻轻拉动元器件,看是否可以取下。

清理焊接面:若所焊部位焊锡过多,可将烙铁头上的焊锡甩掉,用光烙锡头\沾\些焊锡出来。若焊点焊锡过少、不圆滑时,可以用电烙铁头\蘸\些焊锡对焊点进行补焊。

检查焊点:看焊点是否圆润、光亮、牢固,是否有与周围元器件连焊的现象。

15

//1602的控制脚 sbit lcd1602_rs=P2^7; sbit lcd1602_rw=P2^6; sbit lcd1602_en=P2^5;

sbit ALAM = P2^1; sbit KEY = P3^6;

sbit open_led=P2^2;

bit operation=0; bit pass=0;

//操作标志位 //开锁指示灯(选配)

//报警

//开锁

//密码正确标志

//重置输入允许标志 //3秒按键标志位

bit ReInputEn=0;

bit s3_keydown=0;

unsigned char countt0,second; //t0中断计数器,秒计数器

void Delay5Ms(void);

unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; 描控制表

//液晶显示数据数组

unsigned char code start_line[]

= {\

//控盘扫

//声明延时函数

unsigned char code name[] = {\//显示名称 unsigned char code Correct[] = {\ 确

unsigned char code Error[] = {\

//输入错//输入正

21

unsigned char code codepass[] = {%unsigned char code LockOpen[] = {\ unsigned char code SetNew[]

= {\

//INPUT //OPEN

unsigned char code Input[] = {\ unsigned char code ResetOK[] = {%unsigned char code initword[] = {%unsigned char code Er_try[] unsigned char code again[]

= {\= {\

= {\

unsigned char code yourPassword[] unsigned char InputData[6]; 存区

//输入密码暂

unsigned char CurrentPassword[6]={1,3,1,4,2,0}; (只可在程序中修改)

unsigned char TempPassword[6]; unsigned char N=0;

//密码输入位数记数

//错误次数计数

//管理员密码

unsigned char ErrorCont; unsigned char t;

//正确输入计数

//重新输入计数

//输入管

unsigned char InPut_En;

unsigned char code initpassword[6]={0,0,0,0,0,0}; 理员密码后将密码初始为000000

//=====================5ms延时============================== void Delay5Ms(void) { }

unsigned int TempCyc = 5552; while(TempCyc--);

22

//===================400ms延时============================== void Delay400Ms(void) {

unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) {

TempCycB=7269; while(TempCycB--); } }

//==================================================================================================

//=======================================LCD1602====================================================

//==================================================================================================

#define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)

#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

//----------------延时函数,后面经常调用---------------------- void delay(uint xms)//延时函数,有参函数

23

{ }

//--------------------------写指令--------------------------- void write_1602com(uchar com)//****液晶写入指令函数**** { }

//-------------------------写数据----------------------------- void write_1602dat(uchar dat)//***液晶写入数据函数**** { }

lcd1602_rs=1;//数据/指令选择置为数据 lcd1602_rw=0; //读写选择置为写 P0=dat;//送入数据 delay(1);

lcd1602_en=1; //en置高电平,为制造下降沿做准备 delay(1);

lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令 lcd1602_rs=0;//数据/指令选择置为指令 lcd1602_rw=0; //读写选择置为写 P0=com;//送入数据 delay(1);

lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1);

lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令 uint x,y;

for(x=xms;x>0;x--) for(y=110;y>0;y--);

24

//-------------------------写数据----------------------------- void write_string(uchar dat,unsigned char *str)//***液晶写入数据函数****

{ if(dat)

write_1602com(dat); while(*str){

write_1602dat(*str); str++;} }

//-------------------------初始化------------------------- void lcd_init(void) {

write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,

8位数据

}

//========================================================================================

//=========================================================================================

write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示

25

//==============将按键值编码为数值========================= unsigned char coding(unsigned char m) { unsigned char k;

switch(m) { case (0x11): k=1;break; case (0x21): k=2;break; case (0x41): k=3;break; case (0x81): k='A';break; case (0x12): k=4;break; case (0x22): k=5;break; case (0x42): k=6;break; case (0x82): k='B';break; case (0x14): k=7;break; case (0x24): k=8;break; case (0x44): k=9;break; case (0x84): k='C';break; case (0x18): k='*';break; case (0x28): k=0;break; case (0x48): k='#';break; case (0x88): k='D';break;

}

return(k);

}

//=====================

26

===============================

unsigned char keynum(void) {

unsigned char row,col,i; P1=0xf0;

if((P1&0xf0)!=0xf0) {

Delay5Ms();

Delay5Ms();

{

row=P1^0xf0; //确定行线 i=0;

P1=a[i]; //精确定位 while(i<4) { }

if((P1&0xf0)!=0xf0) { } else { }

i++; P1=a[i];

col=~(P1&0xff); //确定列线

break; //已定位后提前退出

if((P1&0xf0)!=0xf0)

}

else

27

{ return 0;

}

while((P1&0xf0)!=0xf0);

return (row|col); //行线与列线组合后返回

}

else return 0;

//无键按下时返回0

}

//=======================一声提示音,表示有效========================

void OneAlam(void) { ALAM=0;

Delay5Ms();

ALAM=1; }

//========================二声提示音,表示操作========================

void TwoAlam(void) { ALAM=0;

Delay5Ms();

28

输入成功

ALAM=1; Delay5Ms();

ALAM=0; Delay5Ms();

ALAM=1; }

//================================================

void ThreeAlam(void) {

ALAM=0; Delay5Ms();

,

ALAM=1; Delay5Ms();

ALAM=0; Delay5Ms();

ALAM=1; Delay5Ms();

ALAM=0; Delay5Ms();

ALAM=1; }

//=====================显示输入的N个数字,用H代替以便隐藏============================

29

//=======================显示提示输入========================= void DisplayChar(void) {

unsigned char i; if(pass==1) { } else {

if(N==0) { } else {

//DisplayListChar(0,1,start_line); write_1602com(er); for(i=0;i<16;i++)

//DisplayListChar(0,1,Error); write_1602com(er); for(i=0;i<16;i++) { }

write_1602dat(Error[i]); //显示错误

//DisplayListChar(0,1,LockOpen); write_1602com(er); for(i=0;i<16;i++) { }

write_1602dat(LockOpen[i]); //显示open 开锁成功

//在二行开始显示

30

}

}

}

{ }

write_1602dat(start_line[i]);//显示开始输入

//=======================输入密码错误超过三过,报警并锁死键盘======================

void Alam_KeyUnable(void) { }

//=======================

P1=0x00; { }

ALAM=~ALAM; Delay5Ms();

//蜂鸣器一直闪烁鸣响

============================================

void Cancel(void) {

unsigned char i;

31

unsigned char j; if(InPut_En==1) {

InPut_En=0;

WrToROM(&InPut_En,6,1); for(i=0;i<5;i++) {

while(t--)

CurrentPassword[i]=rand(); }

WrToROM(CurrentPassword,0,5); write_1602com(yi); for(j=0;j<16;j++) { }

write_1602com(er); for(j=0;j<8;j++) { } { } { }

write_1602dat(' '); //显示您的密码 for(j=0;j<3;j++)

write_1602dat(CurrentPassword[j]+0x30);

//显示您的密码

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

write_1602dat(yourPassword[j]); //显示开机输入密码界面 write_1602dat(name[j]); //显示开机输入密码界面

32

write_1602com(0x0c);

KEY=0;

delay(2000); i=0; Keycan();

write_string(0x80,\write_string(0xc0,\

while(i!=0x84) {

i=Keycan(); if(i==0x88) gaimima(); }

write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示

for(i=0;i<16;i++) { }

write_1602com(er); for(j=0;j<16;j++) { }

for(i=0;i<6;i++) { }

InputData[i]=0;

//将输入密码清零

write_1602dat(Input[j]); //显示开机输入密码界面 write_1602dat(name[i]);//向液晶屏写开机画面

33

}

//==========================确认键,并通过相应标志位执行相应功能===============================

void Ensure(void) {

unsigned char i,j;

RdFromROM(CurrentPassword,0,5);

//从24C02里读出

N=0; KEY=1; }

//输入位数计数器清零

ErrorCont=0;

//密码错误输入次数清零

pass=0;

//密码正确标志清零

存储密码

if(N==5)

{ i=0;

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

{

if(CurrentPassword[j]==InputData[j]) //判断输入密码和

24c02中的密码是否相同

{ }

i++;

//相同一位 i就+1

34

}

if(i==5&&ErrorCont<3) //密码输入对时

{

画面

确标志位

清除

后将输入位清零

}

ErrorCont=0; InPut_En=1;

WrToROM(&InPut_En,6,1); write_1602com(er); for(j=0;j<16;j++) {

write_1602dat(LockOpen[j]);

}

TwoAlam(); //操作成功提示音 pass=1;

for(j=0;j<6;j++) {

InputData[i]=0;

} KEY=0; delay(1000); KEY=1;

35

显示open开锁

//置正

//将输入

//开锁

//

本文来源:https://www.bwwdw.com/article/8ib3.html

Top