为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于STC89C52单片机的电子密码锁(完整版) 附 仿真图 原理图

2017-09-19 32页 doc 902KB 63阅读

用户头像

is_954223

暂无简介

举报
基于STC89C52单片机的电子密码锁(完整版) 附 仿真图 原理图目录 1绪论    1 1.1本设计的研究背景与研究目的    1 1.2国内外研究现状    2 2电子密码锁的总体设计方案    3 2.1方案论证    3 2.1.1方案一采用单片机控制方案    3 2.1.2方案二采用数字电路控制方案    4 2.1.3方案三采用EDA控制方案    5 2.2方案比较以及可行性    5 3电子密码锁硬件电路的设计    6 3.1中央控制模块的设计    6 3.1.1主控芯片STC89C52单片机的简介    6 3.1.2时钟电路的设计    7 3.1.3复位电路的设计...
基于STC89C52单片机的电子密码锁(完整版) 附 仿真图 原理图
1绪论    1 1.1本的研究背景与研究目的    1 1.2国内外研究现状    2 2电子密码锁的总体设计方案    3 2.1方案论证    3 2.1.1方案一采用单片机控制方案    3 2.1.2方案二采用数字电路控制方案    4 2.1.3方案三采用EDA控制方案    5 2.2方案比较以及可行性    5 3电子密码锁硬件电路的设计    6 3.1中央控制模块的设计    6 3.1.1主控芯片STC89C52单片机的简介    6 3.1.2时钟电路的设计    7 3.1.3复位电路的设计    8 3.2键盘输入模块的设计    9 3.2.1矩阵键盘工作原理    9 3.2.2单片机键盘扫描法    10 3.3LCD显示密码模块的设计    10 3.3.1LCD1602简介    11 3.3.2LCD1602液晶显示模块与单片机连接电路    12 3.4开锁模块的设计    13 3.5报警模块的设计    13 3.6硬件电路总体设计    14 4电子密码锁的软件设计    15 4.1主程序介绍    15 4.2键盘模块流程图    16 4.3显示模块流程图    18 4.4修改密码流程图    19 4.5开锁和报警模块流程图    20 5电子密码锁的系统调试及分析    22 5.1硬件电路调试及结果分析    22 5.2软件调试及功能分析    22 5.2.1调试过程    22 5.2.2仿真结果分析    24 5.3系统调试    26 6结论及展望    28 6.1结论    28 6.2展望    28 谢辞    29 参考文献    30 附录    32 附1部分代码    32 附2总电路图    40 1绪论 1.1本设计的研究背景与研究目的 随着人们生活水平的提高和社会科技的进步,锁已发展到了密码锁、磁性锁、电子锁、激光锁、声控锁等等。在传统钥匙的基础上,加了一组或多组密码,不同声音,不同磁场,不同声波,不同光束光波,不同图像。(如指纹、眼底视网膜等)来控制锁的开启。从而大大提高了锁的安全性,使不法之徒无从下手,人们也就能对自身财产安全有了更多的保障。因此电子密码防盗锁作为防盗卫士的作用日趋重要,而如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,而电子密码防盗锁用密码代替钥匙,不但省去了佩戴钥匙的烦恼,也从根本上解决了普通门锁保密性差的缺点。当今安全信息系统应用越来越广泛,特别在保护机密、维护隐私和财产保护方面起到重大作用,而基于电子密码锁的安全系统是其中的组成部分,因此研究它具有重大的现实意义。 单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲,一块芯片就成了一台计算机。随着电子技术和计算机技术的飞速发展,单片机性能不断完善,性价比显著提高,技术日趋完善。由于单片机具有体积小、重量轻、价格便宜、功耗低、控制功能强及运算速度快等特点,因而在国民经济建设、军事及家用电器等各个领域均得到了广泛的应用。它主要是作为控制部分的核心部件。它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别。单片机由运算器、控制器、存储器、输入输出设备构成。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。本设计利用单片机及附加器件实现数据传送和控制算法,来完成某一实际功能,检验并提高同学对整体电路设计和把握能力,了解单片机系统设计流程,以及电路板的实际制作和调试能力。同时也加强对数字电路、单片机和微机原理等课程知识的实际应用能力,也为同类产品的进一步发展奠定理论和实践基础。 1.2国内外研究现状 随着人们对安全的重视和科技的发展,许多电子智能锁已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识别器,若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。电子锁,由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的欢迎。 鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。目前,在西方发达国家,电子密码锁的技术相对先进,种类齐全,电子密码锁已被广泛应用于智能门禁系统中,通过多种更加安全,更加可靠的技术实现大门的管理。在我国电子锁整体水平尚处于国际上70年代左右,电子密码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供应市场。但国内自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,发展前景非常可观。 2电子密码锁的总体设计方案 2.1方案论证 2.1.1方案一采用单片机控制方案 选用单片机STC89C52 作为本设计的核心元件,利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接LCD显示器用于显示作用。框图如下图2.1所示。 显示电路 图2.1  系统框图 1)中央控制部分 采用 STCT89C52 单片机,该型单片机有 8KB 的 ROM, 512B 的 RAM,5个中断源, 3个16 位定时器/计数器。 2)显示部分 采用1602LCD显示屏组成显示电路来提示信息。当输入密码时,只显示*,当密码位数输入完毕按下确认键之后,对输入的密码进行比较,正确就发出‘叮当’声,同时门打开;若密码输入不正确时显示错误,并计次录数,当次数超过三次就触动蜂鸣器发出报警声。 3)键盘输入部分 本设计所采用键盘为4×4行列式。每一条水平线(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要 4 条行线和 4条列线,即可组成4×4个按键的键盘。在行线所接的单片机4个I/O 口作为输出端,而列线所接的I/O口则作为输入端。当按键没有被按下时所有的输出端都是高电平,代表无键按下。一旦有键按下,则输入线就会被拉低,这样通过读入输入线的状态就可知是否有键按下。按键功能分配分为数字键和功能键,数字键主要是用于密码输入,功能键主要是用于修改密码、确认密码、删除密码等。 4) 报警电路部分 当输入密码错误超过3次,就会触动报警电路中蜂鸣器。 5)开锁电路部分 用发光二极管代替开锁的电路,发光表示开锁。 2.1.2方案二采用数字电路控制方案 用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过10秒(一般情况下,用户不会超过10秒,若用户觉得不便,还可以修改)电路将报警20秒,若电路连续报警三次,电路将锁定键盘2分钟,防止他人的非法操作。 电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。电路框图如图2.2所示。 密码校验电路 图2.2  密码锁电路 2.1.3方案三采用EDA控制方案 1)整体结构设计 电子密码锁包括键盘控制、 密码设置和报警提示三大功能模块。 2)硬件描述语言VHDL描述电路 首先在合适的路径下建立本设计的文件夹。 然后用VHDL语言编辑。 最后仿真测试及编程下载配置。 2.2方案比较以及可行性 方案一采用基于单片机实现的电子密码锁,其中硬件电路设计具有按键有效提示、输入错误提示、控制开锁电平、控制报警电路、修改密码电路等多种功能。密码锁内部的单片机是核心处理设备,单片机有体积小、质量轻、价格便宜诸多优点。单片机软件部分软件的设计主要是 51 单片机的程序编写且单片机是靠程序运行的,如果需要修改只需要修改程序,不需要将整个硬件电路做整修,这不仅以节约资源而且可以节约时间,提高工作效率。因为通过不同的程序可以实现不同的功能,尤其是特殊的独特的一些功能。这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的,但是单片机却可以轻松解决。通过编写的程序可以实现高智能,高效率,以及高可靠性,比起数电中逻辑器件这个优点显而易见,因此方案一比方案二合适。 对比方案三,虽然都可通过编程来实现各种功能,但是单片机是软件编程,而EDA技术是在软件平台下,用硬件描述语言VHDL来实现的。设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件。对于我个人来说,EDA方面的知识有限,不太会运用,因此我个人不选择这个方案。 综上,本次设计最优选择为方案一即采用AT89C51为核心的单片机控制,其方案的可行性如下: ⏹ 单片机价格实惠,因而毕业设计成本不高。 ⏹ 单片机型号、种类多,在市场上容易购买。 ⏹ 电路的安装和调试都比较容易方便,比较易于实现。  3电子密码锁硬件电路的设计 本设计主要由中央控制模块、键盘输入模块、LCD显示密码模块、开锁电路模块、蜂鸣器报警电路模块五大模块组成。 3.1中央控制模块的设计 中央控制主要由STC89C52单片机构成,辅以复位电路和时钟电路。 3.1.1主控芯片STC89C52单片机的简介 1)STC89C52单片机的主要特性如下: 1) 增强型 8051 单片机,6 时钟/机器周期和 12 时钟/机器周期可以任意选择,指令代码完全兼容传统 8051。 2) 用户应用程序空间为 8K 字节,片上集成 512 字节 RAM 。 3) 通用 I/O 口(32个),P1/P2/P3/P4 是准双向口/电阻上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。 2)STC89C52RC 引脚功能说明: 1) VCC(40 引脚):电源电压 2) VSS(20 引脚):接地 3) P0 端口(P0.0~P0.7,39~32 引脚) :P0 口是一个漏极开路的 8 位双向 I/O 口。作为输出端口,每个引脚能驱动8个TTL 负载,对端口 P0 写入每个引脚能驱动 写入“1”时,可 以作为高阻抗输入。 4) P1 端口(P1.0~P1.7,1~8 引脚) :P1 口是一个内部带上拉电阻的 8 位双向 I/O 口。P1 口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。 5) P2 端口(P2.0~P2.7,21~28 引脚) :P2 口是一个内部带上拉电阻的 8 位双向 I/O 端口。P2 作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会 输出一个电流(I)。 6) P3 端口(P3.0~P3.7,10~17 引脚) :P3 口是一个带内部上拉电阻的 8 位双向 I/O 端口。 7) RST(9 引脚) :复位输入,当输入连续两个机器周期以上高电平时为有效, 用来完成单片机的复位初始化操作。 8) ALE/ ROG (30 引脚) 地址锁存控制信号 :(ALE) 是访问外部程序存储器时, 锁存低 8 位地址的输出脉冲。 图3.1  STC单片机管脚图 3.1.2时钟电路的设计 时钟信号用来提供单片机片内的各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,如图2-2所示在其外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。图3.1.2中外接晶体以及电容C2和C3构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值为30pF左右,晶振频率选11.0592MHz ,其连接电路如图3.2所示。 图3.2  晶振电路 3.1.3复位电路的设计 单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位,其连接电路如图3.3所示。 1)手动按钮复位 手动按钮复位需要人为在复位输入端RST上加入高电平(图1)。一般采用的办法是在RST端和正电源VCC之间接一个按钮。当人为按下按钮时,则VCC的+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。 2)上电复位 上电复位电路只要在RST复位输入引脚上接电容至VCC端,下接一个电阻到地即可。对于CMOS型单片机,由于在RST内部有一个下拉电阻,故可将外部电阻去掉,而将外接电容减至1?F。上电复位的工作过程是在加电时,复位电路通过电 容加给RST端一个短暂的高电平信号,此高电平信号随着VCC对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。上电时,VCC的上升时间约为10ms,而起振荡器的起时间取决于振荡频率,如晶振频率为10MHz,起振时间为1ms;晶振频率为1MHz,起振时间则为10ms。在图2的复位电路中,当VCC掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序。 图3.3  手动按钮复位电路 3.2键盘输入模块的设计 3.2.1矩阵键盘工作原理 矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线,组成键盘的。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。行列式键盘的工作方式是先利用列线发送扫描字,然后读取行线的状态,查看是否有按键按下。键盘部分提供一种扫描的工作方式能对键盘不断扫描、自动消抖、自动识别按下的键,并给出编码。在显示部分,它可以为发光二极管、荧光管及其他显示器提供按扫描方式工作的显示接口,而且为显示器提供多路复用信号,可以显示多达16位的字符或数字。 键盘中有无按键按下是由列线送入全扫描字、行线读入行线状态来判断的,其方法是由列线逐列置低电平后,检查行输入状态来判断,其方法是依次给列线送低电平,然后检查所有行线状态,如果全为1,则所按下的键不在此列,如果不全为1,则所按下的键必在此列,而且是在与0电平线相交的交点上的那个键。 3.2.2单片机键盘扫描法 扫描法是在判定有键按下后逐列果行(或列)的状态出现非全1状态,如果(或列)的状态出现非全1状态,这时0状态的行、列交点的键就是所按下的键。扫描法的特点是逐行(或逐列)扫描查询,这时相应行(或列)应有上拉电阻接高电平。行列式键盘扫描程序就是采用扫描法来确定哪个键按下的。 确定矩阵式键盘上哪个键被按下时运用扫描法,又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,过程如下: 1)判断键盘中有无键按下,将全部行线Y0~Y3置为低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线,均为高电平,则键盘中无键按下。 2)判断闭合键所在的位置,在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为为低电平,即在置某根行线为低电平时,其他线为高电平,在确定某根行线位置为低电平后,再逐行检测各列线的电平状态,若某列为则该列线与置为低电平的行线交叉处的按钮就是闭合的按键,其连接电路如图3.4所示。 图3.4  矩阵键盘电路与单片机连接图 3.3LCD显示密码模块的设计 显示模块主要由LCD1602显示屏组成,他显示的是键盘输入的密码,以及密码正确与错误的提示。当输入密码时,出于安全性的考虑,显示的密码是有*号代替,为暗密。当输入六位密码后按下确认键,系统会与存于ROM的密码对比, 若密码错误,显示屏会显示Error,若密码正确,显示屏会显示Right。 3.3.1LCD1602简介 1)  1602功能介绍 1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 2)  1602LCD 采用标准的 14脚(无背光)或 16脚(带背光)接口,各引脚接口说明如下表3.1所示: 表 3.1引脚功能说明 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 数据 2 VDD 电源正极 10 D3 数据 3 VL 液晶显示偏压 11 D4 数据 4 RS 数据/命令选择 12 D5 数据 5 R/W 读/写选择 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 其引脚图如下图所示: 图3.5  LCD1602引脚图 3)  LCD寄存器的选择     表3.2 LCD寄存器的选择 E R/W RS 功能说明 1 1 0 写入命令寄存器 1 1 1 写入数据寄存器 1 1 0 读取忙碌及RAM地址 1 1 1 读取RAM数据 0 X 1 不动作 3.3.2LCD1602液晶显示模块与单片机连接电路 图3.6  连接电路 3.4开锁模块的设计 通过单片机送给开锁执行机构,电路驱动原本是利用电磁锁吸合原理来进行开锁的的。本设计为节约资源,通过P3.0接一个发光二极管作为电磁阀线圈,当发光二级管亮则表示实现,密码正确门开,若二极管不亮则表示输入的密码不正确,门不开,其连接电路如图3.7所示。 图3.7  开锁电路 3.5报警模块的设计 报警模块由蜂鸣器和单片机组成。选择一只压电式蜂鸣器,压电式蜂鸣器工作时约需要100mA驱动电流。蜂鸣器电路如图3.5所示。当89C51的P3.3口输出为高电平时,蜂鸣器产生蜂鸣音,89C51输出为低电平时,蜂鸣器不发声,其连接电路如图3.5所示。 图3.8  报警电路 3.6硬件电路总体设计 本次设计的各大模块在上述章节中已仔细介绍了,将各大模块融合在一起后组成电子密码锁硬件电路,键盘输入模块和LCD显示模块是最主要的两大模块,键盘主要是完成密码的输入、修改密码、消除密码等等任务。而显示模块则是主要完成输入密码的显示以及密码输入正确或者错误的提示。而剩余的就是报警模块、开锁模块以及单片机的最小系统。开锁顾名思义就是密码输入正确后打开大门,而报警主要是为安全着想,当有人非法入侵时便于抓住犯人。单片机最小系统则是单片机正常运行的保障。总的硬件电路如图3.9所示。 图3.9  总的硬件电路 4电子密码锁的软件设计 电子密码锁的软件设计是整个电子密码锁可靠安全运行的关键,密码锁软件程序分为主程序、延时子程序、LCD显示子程序、修改密码子程序、扫描键盘输入子程序、报警子程序。密码通过矩阵键盘输入,并且在液晶显示屏上显示,如果输入密码正确,则可以直接开锁。如果不正确,并且3次以上输入不正确,则启动报警系统,触发蜂鸣器发声。如果要修改密码,则需要在输入基础密码判别正确后,输入修改后的密码,通过系统确认后方可修改密码。为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。而本次设计分为四大模块,分别是键盘输入模块、LCD显示模块、开锁和报警模块以及修改密码模块,通过主程序来实现控制。 4.1主程序流程介绍 主程序主要内容是各子程序模块的调用,并利用各模块进行电子密码锁功能的实现,即是键盘输入密码并在LCD液晶显示屏上显示密码,当密码输入完成后,单片机会将输入进的密码与原单片机内部所储存的密码进行对比,如若密码正确,则代表电磁吸合器的发光二极管会显示红色,同时LCD液晶显示屏会显示出right;如若密码错误,会启动计数器计数,当错误次数超过三次时,报警系统会启动即是蜂鸣器会发出报警声,以提醒保安。流程图如图4.1所示。 N 图4.1 主程序流程图 4.2键盘模块流程图 键盘输入模块主要包含键盘的扫描、延时去抖、找到键值以及返回键值。键盘扫描时循环的,程序编写是会使其进入是循环,这样可以检验出是否有按键按下,如果无按键按下就会进入等待有按键按下的状态,如果有按键按下的话就进入延时去抖的步骤,这样可以肯定的确定扫描到的按键是否被按下。经过去抖之后就是确定按键的位置即是第几行和第几列,找到按键后,就是确定键值并返回按键值,每一次扫描到有键按下后,最后都要有释放闭合按键的步骤,这是为了避免影响下一次键盘的扫描和按键值的读取。流程图如图4.2所示。 N 图4.2  键盘扫描流程图 按键的消抖子程序所示:     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];            }        4.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=dat%10000/1000;       sh3=dat%1000/100;       sh2=dat%100/10;       sh1=dat%10;       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)       {           case 1:row=0x80;break; 流程图如图4.3所示: 结束 图4.3  LCD显示流程图 4.4修改密码流程图 修改密码模块主要是在输入密码正确之后,按下14键即是修改密码键就能进入修改密码界面,其流程分为四个步骤,分别为按下14键并启动定时、输入修改的密码、按下确认键11键、LCD的显示。修改密码的部分程序如下: //改密码 void ch_word(void) {     unsigned char recieve=0xff,b[10],j=0;     LCD_CLR();     printf_char(1,1,"new_password%d");     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)         {             if(j!=0)                        {                  a[j]='\0';                 printf_char(2,j," %d");                 j--;                              }         }                     流程图如图4.4所示: 图4.4  修改密码流程图 4.5开锁和报警模块流程图 开锁和报警模块主要任务是把从键盘输入到单片机的密码和本身保存在单片机中的密码进行对比,如果正确就开锁,如果错误的话就进行计数并显示在LCD液晶显示屏上,当输入密码的错误次数达到3次就进入报警模式,启动蜂鸣器报警。其流程图如图4.5所示。 图4.5  报警流程图 5电子密码锁的系统调试及分析 5.1硬件电路调试及结果分析 硬件调试首先检查电路板焊接是否有误,检查有是否出现虚焊、漏焊、线路短接、元器件引脚是否错误焊接等等问题,然后检查电路中某些元器件是否起作用,最后利用一些小程序测试LCD1602是否完好无损。 检测单片机是否工作可通过观察示波器显示的波形是否衰减,或者利用万用表测一下18,19脚的电压,应该有个2-3V就说明起振了,另外,ALE如果有信号或者有电压也说明单片机工作了。我采用利用万用表侧18、19脚的电压,其结果显示为2.3V。 检测电路有无虚焊可用万用表的二极管档来检测,当把万用表的红黑两表笔接触在焊接线路的两端后,万用表发出声音,则说明没有虚焊。检查电路是否短路也是利用同一原理。 5.2软件调试及功能分析 软件调试即是把已经写好的C语言程序载入到软件调试工具,检查软件是否有设法错误,再根据软件提示对本程序进行修改,直到没有错误再生成单片机能运行的机器码,再用51开发板或其它单片机写入工具把机器码写入单片机进行实际的程序调试,根据实际情况再对程序的不足加以修改,直到满足设计要求。本设计采用Proteus和KEIL软件进行仿真、调试,首先在在Proteus软件上进行硬件电路的描绘,其次在KEIL软件编写电子密码锁的源程序,源程序经过汇编后产生Hex文件,最后将生成的目标文件添加到单片机中仿真调试。 5.2.1调试过程 首先打开KEIL C51主程序,新建,新建文本框写入程序,保存,检查是否有语法错误,经反复检查无误后汇编,生成51单片机可执行的HEX文件。然后用与51开发板相匹配的写入软件把HEX文件写入单片机。 图5.1  KEIL c51调试介面 图5.2  程序写入界面 5.2.2仿真结果分析 当系统通电进入初始化状态后,LCD显示屏会显示Welcome,结果如图5.3所示。 图5.3  系统初始化 当进入输入密码阶段时,依次按下按键上的数字键1,2,3,4,5,6后,LCD显示屏显示如图5.4所示。 图5.4  输入密码阶段仿真图 当按下确定键11键后,显示屏上显示正确且二极管灯亮,表示密码正确开门,如图5.5所示。 图5.5  输入密码正确时仿真图 按下确认键后,二极管不亮且显示屏上显示Error,表示密码输入错误,门的锁不会打开。如图5.6所示。 图5.6  输入密码错误仿真图 当需要修改密码时,只需按下14键即可进入到修改密码界面,修改成功后显示success,修改错误后显示屏会显示fail。 图5.7  修改密码仿真图 图5.8  修改失败仿真图 5.3系统调试 系统调试即是将源程序在KEIL软件里运行产生的可执行文件HEX写入到单片机中,然后通电初始化,检查是否能实现仿真中达到的效果。如果都无误写入程序后还是有问题就要检查程序是否有问题。其结果分析如下所示: 单片机写入程序后并通电初始化后,LCD显示屏显示welcome如图5.9所示。 图5.9  初始化硬件电路 当通过4*4矩阵键盘输入密码且密码正确后,LCD显示屏显示right如图5.10所示。 图5.10  密码正确界面 当通过4*4矩阵键盘输入密码且密码错误后,LCD显示屏显示error以及输入错误的次数,如图5.11所示。 图5.11  密码错误界面 当用户需要修改密码时,按下14键即可进入修改密码界面,LCD显示屏显示new-password如图5.12所示。 图5.12  修改密码界面 6结论及展望 6.1结论 本次设计通过硬件电路设计、软件编程、硬件调试、软件调试以及系统调试完成了设计要求,达到了设计目的。本次设计最终的结果如下: ⏹ 电子密码锁通过键盘能成功进行输入密码; ⏹ LCD液晶显示屏上能显示输入的密码; ⏹ 能判断输入的密码是否正确并且能显示判断结果; ⏹ 能在密码输入正确后开门; ⏹ 能在密码输入错误次数达到三次以上后进行报警; ⏹ 能在开门后通过一按键对原有密码进行更改; ⏹ 能用*代替显示输入的密码数字,隐藏了密码,这实现了密码保护。 但是在实现上述功能时,也存在许多不足。第一,在密码输入正确时除了要使代表电磁吸合器的发光二极管发光以外,还应该加上语音模块,提示门开,这样更人性化一些。第二,密码输入错误次数小于三次时,也应该采取措施提醒。第三,密码修改部分,本次设计实现的不是很好,密码能进行修改但是只能修改第一个密码。第四,本次设计的电子密码锁,安全方面还可以提高进步。本设计中的报警系统只是一个简单的系统,要应用于实际生活还需要进一步改进。 6.2展望 电子锁是信息化时代发展的产物,应时而生,我相信随着科技的不断发展,将来的电子锁一定更加完美,更加人性化,更加便宜,更加安全。本次设计中还有待完善的地方还很多。首先,修改密码可进一步完善,实现有不管多少户住户和多少个密码,都能修改密码。其次,也是最重要的安全防问题,报警途径很多,有视屏监视和发出报警声提醒值班的保安等等。未来,电子密码锁需要大面积占据市场首先必须要突破的就是安全问题,如果解决了这个问题,电子密码锁就能在锁的行业所向披靡。最后本次设计还可以精进的地方就是输入密码错误时的处理方法。在输入密码错误次数在三次以内时,也应该采取措施。比如禁止输入三秒或者也用发声模块提醒,只要发声频率不一致就可区分。 谢辞 本次设计题目是在和我的指导老师孙晓玲老师交流后定下的,选此题原因在于虽然电子密码锁在之前就已近在市场上出现,但是始终没有广泛应用到人们的日常生活中,因此电子密码锁就具有继续研究的必要。所以在和孙老师商议过后,我就选择了电子密码锁这个设计题目。从前期努力查找资料,到中期设计思路的讨论和修改,及最后的反复斟酌,我都无比的感谢我的指导老师孙老师。她在此期间对我的帮助是我能及时准确完成毕业设计任务的必要条件。 在硬件调试和软件调试的过程中,我遇到了相当多的困难,而帮助我解决困难的同学是我必须要要感谢的。帮助我编写程序并进行调试的彭同学,在我对某些程序一筹莫展的时候,伸出了援救之手,在编写程序过程中少走了许多弯路,对于他给予我的帮助,我真心的表示感谢。再来就是帮助我进行硬件调试的徐同学和胡同学,他们在我电路板焊接好后,但是未能成功实现电子密码锁功能的时候,及时伸出了援救之手,把我从无助、迷茫中解救出来,最终完美的完成毕业设计,对大学四年画上了圆满的句号。 在论文的不断修改中孙老师总是认真仔细的帮助我检查并修改论文,使我的论文不断完善。再次对您表示感谢,师恩伟大,无以回报。在这里还要深深的对您说上一句抱歉,因为我的懒散和懈怠,令您费尽苦心并且几近失望。最后要感谢的是电信院所有的老师与领导,我永远都不会忘记你们的良苦用心以及谆谆教诲。 参考文献 [1] 王千. 实用电子电路大全[M]. 电子工业出版社, 2004, 28-36 [2] 彭为. 单片机典型系统设计实例精讲[M]. 电子工业出版社,2 006, 69-88 [3] 张荣. 基于单片机的智能系统设计与实现[M]. 电子工业出版社, 2005, 35-38 [4] 朱勇. 单片机原理与应用技术[M]. 清华大学出版社, 2006, 14-16 [5] 潘永雄. 新编单片机原理与应用[M]. 西安电子科技大学出版社, 2003, 78-86 [6] 叶启明. 单片机制作的新型安全密码锁[J]. 家庭电子, 2005, (10): [7] 郭海英. 基于单片机的电子安全密码锁的设计[M]. 现代电子技术, 2005,(13) [8] 李明喜. 新型电子密码锁的设计[J]. 机电产品开发与创新, 2004, (03): [9] 彭为. 单片机典型系统设计实例精讲[M]. 北京:电子工业出版社, 2006, 35-38 [10] ATmega.ATmega8L-8AC, 2006, (01), 63-64 [11] Wireless World, 1998, 42-45 [12] 石文轩, 宋薇. 基于单片机MCS一51的智能密码锁设计[J]. 武汉工程职业技术学院学报, 2004, (01): 76-35 [13] 祖龙起, 刘仁杰. 一种新型可编程密码锁[J]. 大连轻工业学院学报,2002, (01): 54-57 [14] 叶启明. 单片机制作的新型安全密码锁[J]. 家庭电子, 2005, (10): 98-111 [15] 郭海英. 基于单片机的电子安全密码锁的设计[M]. 现代电子技术, 2005, (13), 76-96 [16] 李明喜. 新型电子密码锁的设计[J]. 机电产品开发与创新, 2004, (03): 45-66 [17] 董继成. 一种新型安全的单片机密码锁[J]. 电子技术, 2004, (03): 122-134 [18] R. Dye. Visual Object-Orientated Programming[J]. Dr. Dobbs MacintoshJournal, 1991,56(1):213-234 [19] 李朝青.单片机原理及接口技术(简明修订版)[M].北京:北京航空航天大学出版社,1998 [20] 李全利.单片机原理及接口技术[M].高等教育出版社,2003 [21] PROTEL99 SE电路设计与制板[M].机械工业出版社,2007 22] 杨将新,李华军,刘到骏等.单片机程序设计及应用(从基础到实践)[J].电子工业出版社,2006 [23] Steven F.Barrett.Daneil J.Pack.Embedded System[M].北京:电子工业出版社,2006 [24] 周立功.LPC900系列Flash单片机应用技术[J].北京航空航天大学出版社,  2004 [25] 黄智伟.全国大学生电子设计竞赛训练教程[M].北京:电子工业出版社,  2005 附录 附1部分代码 #define key_data  P1 code unsigned  char key_value[4][4]={1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16};//--键值初始化(可自行赋予键值) uchar keypad(void) {     uchar row,col;     uchar recieve=0xff;     key_data=0XF0;     delay(100);     if(key_data!=0xf0)     {       delay(100);       if(key_data!=0xf0)       row=key_data;       key_data=0x0f;       delay(10);       col=key_data;         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];            }            return recieve; } #include "reg51.h" #include "lcd1602.c" #include "keydriver.c" sbit P3_0=P3^0; sbit P3_3=P3^3; //sbit P3_0=P3^0; unsigned char count,i; unsigned char a[10]; unsigned char password[4][10]={1,2,3,4,5,6,7,8,9,0,                                       2,4,5,6,7,8,2,3,4,7,                                       4,5,6,3,2,1,1,7,8,9,                                       0,9,8,7,6,5,4,3,2,1}; //报告结果 void  report(unsigned char flag) {     a[10]=0;     if(flag==0)     {            printf_char(1,10,"right%d") ;         P3_0=0;         delay(60000);delay(60000);                         P3_0=1;         LCD_CLR();     }     else     {         printf_char(1,10,"error%d") ;         if(count>=3)             P3_3=1;                         delay(60000);delay(60000);             P3_3=0;            LCD_CLR();        } } //回删键 void del(void) {     if(i==0)         return;     else     {          a[i]='\0';         printf_char(2,i," %d");         i--;                      }    } //改密码 void ch_word(void) {     unsigned char recieve=0xff,b[10],j=0;     LCD_CLR();     printf_char(1,1,"new_password%d");     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)         {             if(j!=0)                        {                  a[j]='\0';                 printf_char(2,j," %d");                 j--;                              }         }                         }     LCD_CLR();     if(j==6)     {         for(j=0;j<6;j++)             password[0][j]=b[j];         printf_char(1,1,"success%d");     }     else           printf_char(1,1,"fail%d");         delay(60000); delay(60000);     LCD_CLR();    } //功能 void menu(void) {     //unsigned char recieve;     unsigned char number=0;     unsigned char key_value=100;     unsigned char ERROR=3;     unsigned char j=0;     for(;;)     {                 number=keypad();                      key_value=number;         while(number!=0XFF)             number=keypad();                     printf_char(1,1,"welcome%d");                               if(key_value<=9&&key_value>=0&&i<6)         {                        a[i]=key_value;                            printf_char(2,i+1,"*%d");                  i++;                }         else if(key_value==11)         {             for(i=0;i<6;i++)             {                                          if(a[i]!=password[0][i]&&a[i]!=password[1][i]&&a[i]!=password[2][i]&&a[i]!=password[3][i])                 {                     ERROR=1;                     count++;                     break;                 }                 else                 {                     ERROR=0;                     count=0;                 }             }         i=0;         report(ERROR);         }            else if(key_value==13)         {             LCD_CLR();             a[10]=0;                    }         else if(key_value==12)               del();         else if(key_value==14)         {               ch_word();         }                        }  } void main(void) {     LCD_CLR();     LCD_init();     while(1)         menu(); } /********************************************************                   液晶显示器说明 1、8位传输数据  LCD_DATA = P0 2、控制端口    RS=P2^0  RW=P2^1    EN=P2^2 ********************************************************/ /********************************************************                   函数说明 1、LCD_init();//初始化 2、LCD_CLR();//清屏函数 3、printf_dat(uchar row,uchar col,uchar count,uint dat)     //在第row行 第col位开始显示count个数据(dat)    4、printf_char(uchar row,uchar col,uchar Inbuffer[31])     //在第row行 第col位开始显示 字符串Inbuffer[]              ********************************************************/ #include #define uchar unsigned char #define uint unsigned int //********************************************************// //                  1602所用端口                        *// //********************************************************// #define LCD_DATA P0//1602数据端口 sbit RS=P2^7; sbit RW=P2^6; sbit EN=P2^5; /*sbit RS=P1^0; sbit RW=P1^1; sbit EN=P1^2; */ //********************************************************// //*                函数声明                          *// //********************************************************// void delay(uint a); void write_adr(uchar adr) ; void write_data(uchar dat); void LCD_init(void); void LCD_CLR(void); void printf_data(uchar row,uchar col,uchar count,uint dat); void printf_char(uchar row,uchar col,uchar Inbuffer[31]); //********************************************************// //*                1602 函数段                          *// //********************************************************// //延时函数 void delay(uint a) {   while(a--); } //写指令 void write_adr(uchar adr) {     RS=RW=0;     LCD_DATA=adr;     delay(1);     EN=1;     delay(5);     EN=0;     delay(500); } //写数据 void write_data(uchar dat) {     RS=1;RW=0;     LCD_DATA=dat;     delay(1);     EN=1;     delay(5);     EN=0;     delay(500); } //初始化 void LCD_init(void) {       write_adr(0x38);       write_adr(0x80); } //清屏函数 void LCD_CLR(void) {       LCD_init();       write_adr(0x01);       delay(500); } //写数 (5位数据) void printf_data(uchar row,uchar col,uchar count,uint dat) {       uchar sh1,sh2,sh3,sh4,sh5;       sh5=dat/10000;       sh4=dat%10000/1000;       sh3=dat%1000/100;       sh2=dat%100/10;       sh1=dat%10;       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)       {           case 1:row=0x80;break;           case 2:row=0xc0;break;           default:break;       }     write_adr(row+col-1);     delay(500);     for(i=0;i<31;i++)     {           if(Inbuffer[i]=='%'&&Inbuffer[i+1]=='d')             break;           if(col+i==16&&row==0x80)             write_adr(0xc0);           write_data(Inbuffer[i]);     } } 附2总电路图 文档已经阅读完毕,请返回上一页!
/
本文档为【基于STC89C52单片机的电子密码锁(完整版) 附 仿真图 原理图】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索