基于STC89C52单片机的电子密码锁
学生姓名: xx 学生学号: xxxxx
院(系): 电气信息工程学院 年级专业: 2020级电子信息工程2班 指导教师: 陶文英
二〇一三年六月
摘 要
随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的情形不足为奇,电子密码锁具有平安性能高,本钱低,功耗低,操作简单等优势使其作为防盗卫士的角色愈来愈重要。
从经济有效角度动身,采纳51系列单片机,设计一款可更改密码,LCD1602显示,具有报警功能,该电子密码锁体积小,易于开发,本钱较低,平安性高,能将其存储的现场历史数据及时上报给上位机系统,实现网络实时监控,方便治理人员及时分析和处置数据。其性能和平安性已大大超过了机械锁,特点有保密性好,编码量多,远远大于弹子锁,随机开锁成功率几乎为零;密码可变, 用户能够常常更改密码,避免密码被盗,同时也能够幸免因人员的更替而使锁的密级下降;误码输入爱惜。当输入密码多次错误时,报警系统自动启动;电子密码锁操作简单易行,受到广大用户的亲睐。
关键词 单片机, 密码锁, 更改密码, LCD1602
目 录
摘要……………………………………………………………………………………错误!未定义书签。
1 绪论
电子密码锁简介……………………………………………………………………………1 电子密码锁的进展趋势…………………………………………………………………1
2 设计方案……………………………………………………………………………………3 3 要紧元器件…………………………………………………………………………………4
主控芯片STC89C52………………………………………………………………………4 晶体振荡器………………………………………………………………………………8 LCD显示密码模块的设计………………………………………………………………9 LCD1602简介………………………………………………………………………9 LCD1602液晶显示模块与单片机连接电路………………………………………11
4 硬件系统设计……………………………………………………………………………12
设计原理…………………………………………………………………………………12 电源输入电路……………………………………………………………………………12 矩阵键盘…………………………………………………………………………………13 复位电路…………………………………………………………………………………14 晶振电路…………………………………………………………………………………14 报警电路…………………………………………………………………………………15 显示电路…………………………………………………………………………………15 开锁电路…………………………………………………………………………………16 电路整体组成……………………………………………………………………………16
5 软件程序设计……………………………………………………………………………18
主程序流程介绍…………………………………………………………………………18 键盘模块流程图…………………………………………………………………………19 显示模块流程图…………………………………………………………………………21 修改密码流程图…………………………………………………………………………22 开锁和报警模块流程图………………………………………………………………23
6 电子密码锁的系统调试及仿真………………………………………………………25
硬件电路调试及结果分析………………………………………………………………25 软件调试及功能分析……………………………………………………………………25 调试进程……………………………………………………………………………25 仿真结果分…………………………………………………………………………26
仿真全图…………………………………………………………………………………28
7 结论…………………………………………………………………………………………29 参考文献………………………………………………………………………………………30 附录:……………………………………………………………………………………………31
1 绪论
电子密码锁简介
电子密码锁是一种通过密码输入来操纵电路或是芯片工作,从而操纵机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。此刻应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和平安性已大大超过了机械锁。其特点如下:
1) 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。 2) 密码可变,用户能够随时更改密码,避免密码被盗,同时也能够幸免因
人员的更替而使锁的密级下降。
3) 误码输入爱惜,当输入密码多次错误时,报警系统自动启动。 4) 无活动零件,可不能磨损,寿命长。
5) 利用灵活性好,不像机械锁必需佩带钥匙才能开锁。 6) 电子密码锁操作简单易行,一学即会。
电子密码锁的进展趋势
日常生活和工作中,住宅与部门的平安防范、单位的文件档案、财务报表和一些个人资料的保留多以加锁的方法来解决。目前门锁要紧用弹子锁,其钥匙容易丢失;保险箱要紧用机械密码锁,其结构较为复杂,制造精度要求高,本钱高,且易显现故障,人们常需携带多把钥匙,利用极不方便,且钥匙丢失后平安性即大打折扣。针对这些锁具给人们带来的不便假设利用机械式钥匙开锁,为知足人们对锁的利用要求,增加其平安性,用密码代替钥匙的密码锁应运而生。由于电子器件所限,以前开发的电子密码锁,其种类不多,保密性差,最大体的确实是只依托最简单的模拟电子开关来实现的,制作简单但很不平安,在后为多是基于EDA来实现的,其电路结构复杂,电子元件繁多,也有利用早先的20引角的2051系列单片机来实现的,但密码简单,易破解。随着电子元件的进一步进展,电子密码锁也显现了很多的种类,功能日趋壮大,利用加倍方便,平安保密性更强,由以前的单密码输入进展到此刻的,密码加感应元件,实现了真真的电子加密,
用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的进展及人们对保密性需求的提高显现了愈来愈多的电子密码锁。出于平安、方便等方面的需要许多电子密码锁已接踵问世。但这种产品的特点是针对特定有效卡、指纹或声音有效,且不能实现远程操纵,只能适用于保密要求高且供个人利用的箱、柜、房间等。由于数字、字符、图形图像、人体生物特点和时刻等要素都可成为钥匙的电子信息,组合利用这些信息能够使电子防盗锁取得高度的保密性,如防范森严的金库,需要利用复合信息密码的电子防盗锁,组合利用信息也能够使电子防盗锁取得无穷扩展的可能,使产品多样化,对用户而言是“千挑百选、自得其所”。能够看出组合利用电子信息是电子密码锁以后进展的趋势。
2 设计方案
采纳以单片机为核心的操纵方案
由于单片机种类繁多,各类型号都有其必然的应用环境,因此在选历时要多加比较,合理选择,以期取得最正确的性价比。一样来讲在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、按时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除以上的一些的还有一些最大体的比如:中断源的数量和优先级、工作温度范围、有无低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。在开发进程中单片机还受到:开发工具、编程器、开发本钱、开发人员的适应性、技术支持和效劳等等因素。基于以上因素本设计选用单片机STC89C52作为本设计的核心元件,利用单片机灵活的编程设计和丰硕的I/O端口,及其操纵的准确性,实现大体的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的操纵,外接LCD1602液晶显示屏用于显示作用。当用户需要开锁时,先按键盘开锁键以后按键盘的数字键0-9输入密码。密码输完后按下确认键,若是密码输入正确那么开锁,不正确那么从头输入密码,当三次密码错误那么发出报警;当用户需要修改密码时,先按下键盘设置键后输入原先的密码,只有当输入的原密码正确开锁后才能设置新密码。新密码输入无误后按确认键使新密码将取得存储,密码修改成功。
3 要紧元器件
主控芯片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字节可编程闪烁存储器
·寿命:1000写/擦循环 ·数据保留时刻:10年 ·全静态工作:0Hz-24Hz ·三级程序存储器锁定 ·128*8位内部RAM ·32可编程I/O线 ·两个16位按时器/计数器 ·6个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路
2)STC89C52RC 引脚功能说明:
一、主电源引脚VSS和VSS STC89C52芯片引脚图 VSS——(40脚)接+5V电压; VSS——(20脚)接地。
二、外接晶体引脚XTAL1和XTAL2
XTAL1(19脚)接外部晶体的一个引脚。在单片机内部,它是一个反相放大器的输入端,那个放大器组成了片内振荡器。当采纳外部振荡器时,对HMOS单片机,此引脚应接地;对SHMOS单片机,此引脚作为驱动端。
XTAL2(18脚)接外晶体的另一端。在单片机内部,接至上述振荡器的反相放大器的输出端。采纳外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到内部时钟发生器的输入端;对XHMOS,此引脚应悬浮。
3、操纵或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP ①RST/VPD(9脚)当振荡器运行时,在此脚上显现两个机械周期的高电平将使单片机复位。推荐在此引脚与VSS引脚之间连接一个约的下拉电阻,与VSS引脚之间连接一个约10μF的电容,以保证靠得住地复位。
VSS掉电期间,此引脚可接上备用电源,以保证内部RAM的数据不丢失。当VSS主电源下掉到低于规定的电平,而VPD在其规定的电压范围(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电路。
关于 EPROM型单片机,在 EPROM编程期间,此引脚接收编程脉冲(PROG功能)。
PSEN 外部程序存储器读选通信号输出端。在从外部程序存储器取指令(或数据)期间;PSEN 在每一个机械周期内两次有效。 PSEN 一样能够驱动八个LSTTL输入。
EA/Vpp EA为内部程序存储器和外部程序存储器选择端。当EA为高电平常,访问内部程序存储器(PS值小于4K)。当EA为低电平常,那么访问外部程序存储器。关于EPROM型单片机,在EPROM编程期间,此引脚上加21VEPROM编程电源(Vpp)。
五、输入/输出(I/O)引脚P0、P一、P二、P3(共32根)
①P0口(39脚至32脚):是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个LS型的TTL负载。
②P1口(1脚至8脚):是准双向8位I/O口。由于这种接口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。P1口能驱动(吸收或输出电流)4个LS型的TTL负载。对805二、8032,引脚的第二功能为T2按时/计数器的外部输入,引脚的第二功能为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。
表3-1 P3口管脚备选功能
RXD(串行输入口) TXD(串行输出口) /INT0(外部中断0) /INT1(外部中断1) T0(记时器0外部输入) T1(记时器1外部输入) /WR(外部数据存储器写选通) /RD(外部数据存储器读选通) 晶体振荡器
晶体振荡器,简称晶振,其作用在于产生原始的时钟频率,那个频率通过频率发生器的放大或缩小后就成了电脑中各类不同的总线频率。以声卡为例,要实现对模拟信号或48kHz的采样,频率发生器就必需提供一个或48kHz的时钟频率。若是需要对这两种音频同时支持的话,声卡就需要有两颗晶振。可是此刻的娱乐级声卡为了降低本钱,通常都采纳SCR将输出的采样频率固定在48kHz,可是SRC会对音质带来损害,而且此刻的娱乐级声卡都没有专门好地解决那个问题。此刻应用最普遍的是石英晶体振荡器。
石英晶体振荡器是一种高精度和高稳固度的振荡器,石英晶体振荡器也称石英晶体谐振器,它用来稳固频率和选择频率,是一种能够取代LC谐振回路的晶体谐振元件。石英晶体振荡器普遍地应用在电视机、影碟机、录像机、无线通信设备、电子钟表、单片机、数字仪器仪表等电子设备中。为数据处置设备产生时钟信号和为特定系统提供基准信号。在单片机中为其提供时钟频率。
石英晶体振荡器是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的大体组成大致是:从一块石英晶体上按必然方位角切下薄片(简称为晶片,它能够是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每一个电极上各焊一根引线接到管脚上,再加上封装外壳就组成了石英晶体谐振器,简称为石英晶体或晶体、晶振。其产品一样用金属外壳封装,也有效玻璃壳、陶瓷或塑料封装的。只要在晶体振子板极上施加交变电压,就会使
晶片产生机械变形振动,此现象即所谓逆压电效应。当外加电压频率等于晶体谐振器的固有频率时,就会发生压电谐振,从而致使机械变形的振幅突然增大。
时钟信号用来提供单片机片内的各类微操作的时刻基准,时钟信号通经常使用两种电路形式取得:内部振荡和外部振荡。MCS-51单片机内部有一个用于组成振荡器的高增益反向放大器,引脚XTAL1和XTAL2别离是此放大电器的输入端和输出端,由于采纳内部方式时,电路简单,所得的时钟信号比较稳固,实际利用中常采纳这种方式,外接晶体振荡器(简称晶振)或陶瓷谐振器就组成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一路可组成一个自激振荡器并产生振荡时钟脉冲。外接晶体和电容C2和C3组成并联谐振电路,它们起稳固振荡频率、快速起振的作用,其值为30pF左右,晶振频率选
LCD显示密码模块的设计
显示模块要紧由LCD1602显示屏组成,他显示的是键盘输入的密码,和密码正确与错误的提示。当输入密码时,出于平安性的考虑,显示的密码是有*号代替,为暗密。当输入六位密码后按下确认键,系统会与存于ROM的密码对照, 假设密码错误,显示屏会显示Error,假设密码正确,显示屏会显示Right。
LCD1602简介 1) 1602功能介绍
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有假设干个5X7或5X11等点阵字符位组成,每一个点阵字符位都能够显示一个字符。每位之间有一个点距的距离每行之间也有距离起到了字符间距和行间距的作用,正因为如此因此他不能显示图形。1602LCD是指显示的内容为16X2,即能够显示两行,每行16个字符液晶模块(显示字符和数字)。 2) 1602LCD 采纳标准的 14脚(无背光)或 16脚(带背光)接口,各引脚接口说明如下表3-2所示:
表3-2 引脚功能说明
编号 符号 引脚说明 编号 符号 引脚说明 1 2 3 4 5 6 7 8 VSS VDD VL RS R/W E D0 D1 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 9 10 11 12 13 14 15 16 D2 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数据 不动作 LCD1602液晶显示模块与单片机连接电路
图3-3 LCD1602液晶显示模块与单片机连接电路
4 硬件系统设计
设计原理
本设计要紧由单片机、矩阵键盘、液晶显示器和密码存储等部份组成。其中矩阵键盘用于输入数字密码和进行各类功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后通过单片机对用户输入的密码与自己保留的密码进行对照,从而判定密码是不是正确,然后操纵引脚的高低电平传到开锁电路或报警电路操纵开锁仍是报警,实际利历时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可,固然也能够用继电器的常开触点去操纵电磁铁吸合线圈。
本系总共有两部份组成,即硬件部份与软件部份。其中硬件部份由电源输入部份、键盘输入部份、密码存储部份、复位部份、晶振部份、显示部份、报警部份、开锁部份组成,软件部份对应的由主程序、初始化程序、LCD显示程序、键盘扫描程序、启动程序、关闭程序、建功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。
复位电路 振荡电路 键盘电路 STC89C52 单片机 显示电路 开锁电路 报警电路
图4-1 组成原理
电源输入电路
三端集成稳压器LM7805和LM7905是作为固定输出电压的典型应用。正常
工作时,输入、输出电压差为2--3V。电容C为输入稳固电容,其作用是减小纹波,消振、抑制高频和脉冲干扰,它一样为。电容C为输出稳固电容,其作用是改善负载的瞬态响应,它一样为1uF。利用三端稳压器时要依照输出电流的大小选择加散热器,不然会由于过热而无法工作到额定电流。
图4-2 电源输入电路
矩阵键盘
由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采纳的是矩
阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相较,要节省很多I/O口。本设计中利用的那个4*4键盘不但能完成密码的输入还能作专门功能键利用,比如清空显示功能等。键盘的每一个按键功能在程序设计中设置 。其大体功能(看键盘按键上的标记)及与单片机引脚接法。
图4-3 矩阵键盘
复位电路
单片机复位是使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< 晶振电路 STC89C52引脚XTAL1和XTAL2与晶体振荡器及电容C二、C1按以下图所示方式连接。晶振、电容C2/C3及片内与非门(作为反馈、放大元件)组成了电容三点式振荡器,振荡信号频率与晶振频率及电容C一、C2的容量有关,但要紧由晶振频率决定,范围在0~33MHz之间,电容C二、C3取值范围在30pF左右。依如实际情形,本设计中采纳做系统的外部晶振。电容取值为33pF。 图4-5 晶振电路 报警电路 报警部份由陶瓷压电发声装置及外围电路组成,加电后不发声,当有键按下 时,“叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的引脚为低电平,三极管T3导喇叭发出噪鸣声报警。 图4-6 报警电路 显示电路 LCD1602液晶显示屏显示。 图4-7 显示电路 开锁电路 通过单片机开锁执行机构,发光二极管D1发光以替代达到开锁的目的。 图4-8 开锁电路 开锁原理: 单片机 微控制器 返N 密码正Y 低电平 图4-9 开锁原理 LED 电路整体组成 在确信了选用什么型号的单片机后,就要确信在外围电路,其外围电路包括电源输入部份、键盘输入部份、复位部份、晶振部份、显示部份、报警部份、开锁部份组成,依如实际情形键盘输入部份选择4*4矩阵键盘,显示部份选择LCD1602液晶显示屏来完成。本次设计的各大模块在上述章节中已认真介绍了,将各大模块融合在一路后组成电子密码锁硬件电路,键盘输入模块和LCD1602液 晶显示屏显示模块是最要紧的两大模块,键盘主若是完成密码的输入、修改密码、 排除密码等等任务。而显示模块那么是要紧完成输入密码的显示和密码输入正确或错误的提示。而剩余的确实是报警模块、开锁模块和单片机的最小系统。开锁顾名思义确实是密码输入正确后打开大门,而报警主若是为平安着想,当有人非法入侵时便于抓住犯人。单片机最小系统那么是单片机正常运行的保障。总的硬件电路如图4-10。 图4-10 总电路图 5 软件程序设计 电子密码锁的软件设计是整个电子密码锁靠得住平安运行的关键,密码锁软件程序分为主程序、延时程序、LCD1602液晶显示屏显示程序、修改密码程序、扫描键盘输入程序、报警程序。密码通过矩阵键盘输入,而且在LCD1602液晶显示屏上显示,若是输入密码正确,那么能够直接开锁。若是不正确,而且3次以上输入不正确,那么启动报警系统,触发蜂鸣器发声。若是要修改密码,那么需要在输入基础密码判别正确后,输入修改后的密码,通过系统确认后方可修改密码。为了完成上述任务,在进行软件设计时,通常把整个进程分成假设干个部份,每一部份叫做一个模块。而本次设计分为四大模块,别离是键盘输入模块、LCD1602液晶显示屏显示模块、开锁和报警模块和修改密码模块,通过主程序来实现操纵。 主程序流程介绍 主程序要紧内容是各程序模块的挪用,并利用各模块进行电子密码锁功能的实现,即是键盘输入密码并在LCD1602液晶显示屏显示密码,当密码输入完成后,单片机遇将输入进的密码与原单片机内部所贮存的密码进行对照,如假设密码正确,那么代表电磁吸合器的发光二极管会发光,同时LCD1602液晶显示屏会显示出正确的密码;如假设密码错误,会启动计数器计数,当错误次数超过三次时,报警系统会启动即是蜂鸣器会发出报警声,以提示保安。流程图如图5-1所示。 开始 初始化 输入密码 N N 密码正确? Y Y 开锁? N 修改密码N 返回 图5-1 主程序流程 Y 修改程序 开锁程序 次数加1 次数>3? Y 报警程序 键盘模块流程图 键盘输入模块要紧包括键盘的扫描、延时去抖、找到键值和返回键值。键盘扫描时循环的,程序编写是会使其进入是循环,如此能够查验出是不是有按键按下,若是无按键按下就会进入等待有按键按下的状态,若是有按键按下的话就进入延时去抖的步骤,如此能够确信的确信扫描到的按键是不是被按下。通过去抖以后确实是确信按键的位置即是第几行和第几列,找到按键后,确实是确信键值并返回按键值,每一次扫描到有键按下后,最后都要有释放闭合按键的步骤,这是为了幸免阻碍下一次键盘的扫描和按键值的读取。流程图如图5-2所示 键盘扫描 N 有键闭合? Y 按下14键 启动定时 开始 延时去抖 找到闭合键 计算键值 输入密码 初始化LCD 闭合键释放 存入缓冲 返回键值 清除按下确认LCD 键盘模块流程 图5-2 比较密码 LCD 写 调用LED 按键的消抖子程序所示: if(press_on!=0XF0)结束调用显示 片机在操纵系统中的应用[M].北京:电子工业出版社,2020 [2] 周润景,张丽敏,王伟.Altium Designer原理图与PCB设计[M].北京:电子工业出版社,2020 [3] 蒋同泽.现代移动通信系统[M].北京:电子工业出版社,1998 [4] 张毅刚.单片机原理及应用[M],北京:高等教育出版社,2003 [5] 张云.基于GSM的短消息业务协议分析[J].北京:电子工业出版社,2001 [6] 刘法治.经常使用电子元器件及典型芯片应用技术[M],北京:机械工业出版社,2007 [7] 张迎.单片微型运算机原理、应用及接口技术[M].国防工业出版社. [8] 石东海.单片机数据通信技术从入门到精通[M].西安电子科技大学出版社. 附录: PCB布局: /******************************************************************************** 功能键 S6---S15 数字键0-9 S16---更改密码 S17---更改密码完毕后确认 S18---重试密码、从头设定 S19---关闭密码锁 初始密码:000000 密码位数:6位 注意:掉电后,所设密码会丢失,从头上点时,密码恢复为原始的000000 与P1相连的8位发光LED点亮代表锁被打开;熄灭代表锁被锁上 程序功能: 一、开锁: 下载程序后,直接按六次S7(即代表数字1),8位LED亮,锁被打开,输入密码时, 六位数码管依次显示小横杠。 二、更改密码: 只有当开锁(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; 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); 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: 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; 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; 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; } 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置一 } } 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; 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); //实时显示 } } 因篇幅问题不能全部显示,请点此查看更多更全内容