毕业论文- 再度修改版

更新时间:2023-10-10 05:51: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

case ('#'): Ensure(); break; //

确认键,

default:

不是功能键按下时,就是数字键按下

{ //DisplayListChar(0,1,Input); if(pass==0) { if(N==0) {

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

write_1602dat(Input[i]);

输入画面

}

}

operation=0;

标志清零

if(N<5)

当输入的密码少于6位时,接受输入并保存,大于6位时则无效。

{

OneAlam();

提示音

//DisplayOneChar(6+N,1,'*'); for(j=0;j<=N;j++) {

write_1602com(er+6+j);

显示位数随输入增加而增加

41

//如果

//显示

//操作

//

//按键

//

write_1602dat('*'); 但不显示实际数字,用*代替

}

InputData[N]=NUM;

字键的码赋值给InputData[]数组暂存

N++;

位数加

}

else

数据位数大于6后,忽略输入

{

N=5;

输入大于6位时,不接受输入

break;

} }

}

}

}

} }

}

void timer0() interrupt 1 { t++; if(t>100)

t=0;

}

42

//

//将数

//密码

//输入

//密码

致 谢

四年的大学生活不知不觉中就要结束了,在这段难忘的生活中,有我许多美好的回忆。我的心中,有许多人是我要用一辈子去铭记的。. ]在这份大学的最后一页里,我要感谢的人很多,首先要感谢我的学校,感谢在这四年中交给我的做人道理,让我从一个懵懂得高中生变成一个成熟的青年。还要感谢我的论文指导老师李芳老师,在她的指导下我完成了论文,李芳多次询问研究进程,并为我指点迷津,帮助我开拓研究思路,精心点拨、热忱鼓励。李芳一丝不苟的作风,严谨求实的态度,踏踏实实的精神,不仅授我以文,而且教我做人,给以终生受益无穷之道。我从心里感谢她。还要感谢的是我们各课任课老师,他们从大一把我们迎进来,到现在把我们送走,在四年来一直照顾我们的学习和生活,所以在这里也一定要特别感谢他们。当然,还要感谢寝室的兄弟们在我完成论文的过程中给予我的帮助和鼓励,也是他们陪我度过这四年的生活最后要感谢的就是我的父母、朋友,对于他们我更是有千言万语,还是汇聚成一句话:感谢你们一直都伴随着我。

现在即将挥别我的学校、老师、同学,还有我四年的大学生活,虽然依依不舍,但是对未来的路,我充满了信心。最后,感谢在大学期间认识我和我认识的所有人,有你们伴随,才有我大学生活的丰富多彩,绚丽多姿!

43

5.2 调试

本系统的调试主要分为硬件调试、软件调试等两大部分。经过初步的分析设计后,在制作硬件电路的同时,调试也在穿插进行。这样有利于问题的分析和解决,不会造成问题的积累,而且不会因为一个小问题而进行整体电路的检查,从而可以节约大量的调试时间。软件编程中,首先完成单元功能模块的调试,然后进行系统调试,整体上与硬件调试的方法差不多。联机调试是最重要的一部分,同时也是本设计成功的关键。

5.2.1 软件调试

在硬件支持的环境下,用proteus设计好的电路,Keil编好的程序编译成芯片可识别的S51文件,利用PC机写进proteus程序图芯片内进行仿真测试,并对其出现的错误进行修改,如有错误或实现不了预想的功能,则需要对程序进行修改以达到设计的最终要求。

LCD无法显示,初始化程序出错:按初始化顺序时延时时间没有达到Datasheet的要求。因为延时时间还没达到内部初始化需求,上一步的初始化过程还没有结束就进行了下一步初始化过程,这样即跳过了上一步的初始化程序,这样必然导致系统初始化失败。

5.2.1 硬件调试

在电路的调试过程中,发现LCD1602能正常发光,而在有按键按下时,显示屏上却没有显示相应的信息,发光二极管也不能正常工作,后通过仔细检查电路,发现单片机的接地管脚忘记接线了,随即改正过来后,电路工作正常。

接通电源开门灯和报警电路就会工作,分析原因是单片机刚开始各个管脚输出高电平。

16

6 总 结

本设计采用单片机STC89C51低功耗CMOS型E2PROM AT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁、光敏原件等电路并用C语言的控制程序,研制了一款实用性较强的随机密码锁。相对于钥匙式密码锁、刷卡式和指纹类密码锁,电子密码锁简单安全,具有操作快,无需人员看守,随意更改密码,只需在0-9位数中输入5位既可以打开存包柜,减少多余的钥匙或者电子卡,也不会像指纹密码锁那样对手部保持干燥有一定的要求。总体来说电子密码锁是适用于超市、游泳、运动场、宾馆等公共场所。而本设计简单,易于开发,所用原件成本较比,使电子密码锁的价格大大减少,能实现功能较多,安全性较强,基本实现自动化和智能化。本设计还使用了12V的DK电磁锁,电源通电时不存在强行打开的情况,使存包柜的安全性大大提高。当然,本设计还存在提高的空间,无论是人脸识别监控还是手机信息安全提醒,都可以使存包柜安全性大大提高,但是这也会使成本增大,总体而言这些技术会使电子密码锁难以推广,因此才选择低成本的电源输入部分、键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成,根据实际情况键盘输入部分选择4*4矩阵键盘等。 总之,随着单片机的发展和广泛应用,我国正处于电子行业发展的上升期,各个领域的技术也不断更新,高科技产品将会更加智能化、自动化和小型化。电子密码锁替代老式钥匙锁是一个自然的趋势,我们需要是不断更新产品,混合式的产品不但应带来更多的功能,更应该简单化和智能化,让各个年龄阶段的人都能使用。

17

参考文献

[1]李全利.单片机原理及接口技术第二版[M].北京:高等教育出版社.2009.1.258-297.

[2]雷丽文,朱晓华,蔡征宇.微机原理与接口技术[M].北京:电子工业出版社.1996.8.56-58.

[3]马家辰.MCS-51单片机原理及接口技术[M].哈尔滨:哈尔滨工业大学出版社.1998.112-154.

[4]谢维成.单片机原理与应用及C51程序设计[M].北京:清华大学出版社.2006.169-181.

[5]马鸿文.基于AT89C51单片机的自动存取柜的设计与实现[J].微计算机信息.2006.(12Z).96-98.

[6]石文轩,宋薇,基于单片机MCS一51的智能密码锁设计[J].武汉工程职业技术学院学报.2004.16(4).31-35.

[7]卢敏生,卢恽.一个廉价的存包柜电脑控制装置[J].苏州大学工学院、苏州职业大学.1999(4).31-34.

[8]沈剑贤,黄世红.双子系统在电子存取柜中的应用[J].微计算机信息.2003.9.41-42.

[9]李明喜.新型电子密码锁的设计[J].机电产品开发与创新,2004.17(3).40-40. [10]赵雪峰.一种伪随机数生成算法的研究与实现[J].智能计算机与应用.2005(6).25-26.

[11]瞿贵荣.实用电子密码锁[J].家庭电子,2000(7).

[12]梁金千,张跃.在计算机上产生真随机数的探讨[D].计算机工程.2003.29(15).176-177.

[13]李少芬.在C/C++语言中如何自动生成随机密码[D].福建电脑.2003(5).43-43.

18

附 录

附录1:电子密码锁原理图

19

附录2:随机密码锁源代码

#include #include #include #include \#include \//宏定义

#define LCM_Data P0

20

//将P0口定义为LCM_Data

//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

else

if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputDat

a[3]==4)&&(InputData[4]==2))

{

初始密码写入24C02存储

初始化密码

示音

数计数器清零

}

else

WrToROM(initpassword,0,5);

//强制将

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

write_1602dat(initword[j]);

//显示

} TwoAlam();

//成功提

N=0;

//输入位

pass=1; ErrorCont=0; InPut_En=1;

WrToROM(&InPut_En,6,1); KEY=0; delay(1000); KEY=1;

//密码没有输入到6位时,按下确认键时

36

示音

{

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

write_1602dat(Error[j]); }

ErrorCont++; if(ErrorCont>=3) ErrorCont=3; if(ErrorCont==3) {

//显示错误

write_string(0x80,\ while(1) ALAM=0; }

ThreeAlam();

//错误提

}

pass=0; N=0;

}

else if(pass!=1&&N>0) 确认键时

{

write_1602com(er);

//密码没有输入到6位时,按下

37

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

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

}

ErrorCont++; if(ErrorCont>=3)

ErrorCont=3;

if(ErrorCont==3) {

write_string(0x80,\

while(1) ALAM=0; }

ThreeAlam();

pass=0;

N=0;

} N=0;

器清零,为下一次输入作准备

operation=1;

}

//==============================主

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

void main(void) {

38

//错误提示音 //将输入数据计数

unsigned char KEY,NUM;

unsigned char i,j;

//P1口复位

P1=0xFF;

TMOD=0x02; TH0 = 7; TL0= 7; EA=1; ET0=1; TR0=1;

Delay400Ms(); //启动等待,等LCM讲入工作状态

lcd_init(); //LCD初始化

write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示 for(i=0;i<16;i++) { }

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

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

write_1602com(0x0c);

Delay5Ms(); //延时片刻(可不要) N=0; 输入位数

RdFromROM(&InPut_En,6,1);

//初始化数据

39

pass=0; KEY=1;

//进入循环

while(1) {

KEY=keynum(); if(KEY!=0) {

//读按键的位置码 //当有按键按下时

NUM=coding(KEY); //根据按键的位置将其编码,编

码值赋值给NUM

{

switch(NUM) {

case ('A'): if(N>0)

{

--N;

write_1602com(0xc6+N); //指

//判断按键值

定第三行显示位置

write_1602dat(0x20);

break;

break;

//ABC

} ;

case ('B'): ;

case ('C'): ; break;

是无定义按键

置密码

case ('*'): OneAlam();Cancel();

break;

case ('D'): OneAlam();;

break; //重新设

//取消当前输入

40

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

Top