基于STC89C52单片机毕业设计(完整版) 附 原理图 pcb图 源程序

更新时间:2024-04-12 22:30:01 阅读量: 综合文库 文档下载

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

基于STC89C52单片机的电子密码锁

学生姓名: xx 学生学号: xxxxx

院(系): 电气信息工程学院 年级专业: 2010级电子信息工程2班 指导教师: 陶文英

二〇一三年六月

摘 要

随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事情屡见不鲜,电子密码锁具有安全性能高,成本低,功耗低,操作简单等优点使其作为防盗卫士的角色越来越重要。

从经济实用角度出发,采用51系列单片机,设计一款可更改密码,LCD1602显示,具有报警功能,该电子密码锁体积小,易于开发,成本较低,安全性高,能将其存储的现场历史数据及时上报给上位机系统,实现网络实时监控,方便管理人员及时分析和处理数据。其性能和安全性已大大超过了机械锁,特点有保密性好,编码量多,远远大于弹子锁,随机开锁成功率几乎为零;密码可变, 用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降;误码输入保护。当输入密码多次错误时,报警系统自动启动;电子密码锁操作简单易行,受到广大用户的亲睐。

关键词 单片机, 密码锁, 更改密码, LCD1602

目 录

摘要????????????????????????????????错误!未定义书签。

1 绪论

1.1电子密码锁简介?????????????????????????????1 1.2 电子密码锁的发展趋势?????????????????????????1

2 设计方案????????????????????????????????3 3 主要元器件???????????????????????????????4

3.1 主控芯片STC89C52???????????????????????????4 3.2 晶体振荡器??????????????????????????????8 3.3 LCD显示密码模块的设计????????????????????????9 3.3.1 LCD1602简介???????????????????????????9 3.3.2 LCD1602液晶显示模块与单片机连接电路???????????????11

4 硬件系统设计?????????????????????????????12

4.1 设计原理???????????????????????????????12 4.2 电源输入电路?????????????????????????????12 4.3 矩阵键盘???????????????????????????????13 4.4 复位电路???????????????????????????????14 4.5 晶振电路???????????????????????????????14 4.6 报警电路???????????????????????????????15 4.7 显示电路???????????????????????????????15 4.8 开锁电路???????????????????????????????16 4.9 电路总体构成?????????????????????????????16

5 软件程序设计?????????????????????????????18

5.1 主程序流程介绍????????????????????????????18 5.2 键盘模块流程图????????????????????????????19 5.3 显示模块流程图????????????????????????????21 5.4 修改密码流程图????????????????????????????22 5.5 开锁和报警模块流程图????????????????????????23

6 电子密码锁的系统调试及仿真?????????????????????25

6.1硬件电路调试及结果分析????????????????????????25 6.2软件调试及功能分析??????????????????????????25 6.2.1调试过程?????????????????????????????25 6.2.2 仿真结果分????????????????????????????26

6.3 仿真全图???????????????????????????????28

7 结论??????????????????????????????????29 参考文献?????????????????????????????????30 附录:???????????????????????????????????31

1 绪论

1.1电子密码锁简介

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁。其特点如下:

1) 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。 2) 密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因

人员的更替而使锁的密级下降。

3) 误码输入保护,当输入密码多次错误时,报警系统自动启动。 4) 无活动零件,不会磨损,寿命长。

5) 使用灵活性好,不像机械锁必须佩带钥匙才能开锁。 6) 电子密码锁操作简单易行,一学即会。

1.2 电子密码锁的发展趋势

日常生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。目前门锁主要用弹子锁,其钥匙容易丢失;保险箱主要用机械密码锁,其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。针对这些锁具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。由于电子器件所限,以前开发的电子密码锁,其种类不多,保密性差,最基本的就是只依靠最简单的模拟电子开关来实现的,制作简单但很不安全,在后为多是基于EDA来实现的,其电路结构复杂,电子元件繁多,也有使用早先的20引角的2051系列单片机来实现的,但密码简单,易破解。随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了真真的电子加密,

1

用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码锁。出于安全、方便等方面的需要许多电子密码锁已相继问世。但这类产品的特点是针对特定有效卡、指纹或声音有效,且不能实现远程控制,只能适用于保密要求高且供个人使用的箱、柜、房间等。由于数字、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子防盗锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子防盗锁,组合使用信息也能够使电子防盗锁获得无穷扩展的可能,使产品多样化,对用户而言是“千挑百选、自得其所”。可以看出组合使用电子信息是电子密码锁以后发展的趋势。

2

2 设计方案

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

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

3

3 主要元器件

3.1 主控芯片STC89C52

1)STC89C52单片机的主要特性如下:

Stc89c52是一种带8K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,stc的stc89c52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,stc89c52芯片引脚图如图3-1所示。

图3-1 stc89c52芯片引脚图

主要特性:

·与MCS-51 兼容

·8K字节可编程闪烁存储器

4

·寿命:1000写/擦循环 ·数据保留时间:10年 ·全静态工作:0Hz-24Hz ·三级程序存储器锁定 ·128*8位内部RAM ·32可编程I/O线 ·两个16位定时器/计数器 ·6个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路

2)STC89C52RC 引脚功能说明:

1、主电源引脚VSS和VSS STC89C52芯片引脚图 VSS——(40脚)接+5V电压; VSS——(20脚)接地。

2、外接晶体引脚XTAL1和XTAL2

XTAL1(19脚)接外部晶体的一个引脚。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。当采用外部振荡器时,对HMOS单片机,此引脚应接地;对SHMOS单片机,此引脚作为驱动端。

XTAL2(18脚)接外晶体的另一端。在单片机内部,接至上述振荡器的反相放大器的输出端。采用外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;对XHMOS,此引脚应悬浮。

3、控制或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP ①RST/VPD(9脚)当振荡器运行时,在此脚上出现两个机器周期的高电平将使单片机复位。推荐在此引脚与VSS引脚之间连接一个约8.2k的下拉电阻,与VSS引脚之间连接一个约10μF的电容,以保证可靠地复位。

VSS掉电期间,此引脚可接上备用电源,以保证内部RAM的数据不丢失。当VSS主电源下掉到低于规定的电平,而VPD在其规定的电压范围(5±0.5V)内,

5

VPD就向内部RAM提供备用电源。

②ALE/PROG(30脚):当访问外部存贮器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6。因此,它可用作对外输出的时钟,或用于定时目的。然而要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。ALE端可以驱动(吸收或输出电流)8个LS型的TTL输入电路。 对于EPROM单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲(PROG)。

③PSEN(29脚):此脚的输出是外部程序存储器的读选通信号。在从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN有效。但在此期间,每当访问外部数据存储器时,这两次有效的PSEN信号将不出现。PSEN同样可以驱动(吸收或输出)8个LS型的TTL输入。

④EA/VPP(引脚):当EA端保持高电平时,访问内部程序存储器,但在PS(程序计数器)值超过0FFFH(对851/8751/80S51)或1FFFH(对8052)时,将自动转向执行外部程序存储器内的程序。当EA保持低电平时,则只访问外部程序存储器,不管是否有内部程序存储器。对于常用的8031来说,无内部程序存储器,所以EA脚须常接地,这样才能只选择外部程序存储器。

对于EPROM型的单片机(如8751),在EPROM编程期间,此引脚也用于施加21V的编程电源(VPP)。

4.控制或与其它电源复用引脚 RST/Vpd,ALE/PROG,PSEN 和EA/Vpp。 RST/Vpd 当振荡器运行时。在此引脚上出现两个机器同期的高电平(由低到高跳变),将使单片机复位。

在 VSS掉电期间,此引脚可接上备用电源,由 Vpd向内部 RAM提供备用电源,以保持内部RAM中的数据。

ALE/PROG 正常操作时为ALE功能(允许地址钱存),提供把地址的低字节锁存到外部锁存器。ALE引脚以不变的频率(振荡周期的1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟,或用于定时目的。但要注意,每当访问外部数据存储器时,将跳过一个 ALE脉冲。 ALE端可以驱动(吸收或输出电流)八个 LSTTL电路。

6

对于 EPROM型单片机,在 EPROM编程期间,此引脚接收编程脉冲(PROG功能)。

PSEN 外部程序存储器读选通信号输出端。在从外部程序存储器取指令(或数据)期间;PSEN 在每个机器周期内两次有效。 PSEN 同样可以驱动八个LSTTL输入。

EA/Vpp EA为内部程序存储器和外部程序存储器选择端。当EA为高电平时,访问内部程序存储器(PS值小于4K)。当EA为低电平时,则访问外部程序存储器。对于EPROM型单片机,在EPROM编程期间,此引脚上加21VEPROM编程电源(Vpp)。

5、输入/输出(I/O)引脚P0、P1、P2、P3(共32根)

①P0口(39脚至32脚):是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个LS型的TTL负载。

②P1口(1脚至8脚):是准双向8位I/O口。由于这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。P1口能驱动(吸收或输出电流)4个LS型的TTL负载。对8052、8032,P1.0引脚的第二功能为T2定时/计数器的外部输入,P1.1引脚的第二功能为T2EX捕捉、重装触发,即T2外部控制端。对EPROM编程和程序验证时,它接收低8位地址。

③P2口(21脚至28脚):是准双向8位I/O口。在访问外部存储器时,它可以作为扩展电路高8位地址总线送出高8位地址。在对EPROM编程和程序验证期间,它接收高8位地址。P2可以驱动(吸收或输出电流)4个LS型的TTL负载。

④P3口(10脚至17脚):是准双向8位I/O口,在MSS-51中,这8个引脚还用于专门功能,是复用双功能口。P3能驱动(吸收或输出电流)4个LS型的TTL负载。

作为第一功能使用时,就作为普通I/O口用,功能和操作方法与P1口相同。作为第二功能使用时,各引脚的定义如表所示。

值得强调的是,P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。如表3-1。

7

表3-1 P3口管脚备选功能 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7

RXD(串行输入口) TXD(串行输出口) /INT0(外部中断0) /INT1(外部中断1) T0(记时器0外部输入) T1(记时器1外部输入) /WR(外部数据存储器写选通) /RD(外部数据存储器读选通) 3.2 晶体振荡器

晶体振荡器,简称晶振,其作用在于产生原始的时钟频率,这个频率经过频率发生器的放大或缩小后就成了电脑中各种不同的总线频率。以声卡为例,要实现对模拟信号44.1kHz或48kHz的采样,频率发生器就必须提供一个44.1kHz或48kHz的时钟频率。如果需要对这两种音频同时支持的话,声卡就需要有两颗晶振。但是现在的娱乐级声卡为了降低成本,通常都采用SCR将输出的采样频率固定在48kHz,但是SRC会对音质带来损害,而且现在的娱乐级声卡都没有很好地解决这个问题。现在应用最广泛的是石英晶体振荡器。

石英晶体振荡器是一种高精度和高稳定度的振荡器,石英晶体振荡器也称石英晶体谐振器,它用来稳定频率和选择频率,是一种可以取代LC谐振回路的晶体谐振元件。石英晶体振荡器广泛地应用在电视机、影碟机、录像机、无线通讯设备、电子钟表、单片机、数字仪器仪表等电子设备中。为数据处理设备产生时钟信号和为特定系统提供基准信号。在单片机中为其提供时钟频率。

石英晶体振荡器是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器,简称为石英晶体或晶体、晶振。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的。只要在晶体振子板极上施加交变电压,就会使晶片产生机械变形振动,此现象即所谓逆压电效应。当外加电压频率等于晶体谐振

8

器的固有频率时,就会发生压电谐振,从而导致机械变形的振幅突然增大。

时钟信号用来提供单片机片内的各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。外接晶体以及电容C2和C3构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值为30pF左右,晶振频率选11.0592MHz

3.3 LCD显示密码模块的设计

显示模块主要由LCD1602显示屏组成,他显示的是键盘输入的密码,以及密码正确与错误的提示。当输入密码时,出于安全性的考虑,显示的密码是有*号代替,为暗密。当输入六位密码后按下确认键,系统会与存于ROM的密码对比, 若密码错误,显示屏会显示Error,若密码正确,显示屏会显示Right。

3.3.1 LCD1602简介 1) 1602功能介绍

1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 2) 1602LCD 采用标准的 14脚(无背光)或 16脚(带背光)接口,各引脚接口说明如下表3-2所示:

表3-2 引脚功能说明

编号 1

符号 VSS 引脚说明 电源地 9

编号 9 符号 D2 引脚说明 数据

2 3 4 5 6 7 8 VDD VL RS R/W E D0 D1 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 10 11 12 13 14 15 16 D3 D4 D5 D6 D7 BLA BLK 数据 数据 数据 数据 数据 背光源正极 背光源负极 其引脚图如下图3-2所示:

图3-2 LCD1602引脚图

3) LCD寄存器的选择

表3-3 LCD寄存器的选择

RS 0 1 0 1 1 E 1 1 1 1 0 R/W 1 1 1 1 X 功能说明 写入命令寄存器 写入数据寄存器 读取忙碌标志及RAM地址 读取RAM数据 不动作 10

3.3.2 LCD1602液晶显示模块与单片机连接电路

图3-3 LCD1602液晶显示模块与单片机连接电路

11

4 硬件系统设计

4.1 设计原理

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

本系统共有两部分构成,即硬件部分与软件部分。其中硬件部分由电源输入部分、键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成,软件部分对应的由主程序、初始化程序、LCD显示程序、键盘扫描程序、启动程序、关闭程序、建功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。

复位电路 振荡电路 键盘电路 STC89C52 单片机 显示电路 开锁电路 报警电路

图4-1 组成原理

4.2 电源输入电路

三端集成稳压器LM7805和LM7905是作为固定输出电压的典型应用。正常

12

工作时,输入、输出电压差为2--3V。电容C为输入稳定电容,其作用是减小纹波,消振、抑制高频和脉冲干扰,它一般为0.1--1uF。电容C为输出稳定电容,其作用是改善负载的瞬态响应,它一般为1uF。使用三端稳压器时要根据输出电流的大小选择加散热器,否则会由于过热而无法工作到额定电流。

图4-2 电源输入电路

4.3 矩阵键盘

由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩

阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,比如清空显示功能等。键盘的每个按键功能在程序设计中设置 。其大体功能(看键盘按键上的标记)及与单片机引脚接法。

图4-3 矩阵键盘

13

4.4 复位电路

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。地址锁存信号ALE也为高电平。根据实际情况选择如图2-8所示的复位电路。该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C1上的电压很小,复位下拉电阻上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。增加手动复位按键是为了避免死机时无法可靠复位。当复位按键按下后电容C1通过R5放电。当电容C1放电结束后,RST端的电位由R11与R15分压比决定。由于R11<

图4-4 复位电路

4.5 晶振电路

STC89C52引脚XTAL1和XTAL2与晶体振荡器及电容C2、C1按下图所示方式连接。晶振、电容C2/C3及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C2、C3取值范围在30pF左右。根据实际情况,本设计中采用11.0592MHZ做系统的外部晶振。电容取值为33pF。

14

图4-5 晶振电路

4.6 报警电路

报警部分由陶瓷压电发声装置及外围电路组成,加电后不发声,当有键按下

时,“叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的P3.3引脚为低电平,三极管T3导喇叭发出噪鸣声报警。

图4-6 报警电路

4.7 显示电路

LCD1602液晶显示屏显示。

图4-7 显示电路

15

4.8 开锁电路

通过单片机开锁执行机构,发光二极管D1发光以替代达到开锁的目的。

图4-8 开锁电路

开锁原理:

单片机 微控制器 返N 密码正Y P1.0低电平 图4-9 开锁原理

LED

4.9 电路总体构成

在确定了选用什么型号的单片机后,就要确定在外围电路,其外围电路包括电源输入部分、键盘输入部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成,根据实际情况键盘输入部分选择4*4矩阵键盘,显示部分选择LCD1602液晶显示屏来完成。本次设计的各大模块在上述章节中已仔细介绍了,将各大模块融合在一起后组成电子密码锁硬件电路,键盘输入模块和LCD1602液

晶显示屏显示模块是最主要的两大模块,键盘主要是完成密码的输入、修改密码、

消除密码等等任务。而显示模块则是主要完成输入密码的显示以及密码输入正确或者错误的提示。而剩余的就是报警模块、开锁模块以及单片机的最小系统。开锁顾名思义就是密码输入正确后打开大门,而报警主要是为安全着想,当有人非法入侵时便于抓住犯人。单片机最小系统则是单片机正常运行的保障。总的硬件电路如图4-10。

16

图4-10 总电路图

17

5 软件程序设计

电子密码锁的软件设计是整个电子密码锁可靠安全运行的关键,密码锁软件程序分为主程序、延时程序、LCD1602液晶显示屏显示程序、修改密码程序、扫描键盘输入程序、报警程序。密码通过矩阵键盘输入,并且在LCD1602液晶显示屏上显示,如果输入密码正确,则可以直接开锁。如果不正确,并且3次以上输入不正确,则启动报警系统,触发蜂鸣器发声。如果要修改密码,则需要在输入基础密码判别正确后,输入修改后的密码,通过系统确认后方可修改密码。为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。而本次设计分为四大模块,分别是键盘输入模块、LCD1602液晶显示屏显示模块、开锁和报警模块以及修改密码模块,通过主程序来实现控制。

5.1主程序流程介绍

主程序主要内容是各程序模块的调用,并利用各模块进行电子密码锁功能的实现,即是键盘输入密码并在LCD1602液晶显示屏显示密码,当密码输入完成后,单片机会将输入进的密码与原单片机内部所储存的密码进行对比,如若密码正确,则代表电磁吸合器的发光二极管会发光,同时LCD1602液晶显示屏会显示出正确的密码;如若密码错误,会启动计数器计数,当错误次数超过三次时,报警系统会启动即是蜂鸣器会发出报警声,以提醒保安。流程图如图5-1所示。

18

开始 初始化 输入密码 N N 密码正确? Y Y 开锁? N 修改密码N 返回

图5-1 主程序流程

Y 修改程序 开锁程序 次数加1 次数>3? Y 报警程序

5.2 键盘模块流程图

键盘输入模块主要包含键盘的扫描、延时去抖、找到键值以及返回键值。键盘扫描时循环的,程序编写是会使其进入是循环,这样可以检验出是否有按键按下,如果无按键按下就会进入等待有按键按下的状态,如果有按键按下的话就进入延时去抖的步骤,这样可以肯定的确定扫描到的按键是否被按下。经过去抖之后就是确定按键的位置即是第几行和第几列,找到按键后,就是确定键值并返回按键值,每一次扫描到有键按下后,最后都要有释放闭合按键的步骤,这是为了避免影响下一次键盘的扫描和按键值的读取。流程图如图5-2所示

19

键盘扫描 N 有键闭合? 延时去抖 找到闭合键 计算键值 闭合键释放 返回键值

图5-2 键盘模块流程

Y

按键的消抖子程序所示:

if(press_on!=0XF0)//--按键消抖---(时间自定)

{

delay(50); press_on=KEY_IO;

}

确定键值的子程序如下所示: switch(row) { case 0xe0:row=0;break; case 0xd0:row=1;break; case 0xb0:row=2;break; case 0x70:row=3;break; }

switch(col) { case 0x07:col=0;break; case 0x0b:col=1;break; case 0x0d:col=2;break; case 0x0e:col=3;break; } recieve=key_value[row][col]; }

20

5.3显示模块流程图

LCD显示模块的软件设计主要包含开始、初始化LCD、清除LCD、写LCD四个过程。其中写包含写数据和写字符。

写数据的部分程序:

//写数 (5位数据)

void printf_data(uchar row,uchar col,uchar count,uint dat) {

uchar sh1,sh2,sh3,sh4,sh5; sh5=dat/10000;

sh4=dat000/1000; sh3=dat00/100; sh2=dat0/10; sh1=dat; write_adr(0x0c); switch(row) {

case 1:row=0x80;break; case 2:row=0xc0;break; default:break; }

write_adr(row+col-1); delay(500); if(count>=5)

write_data(sh5+48); if(count>=4)

write_data(sh4+48); if(count>=3)

write_data(sh3+48); if(count>=2)

write_data(sh2+48); if(count>=1)

write_data(sh1+48);

写字符的小程序为: //写一段字符

void printf_char(uchar row,uchar col,uchar Inbuffer[31]) {

uchar i;

write_adr(0x0c); switch(row) {

21

case 1:row=0x80;break; }

流程图5-3如下:

开始 初始化LCD 清除LCD 写LCD 结束

图5-3 显示模块流程图

5.4修改密码流程图

修改密码模块主要是在输入密码正确之后,按下14键即是修改密码键就能进入修改密码界面,其流程分为四个步骤,分别为按下14键并启动定时、输入修改的密码、按下确认键11键、LCD的显示。修改密码的部分程序如下: //改密码

void ch_word(void) {

unsigned char recieve=0xff,b[10],j=0; LCD_CLR();

printf_char(1,1,\ while(recieve!=11) { recieve=keypad(); delay(10000); if(recieve<=9&&recieve>=0) { b[j]=recieve; printf_data(2,j+1,1,recieve); j++; } else if(recieve==12) {

22

} if(j!=0) { a[j]='\\0'; printf_char(2,j,\ j--; }

流程图如图5-4所示:

按下14键 启动定时 输入密码 存入缓冲 按下确认 比较密码 调用LED 调用显示 图5-4 修改密码流程图

5.5开锁和报警模块流程图

开锁和报警模块主要任务是把从键盘输入到单片机的密码和本身保存在单片机中的密码进行对比,如果正确就开锁,如果错误的话就进行计数并显示在LCD液晶显示屏上,当输入密码的错误次数达到3次就进入报警模式,启动蜂鸣器报警。其流程图如图5-5所示。

23

图5-5 报警流程图

24

6 电子密码锁的系统调试及仿真

6.1硬件电路调试及结果分析

硬件调试首先检查电路板焊接是否有误,检查有是否出现虚焊、漏焊、线路短接、元器件引脚是否错误焊接等等问题,然后检查电路中某些元器件是否起作用,最后利用一些小程序测试LCD1602是否完好无损。

检测单片机是否工作可通过观察示波器显示的波形是否衰减,或者利用万用表测一下18,19脚的电压,应该有个2-3V就说明起振了,另外,ALE如果有信号或者有电压也说明单片机工作了。我采用利用万用表侧18、19脚的电压,其结果显示为2.3V。

检测电路有无虚焊可用万用表的二极管档来检测,当把万用表的红黑两表笔接触在焊接线路的两端后,万用表发出声音,则说明没有虚焊。检查电路是否短路也是利用同一原理。

6.2软件调试及功能分析

软件调试即是把已经写好的C语言程序载入到软件调试工具,检查软件是否有设法错误,再根据软件提示对本程序进行修改,直到没有错误再生成单片机能运行的机器码,再用51开发板或其它单片机写入工具把机器码写入单片机进行实际的程序调试,根据实际情况再对程序的不足加以修改,直到满足设计要求。本设计采用Proteus和KEIL软件进行仿真、调试,首先在在Proteus软件上进行硬件电路的描绘,其次在KEIL软件编写电子密码锁的源程序,源程序经过汇编后产生Hex文件,最后将生成的目标文件添加到单片机中仿真调试。

6.2.1调试过程

首先打开KEIL C51主程序,新建工程,新建文本框写入程序,保存,检查是否有语法错误,经反复检查无误后汇编,生成51单片机可执行的HEX文件。然后用与51开发板相匹配的写入软件把HEX文件写入单片机。

25

图6-1 KEIL c51调试介面

图6-2 程序写入界面

6.2.2仿真结果分析

当系统通电进入初始化状态后,LCD显示屏会显示Welcome,结果如图6-3所示。

26

图6-3 系统初始化

当进入输入密码阶段时,依次按下按键上的数字键1,2,3,4,5,6后,LCD显示屏显示如图6-4所示。

图6-4 输入密码阶段仿真图

当按下确定键11键后,显示屏上显示正确且二极管灯亮,表示密码正确开门,如图6-5所示。

图6-5 输入密码正确时仿真图

按下确认键后,二极管不亮且显示屏上显示Error,表示密码输入错误,门的锁不会打开。如图6-6所示。

图6-6 输入密码错误仿真图

当需要修改密码时,只需按下14键即可进入到修改密码界面,修改成功后显示success,修改错误后显示屏会显示fail。

27

图6-7 修改密码仿真图

图6-8 修改失败仿真图

6.3 仿真全图

图6-9 仿真全图

28

7 结论

本次设计通过硬件电路设计、软件编程、硬件调试、软件调试以及系统调试完成了设计要求,达到了设计目的。本次设计最终的结果如下:

? 电子密码锁通过键盘能成功进行输入密码; ? LCD液晶显示屏上能显示输入的密码;

? 能判断输入的密码是否正确并且能显示判断结果; ? 能在密码输入正确后开门;

? 能在密码输入错误次数达到三次以上后进行报警; ? 能在开门后通过一按键对原有密码进行更改;

? 能用*代替显示输入的密码数字,隐藏了密码,这实现了密码保护。 但是在实现上述功能时,也存在许多不足。第一,在密码输入正确时除了要使代表电磁吸合器的发光二极管发光以外,还应该加上语音模块,提示门开,这样更人性化一些。第二,密码输入错误次数小于三次时,也应该采取措施提醒。第三,密码修改部分,本次设计实现的不是很好,密码能进行修改但是只能修改第一个密码。第四,本次设计的电子密码锁,安全方面还可以提高进步。本设计中的报警系统只是一个简单的系统,要应用于实际生活还需要进一步改进。

电子锁是信息化时代发展的产物,应时而生,我相信随着科技的不断发展,将来的电子锁一定更加完美,更加人性化,更加便宜,更加安全。本次设计中还有待完善的地方还很多。首先,修改密码可进一步完善,实现有不管多少户住户和多少个密码,都能修改密码。其次,也是最重要的安全防问题,报警途径很多,有视屏监视和发出报警声提醒值班的保安等等。未来,电子密码锁需要大面积占据市场首先必须要突破的就是安全问题,如果解决了这个问题,电子密码锁就能在锁的行业所向披靡。最后本次设计还可以精进的地方就是输入密码错误时的处理方法。在输入密码错误次数在三次以内时,也应该采取措施。比如禁止输入三秒或者也用发声模块提醒,只要发声频率不一致就可区分。

29

参 考 文 献

[1] 余永权,汪明慧,黄英.单片机在控制系统中的应用[M].北京:电子工业出版社,2009

[2] 周润景,张丽敏,王伟.Altium Designer原理图与PCB设计[M].北京:电子工业出版社,2009

[3] 蒋同泽.现代移动通信系统[M].北京:电子工业出版社,1998 [4] 张毅刚.单片机原理及应用[M],北京:高等教育出版社,2003

[5] 张云.基于GSM的短消息业务协议分析[J].北京:电子工业出版社,2001 [6] 刘法治.常用电子元器件及典型芯片应用技术[M],北京:机械工业出版社,2007

[7] 张迎.单片微型计算机原理、应用及接口技术[M].国防工业出版社.2007.1 [8] 石东海.单片机数据通信技术从入门到精通[M].西安电子科技大学出版社.2007.2

30

附录:

PCB布局:

31

/******************************************************************************** 功能键 S6---S15 数字键0-9 S16---更改密码 S17---更改密码完毕后确认 S18---重试密码、重新设定 S19---关闭密码锁 初始密码:000000 密码位数:6位 注意:掉电后,所设密码会丢失,重新上点时,密码恢复为原始的000000 与P1相连的8位发光LED点亮代表锁被打开;熄灭代表锁被锁上

程序功能: 1、开锁: 下载程序后,直接按六次S7(即代表数字1),8位LED亮,锁被打开,输入密码时, 六位数码管依次显示小横杠。 2、更改密码: 只有当开锁(LED亮)后,该功能方可使用。 首先按下更改密码键S16,然后设置相应密码,此时六位数码管会显示设置密码对应 的数字。最后设置完六位后,按下S17确认密码更改,此后新密码即生效。 3、重试密码: 当输入密码时,密码输错后按下键S18,可重新输入六位密码。 当设置密码时,设置中途想更改密码,也可按下此键重新设置。 4、关闭密码锁: 按下S19即可将打开的密码锁关闭。

推荐初级演示步骤:输入原始密码000000---按下更改密码按键S16---按0到9设置密码---按S17 确认密码更改---按S18关闭密码锁---输入新的密码打开密码锁

*******************************************************************************/

#include

#define uchar unsigned char #define uint unsigned int

uchar old1,old2,old3,old4,old5,old6; //原始密码000000

uchar new1,new2,new3,new4,new5,new6; //每次MCU采集到的密码输入 uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入数码管显示的变量 uchar wei,key,temp;

bit allow,genggai,ok,wanbi,retry,close; //各个状态位

sbit dula=P2^6; sbit wela=P2^7;

32

sbit beep=P2^3;

unsigned char code table[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

void delay(unsigned char i) { uchar j,k; for(j=i;j>0;j--)

for(k=125;k>0;k--); }

void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f) {

dula=0; P0=table[a]; dula=1; dula=0;

wela=0; P0=0xfe; wela=1; wela=0; delay(5);

P0=table[b]; dula=1; dula=0;

P0=0xfd; wela=1; wela=0; delay(5);

P0=table[c]; dula=1; dula=0;

P0=0xfb; wela=1; wela=0; delay(5);

33

P0=table[d]; dula=1; dula=0;

P0=0xf7; wela=1; wela=0; delay(5);

P0=table[e]; dula=1; dula=0;

P0=0xef; wela=1; wela=0; delay(5);

P0=table[f]; dula=1; dula=0;

P0=0xdf; wela=1; wela=0; delay(5); }

void keyscan() { {

P3=0xfe; temp=P3;

temp=temp&0xf0; if(temp!=0xf0) {

delay(10); if(temp!=0xf0) {

temp=P3; switch(temp) {

case 0xee:

3

4

key=0; wei++; break;

case 0xde: key=1; wei++; break;

case 0xbe: key=2; wei++; break;

case 0x7e: key=3; wei++; break; }

while(temp!=0xf0) {

temp=P3;

temp=temp&0xf0; beep=0; }

beep=1; } }

P3=0xfd; temp=P3;

temp=temp&0xf0; if(temp!=0xf0) {

delay(10); if(temp!=0xf0) {

temp=P3; switch(temp) {

case 0xed: key=4; wei++; break;

3

5

case 0xdd: key=5; wei++; break;

case 0xbd: key=6; wei++; break;

case 0x7d: key=7; wei++; break; }

while(temp!=0xf0) {

temp=P3;

temp=temp&0xf0; beep=0; }

beep=1; } }

P3=0xfb; temp=P3;

temp=temp&0xf0; if(temp!=0xf0) {

delay(10); if(temp!=0xf0) {

temp=P3; switch(temp) {

case 0xeb: key=8; wei++; break;

case 0xdb: key=9; wei++; break;

3

6

case 0xbb:

genggai=1; wei=0; break;

case 0x7b: if(allow) ok=1; break; }

while(temp!=0xf0) {

temp=P3;

temp=temp&0xf0; beep=0; }

beep=1; } } P3=0xf7; temp=P3;

temp=temp&0xf0; if(temp!=0xf0) {

delay(10); if(temp!=0xf0) {

temp=P3; switch(temp) {

case 0xe7: retry=1; break;

case 0xd7: close=1; break; }

while(temp!=0xf0) {

temp=P3;

temp=temp&0xf0; beep=0;

3

7

}

beep=1; } } } }

void shumima() //对按键采集来的数据进行分配 { if(!wanbi) { switch(wei) { case 1:new1=key; if(!allow) a=17; else a=key; break; case 2:new2=key; if(a==17) b=17; else b=key; break; case 3:new3=key; if(a==17) c=17; else c=key; break; case 4:new4=key; if(a==17) d=17; else d=key; break; case 5:new5=key; if(a==17) e=17; else e=key; break; case 6:new6=key; if(a==17) f=17; else f=key; wanbi=1; break; } } }

void yanzheng() //验证密码是否正确 { if(wanbi) //只有当六位密码均输入完毕后方进行验证 { if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6)) allow=1; //当输入的密码正确,会得到allowe置一 }

38

}

void main() { while(1) { keyscan(); shumima(); yanzheng(); if(allow) //验证完后,若allow为1,则开锁 { P1=0x00; if(!genggai) wanbi=0; } if(genggai) //当S16更改密码键被按下,genggai会被置一 { if(allow) //若已经把锁打开,才有更改密码的权限 { while(!wanbi) //当新的六位密码没有设定完,则一直在这里循环 { keyscan(); shumima(); if(retry|close) //而当探测到重试键S18或者关闭密码锁键S19被按下时,则跳出 { wanbi=1; break; } display(a,b,c,d,e,f); } } } if(ok) //更改密码时,当所有六位新密码均被按下时,可以按下此键,结束密码更改 { //其他时间按下此键无效 ok=0; wei=0; genggai=0; old1=new1;old2=new2;old3=new3; //此时,旧的密码将被代替 old4=new4;old5=new5;old6=new6; a=16;b=16;c=16;d=16;e=16;f=16; } if(retry) //当重试按键S18被按下,retry会被置位 { retry=0; wei=0;wanbi=0;

39

}

}

a=16;b=16;c=16;d=16;e=16;f=16;

new1=0;new2=0;new3=0;new4=0;new5=0;new6=0; }

if(close) //当关闭密码锁按键被按下,close会被置位 { close=0;genggai=0;//所有变量均被清零。 wei=0; wanbi=0; allow=0; P1=0xff; a=16;b=16;c=16;d=16;e=16;f=16; new1=0;new2=0;new3=0;new4=0;new5=0;new6=0; }

display(a,b,c,d,e,f); //实时显示

40

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

Top