单片机课程设计密码锁

基于单片机的电子密码锁设计

摘要:随着电子产品向智能化和微型化的不断发展,单片机已经成为电子产品研制和开发中首选控制器。本文介绍了一种应用AT89S52单片机设计的防盗报警电子密码锁系统。经实验验证该系统具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可作为产品进行开发,应用于住宅、办公室的保险箱及档案柜等需要防盗的场所,有较强的实用性。

关键词:电子密码锁;AT89S52;设计

目录

1 引言 ......................................................................................................... 2

2 硬件设计 ................................................................................................. 3

2.1 要求及方案 .......................................................................................... 3

2.1.1 设计要求 .................................................................................... 3

2.1.2 方案设计 .................................................................................... 3

2.2 系统方框图 .......................................................................................... 3

2.3 工作原理 .............................................................................................. 4

2.4 键盘输入模块 ...................................................................................... 5

2.5 显示部分 .............................................................................................. 6

2.6 电路复位部分 ...................................................................................... 6

2.7 LED显示部分 ....................................................................................... 7

2.8 晶振部分 .............................................................................................. 8

2.9 开锁部分 .............................................................................................. 8

3 主要元器件介绍 ...................................................................................... 9

3.1 主控芯片AT89C52 ................................................................................ 9

3.1.1 AT89C52性能简介 ...................................................................... 9

3.1.2 AT89C52引角功能说明 ............................................................. 10

3.1.3 AT89C52芯片内部结构 ............................................................. 13

3.2 LCD1602显示器 ................................................................................. 14

3.2.1 接口信号说明 ............................................................................. 14

3.2.2 主要技术参数 ........................................................................... 15

3.2.3 基本操作程序 ........................................................................... 15

4 系统软件设计 ........................................................................................ 16

5 调试 ....................................................................................................... 19

6 总结 ....................................................................................................... 22

7 参考文献 ............................................................................................... 23

附录............................................................................................................. 24

1 引言

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

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

本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为提高安全性,当密码输入错误三次将报警。密码可以由用户自己修改设定,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。

2 硬件设计

2.1 要求及方案

2.1.1 设计要求

设计一款能设定密码的电子智能密码锁。

1、能输入6位数字密码,显示输入数据个数,但不显示密码,能删除并重新输入。

2、具有2次输入确认功能。

3、具有掉电以后密码不丢失,3次输入错误报警的功能,给出声光报警。

2.1.2 方案设计

本设计选用单片机AT89S52作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接LCD1602显示器用于显示作用。当用户需要开锁时,先按键盘开锁键之后按键盘的数字键0-9输入密码。密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确后才能设置新密码。新密码输入无误后按确认键使新密码将得到存储,密码修改成功。

2.2 系统方框图

本设计的系统方框图如图1,由以上的方案可以知道本系统主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。其中矩阵键盘用于输入数字密

码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警.

图1 系统方框图

2.3 工作原理

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

其原理图如图2所示:

图2 电路原理图

2.4 键盘输入模块

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

图3 按键图

2.5 显示部分

为了提高密码锁的密码显示效果能力。本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。只有按下键盘上的开启按键后,显示器才处于开启状态。同理只有按下关闭按键后显示器才处于关闭状态。否则显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。当密码输入完成时,按下确认键,如果输入的密码正确的话, LCD子显示“RIGHT”,单片机其中P2.0引角会输出低电平,使三极管T2导通,电磁铁吸合,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“ERROR”,P2.0输出的是高电平,电子密码锁不能被打开。通过LCD显示屏,可以清楚的判断出锁所处的状态。其显示部分引脚接口如图4所示:

图4 显示电路原理图

2.6 电路复位部分

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。地址锁存信号ALE也为高电平。根据实际情况选择如图4-6所示的复位电路。该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C1上的电压

很小,复位下拉电阻RRST上的电压接近电源电压,即RST为高电平,在电容充电的过程

中RST端电压逐渐下降,当RST端的电压小于某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。增加手动复位按键是为了避免死机时无法可靠复位。当复位按键按下后电容C1通过R5放电。当电容C1放电结束后,RST端的电位由R5与R6分压比决定。由于R5

图5 复位电路原理图

2.7 LED显示部分

LED显示部分如图6所示:

图6 LED显示部分

本系统的LED显示部分主要由两个LED组成,其中D1代表开锁信号,当密码两次都正确时,D1会闪亮一下;D2代表密码错误,当三次输入错误时,D2亮,且上锁。

2.8 晶振部分

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

30pF

图7 晶振电路原理图

2.9 开锁部分

开锁控制电路的功能是当输入正确的密码后将锁打开。用户通过键盘任意设置密码,并储存在EEPROM中作为锁码指令。只有用户操作键盘时,单片机的电源端才能得到3V电源,否则.单片机处于节电工作方式。开锁步骤如下:首先按下键盘上的开锁按键,然后利用键盘上的数字键0-9输入密码,最后按下确认键。当用户输入一密码后,单片机自动识码,如果识码不符,则报警。只有当识码正确,完成本次开锁。开锁以后,单片机自动清除掉由用户输人的这个密码。

3 主要元器件介绍

3.1 主控芯片AT89C52

AT89C52是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。

3.1.1 AT89C52性能简介

AT89C52具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

图8 AT89C52芯片引脚图

其主要功能特性:

兼容MCS-51指令系统 4k可反复擦写(>1000次)ISP Flash ROM 32个双向I/O口 4.5-5.5V工作电压 2个16位可编程定时/计数器 时钟频率0-33MHz 全双工UART串行中断口线 128x8 bit内部RAM 2个外部中断源 低功耗空闲和省电模式 中断唤醒省电模式 3级加密位

看门狗(WDT)电路 软件设置空闲和省电功能 灵活的ISP字节和分页编程 双数据寄存器指针

可以看出AT89C52提供以下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,看门狗(WDT),两个数据指针,两个16位定时器/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟。同时, AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式何在RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直接到一个硬件复位。

3.1.2 AT89C52引角功能说明

VCC:电源电压 GND:地

P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口,作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端口。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号校验期间,P1接收低8位地址。表1为P1口第二功能。

表1 P1口第二功能

P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流I。在访问8位地址的外部数据存储器(如执行:MOVX @Ri 指令)时,P2口线上的内(也即特殊功能寄存器,在整个访问期间不改变。Flash 编程或校验时,P2也接收高位地址和其它控制信号。

P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端口时,被外部拉低的P3口将用上拉电阻输出电流I。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,P3口的第二功能如下表2。

表2 P3口的第二功能

RST:复位输入。当振荡工作时,RST引脚出现两个机器周期上高电平将使单片机复位。WDT益出将使该引脚输出高电平,设置SFR AUXR 的 DISRTO 位(地址8EH)可打开或关闭该功能。DISRTO 位缺省为RESET输出高电平打开状态。

ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出的正脉冲信号,因此它可对外输出时钟或用于定时目地,要注意的是:第当访问外部数据存储器时将跳过一个ALE脉冲。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位禁位后,只有一条MOVX 和MOVC指令ALE才会被激活。此外,该引脚伎被微弱拉高,单片机执行外部程序时,应设置ALE无效。

PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,高有两次有效的PSEN信号。

EA/VPP:外部访问允许。欲使CPU公访问外部程序存储器(地址0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程电压Vpp。

XTAL1:振荡器反相放大器及内部时钟发生器的输入端。 XTAL2:振荡器反相放大器的输出端。

3.1.3 AT89C52芯片内部结构

特殊功能寄存器:特殊功能寄存器的片内空间分存如下图3-2所示。这些地址并没有全部占用,没有占用的地址不可使用,读这些地址将得到一个随意的数值。而写这些地址单元将不能得到预期的结果。

中断寄存器:各中断允许控制位于IE寄存器,5个中断源的中断优先级控制位于IP寄存器。

双时钟指针寄存器:为方便地访问内部和外部数据存储器,提供了两个16位数据指针寄存储器:PD0位于SFR区块中的地址82H、83H和DP1位于地址84H、85H,当SFR中的位DPS=0时选择DP0,而DPS=1时选择DP1。在使用前初始化DPS。

电源空闲标志:电源空闲标志(POF)在特殊功能寄存储器SFR中PCON的第4位(PCON.4),电源打开时POF置“1”,它可由软件设置睡眠状态并不为复位所影响。

存储器结构:MCS-51单片机内核采用程序存储器和数据存储器空间分开的结构,均具有64KB

程序存储器:如果EA引脚接地(GND),全部程序均执行外部存储器。在AT89S51,假如接至Vcc(电源+),程序首先执行从地址0000H-0FFFH

(4KB)内部程序存储器,再执行地址为1000H-FFFFH(60KB)的外部程序存储器。

数据存储器:在AT89S51的具有128字节的内部RAM,这128字节可利用直接或间接寻址方式访问,堆栈操作可利用间接寻址方式进行,128字节均可设置为堆栈区空间。

看门狗定时器(WDT):WDT是为了解决CPU程序运行时可能进入混乱或死循环而设置,它由一个14bit计数器和看狗复位SFR(WDTRST)构成。外部复位时,WDT默认为关

闭状态,要打开WDT,必按顺序将01H和0E1H写到WDTRST寄存器,当启动了WDT,它会随晶体振荡器在每个机器周期计数,除硬件复位或WDT溢出复位外没有其它方法关闭WDT,当WDT溢出,将使RST引脚输出高电平的复位脉冲。

3.2 LCD1602显示器

现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。

3.2.1 接口信号说明

1602型LCD的接口信号说明如表3所示:

3.2.2 主要技术参数

1602型LCD的主要技术参数如下表所示:

表4 1602型LCD的主要技术参数

3.2.3 基本操作程序

读状态:输入:RS=L,RW=L, E=H 输出:D0~D7=状态字读数据:输入:RS=H,RW=H, E=H 输出:无

写指令:输入:RS=L,RW=L, D0~D7=指令码,E=高脉冲 输出:D0~D7=数据 写数据:输入:RS=H,RW=L, D0~D7=数据, E=高脉冲 输出:无

4 系统软件设计

本系统软件设计由主程序、初始化程序、LCD显示程序、键盘扫描程序、键功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。主要程序设计流程图如下所示:

图9 主程序流程图

图10 密码设置流程图

图11 开锁流程图

5 调试

调试过程如下:

首先把密码锁接通电源,使之运行程序,从而置入初始密码,其模拟电路图如图12所示,当前状态为初始状态,这时的初始密码根据程序可作为:012345,此时从键盘上依次按下代表0,1,2,3,4,5的按键在按下代表确认的键,当输入密码正确时模拟图如图13所示,再次输入密码后确认开锁,绿灯(D1)亮起,其模拟图如图14所示。若输入密码错误时,其模拟图如图15所示,当三次都输入错误密码后,红灯(D2)亮起,其模拟图如图16所示。

模拟电路图12 (键盘扫描,LCD开)

模拟电路图13 (密码第一次输入正确)

模拟电路图14 (绿灯(D1)亮起,开锁状态)

模拟电路图15 (输入错误密码)

模拟电路图16 (三次输入都错,红灯(D2)亮起,上锁状态)

6 总结

本设计从经济实用的角度出发,采用美国Atmel公司的单片机AT89C52作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁等电路并用汇编编写主控芯片的控制程序,研制了一款可以多次更改密码具有报警功能的电子密码锁。设计完全可行可以达到设计目地。使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可应用于住宅、办公室的保险箱及档案柜等需要防盗的场所,有一定的实用性。该电路设计还具有按键有效提示,输入错误提示,控制开锁电平,控制报警电路,修改密码等多种功能。可在意外泄密的情况下随时修改密码。保密性强,灵活性高,特别适用于家庭、办公室、学生宿舍及宾馆等场所。

7 参考文献

[1] 祖龙起,刘仁杰.一种新型可编程密码锁[J].大连轻工业学院学报,2002. [2] 李瀚荪.电路分析基础[M],北京:高等教育出版社1991.

[3] 童诗白,华成英,模拟电子技术基础[M],北京:高等教育出版社,2000. [4] 王千.实用电子电路大全[M],电子工业出版社,2001,p101.

[5] 何立民.单片机应用技术选编[M],北京:北京航空大学出版社,1998. [6] 李华.MCS-51系列单片机使用接口技术[M],北京航空航天大学出版社,1993. [7] 彭为.单片机典型系统设计实例精讲[M],北京:电子工业出版社,2006. [8] 潘永雄.新编单片机原理与应用[M],西安:西安电子科技大学出版社,2003. [9] 董继成.一种新型安全的单片机密码锁[J].电子技术,2004. [10] 祖龙起,刘仁杰,孙乃凌.一种新颖的电子密码锁[J].电子世界,2001. [11] 李明喜.新型电子密码锁的设计[J].机电产品开发与创新,2004. [12] 杨茂涛.一种电子密码锁的实现[J].福建电脑,2004.

附录

主程序:

#include #define uchar unsigned char #define uint unsigned int

uchar jian[16]={0xe7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb,0x7e,0x7d,0x7b,0x77,0xb7,0xd7}; uchar Users[6]={0,1,2,3,4,5}; //用户密码 uchar Fu_hao=0; //符号输出控制位 uchar U_Interrupt=0; //中断标志位 uchar Txet=0; uchar timer_1=0;

uchar code table4[]="Is exiting !"; uchar code table7[]="input new code"; uchar code table12[]="Time is too long"; sbit lcden=P3^4; sbit lcdrs=P3^5;

sbit Warning=P3^1; //报警指示灯 sbit Lock=P3^0; //开锁指示灯 void Delay(uint z) { uint x,y; for(x=z;x>0;x--)

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

}

void write_com(uchar com) //LCD16002控制指令 { lcdrs=0; P0=com;

Delay(5); lcden=1; Delay(5); lcden=0;

}

void write_data(uchar date) //LCD1602输出指令 { lcdrs=1; P0=date; Delay(5); lcden=1; Delay(5); lcden=0; }

void init() //LCD1602初始化 { lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80);

}

void Xian_shi(uchar b) { uchar i; switch(b) { case 0:{

write_com(0x80+0x4f-Fu_hao); write_data('*');

Fu_hao++;

};break;

case 1:{

for(i=0;i

write_com(0x80+0x40+i);

write_data(' '); //0x20 Delay(2); }

Fu_hao=0;

};break;

}

}

uchar keyscan(void) //一次扫描,有键按下才跳出 {

uchar k,i,j,m,t; while(1) { P1=0xff; i=0xfe;

if(U_Interrupt==1) return 20;

for(j=0;j

{ P1=i; k=P1&0xf0;

if(k!=0xf0)

{

Delay(5); if(k!=0xf0) t=k|(i&0x0f);

{

for(m=0;m

{

k=P1; k=k&0xf0;

} Delay(5); while(k!=0xf0)

{

k=P1; k=k&0xf0;

} return m; //编译键值

}

}

i=(i

}

}

}

void She_zhi(void) { uchar New,Wei,Zhi,bb[6],cc[6],i,k,j;

uchar code table8[]="input new again"; uchar code table9[]="Successfully!"; uchar code table10[]="Input is error!"; uchar code table11[]="put enter again"; New=0; Wei=0; Fu_hao=0; for(k=0;k

}

write_com(1); for(j=0;j

write_data(table7[j]); //清屏显示table7[]="input new code"

while(1) { Zhi=keyscan();

if(Zhi>=0&&Zhi

bb[Wei++]=Zhi; //存输入数值 if(New==1) cc[Wei++]=Zhi; continue;

}

if(Zhi==15) //删除键按下 { Xian_shi(1); //清除*号

Wei=0; //重新存输入数值 Fu_hao=0; continue;

}

if(Zhi==10||Zhi==11||Zhi==12) continue; if(Zhi==14) //直接按下退出键退出 { Txet=0; TR1=0; write_com(1); for(j=0;j

write_data(table4[j]); //显示"Is exiting" Delay(2000); //延迟2s后清屏 write_com(1); Wei=0; //下次重新存数值

Fu_hao=0; //符号位归零,以便下一次输入显示

return;

} if(Zhi==13) //确定键按下

{ New++;

if(New==1) //第一次输入完新密码后,在输入一次 { write_com(1); for(j=0;j

write_data(table8[j]); //清屏显示table8[]="input new again" Wei=0;

Fu_hao=0;

}

continue;

if(New==2) //第二次输入完成,比较两次是否一样 { for(k=0;k=6) //两次输入一样 { write_com(1); for(j=0;j

write_data(table9[j]); //请屏显示table9[]="Successfully!" for(j=0;j

Users[j]=bb[j]; //更改用户密码 Delay(2000);

Txet=0; //更改密码成功,暂停中断,重新计时

TR1=0; write_com(1); for(j=0;j

write_data(table4[j]); //显示"Is exiting" Delay(2000); Wei=0; Fu_hao=0; write_com(1);

return; //跳出循环

}

if(k

write_data(table11[j]);

i=keyscan(); if(i==14) // 退出键按下,跳出循环 { Txet=0; TR1=0; write_com(1); for(j=0;j

write_data(table4[j]); //显示"Is exiting" Delay(2000);

write_com(1);

}

Wei=0; Fu_hao=0; return ;

if(i==13) //确定键按下,继续输入密码 { write_com(1); for(j=0;j

write_data(table7[j]); //清屏显示table7[]="input new code" Wei=0; //重新存键值 Fu_hao=0; //重新输出符号 New=0; continue;

}

}

}

}

}

}

uchar Identify() { uchar Times,Wei,Zhi,aa[6],bb[6],i,j,k; uchar code table1[]="Code is wrong !"; uchar code table3[]="Please input"; uchar code table5[]="Please Wait"; uchar code table6[]="Input again ?"; uchar code table13[]="Warning!"; uchar right=0; if(timer_1==1) TR1=0; else TR1=1; for(k=0;k

}

Times=0; //输入密码错误次数 Wei=0; //已存入了的密码的个数 while(1) { Zhi=keyscan(); if(Zhi==20) //产生了中断信号 {

U_Interrupt=0;

} right=0; return 0; if(Zhi>=0&&Zhi

if(right==0) aa[Wei++]=Zhi; //第一次存输入数值

if(right==1) bb[Wei++]=Zhi; //第二次

continue;

}

if(Zhi==15) //删除键按下

{

Xian_shi(1); //清除*号

Wei=0; //重新存输入数值

continue;

}

if(Zhi==10||Zhi==11||Zhi==12) continue ;

if(Zhi==14) //直接按下退出键退出

{

Txet=0; //暂停中断,下次重新计时

TR1=0;

write_com(1);

for(i=0;i

write_data(table4[i]); //清屏显示"Is exiting!"

Delay(2000); ////延迟1s后清屏

write_com(1);

right=0;

return 0;

}

if(Zhi==13) //确定键按下

{

write_com(1);

for(i=0;i

write_data(table5[i]); //清屏显示"Please Wait

Delay(1000);

if(right==0)

{

for(k=0;k

if(aa[k]!=Users[k]) break;

}

if(right==1)

{

for(k=0;k

} if(bb[k]!=Users[k]) break; if(k

if(Times==3) //输入错误达到三次

{

Txet=0;

TR1=0;

write_com(1);

write_com(0x80+4);

for(i=0;i

write_data(table13[i]); //清屏显示Warning!

write_com(0x80+0x40);

for(i=0;i

write_data(table1[i]); //清屏显示Code is wrong !"

Warning=1; //开报警

timer_1=1;

Delay(2500);

write_com(1);

right=0; //清除跳出前输入密码正确的次数

return 0;

}

if(Times

{

write_com(1);

for(i=0;i

write_data(table1[i]); //清屏显示Code is wrong"

write_com(0x80+0x43);

for(i=0;i

write_data(table6[i]); //清屏显示Input again ?"

j=keyscan();

if(j==20)

{

U_Interrupt=0;

right=0;

return 0;

}

if(j==14) // 退出键按下,跳出循环

{

Txet=0;

TR1=0;

write_com(1);

for(i=0;i

return 0;

}

if(j==13) //确定键按下,继续输入密码

{

write_com(1);

for(i=0;i

write_data(table3[i]); //清屏显示"Please input" Wei=0; //重新存键值

Fu_hao=0; //重新输出符号

continue ;

}

}

}

if(k>=6) //密码正确

{

right++; //密码必须输入两次正确才行

if(right==1)

{

write_com(1);

for(i=0;i

write_data(table6[i]); //请屏显示Input again Wei=0;

Fu_hao=0;

continue ;

}

if(right==2)

{

Txet=0; //密码正确,关暂停中断,重新计时

TR1=0;

right=0;

Wei=0;

Fu_hao=0;

return 1;

}

}

}

}

}

void Change_Code()

{

uchar i,m;

uchar code table2[]="Code is right";

uchar code table3[]="Please input";

write_com(1);

for(i=0;i

write_data(table3[i]); //清屏显示table3[]="Please input" m=Identify(); // 检测密码是否正确

if(m==0) return;

if(m==1)

{

write_com(1);

for(i=0;i

write_data(table2[i]); //清屏显示table2[]="Code is right" Warning=0;

timer_1=0;

Delay(1000);

She_zhi();

}

}

void Users_Code()

{

uchar m,j;

uchar code table2[]="Code is right";

uchar code table3[]="Please input";

write_com(1); // 显示数据清零,指针清零

for(j=0;j

write_data(table3[j]); //显示"Please input"

m=Identify(); //检测输入密码

if(m==0) return; //密码错误

if(m==1) //密码正确

{

write_com(1);

for(j=0;j

write_data(table2[j]); //显示"Code is right"

Warning=0; //关报警

timer_1=0;

Lock=1; //开锁

Delay(3000); //5s后自动关指示灯

Lock=0;

write_com(1);

}

}

void main()

{

uchar key=0;

init();

Warning=0;

timer_1=0;

Lock=0;

TMOD=0x10; // T1方式1(16位

TH1=(65535-50000)/256;//50ms

TL1=(65535-50000)%256;

EA=1; //开CPU中断

ET1=1; //开T0,T1中断

TR1=0; //暂停中断

while(1)

{

key=keyscan();

if(key==11) Change_Code(); //设置键按下

if(key==12) Users_Code(); //开锁键按下,进入用户模式 }

}

timer1() interrupt 3 using 2

{

uchar j;

Txet++; //50ms自加

if(Txet==400) //30s时间到

{

write_com(1);

for(j=0;j

write_data(table12[j]); //显示"Time is too long"

Warning=1; //超时报警

timer_1=1;

TR1=0; //停止中断

Txet=0;

U_Interrupt=1;

Delay(2000);

write_com(1);

}

TH1=(65535-50000)/256; //重装计数初值

TL1=(65535-50000)%256;

}


相关文章

  • 单片机课程设计报告--电子密码锁
  • 电子密码锁 一. 课题概述 在日常生活和工作中,住宅与部门的安全防范.单位的文件档案.财务报表以及一些个人资料的保存多以加锁的办法来解决.若使用机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安在日常生活和工作中,住宅与部门的安全防范.单位的文件档案.财务报表以及一些个人资料的保存多 ...

  • 单片机课程设计-密码锁
  • 1 设计课题任务.功能要求说明及总体方案介绍 1.1 设计课题任务 设计一个具有特定功能的密码锁.该密码锁上电或按键复位后能自动显示系统提示符"P.", 进入准备工作状态.该密码锁具有系统原始密码888888,用户可以设定并存储用户密码,密码输入时应处于保密显示状态,密码输入正确 ...

  • 8位密码锁单片机课程设计
  • 单片机原理及系统课程设计 专 业: 自 动 化 班 级: 自动化 姓 名: 学 号: 指导教师: 2012 年 7月 1日 1 引言 电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁.闭锁任务的电子产品.它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产 ...

  • 智能密码锁设计
  • 第一章 概述 随着人们的生活水平的提高以及安全意识的加强,对安全的要求也就越来越高.自古以来,锁就是把守护门的铁将军,人们对它的要求甚高,既要安全可靠,又要使用方便,这也是制锁者长期以来研制的主题.随着单片机技术的发展,各类电子产品应运而生,智能密码锁就是其中之一.智能密码锁的研制,在20世纪30年 ...

  • 51单片机简易密码锁
  • 学 号: 单片机课程设计说明书 设计题目:简易电子密码锁 成绩评定表 摘 要 在日常的生活和工作中, 住宅与部门的安全防范.单位的文件档案.财务报表以及一些个人资料的保存多以加锁的办法来解决.若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣.随着科学技 ...

  • [通讯设备安装调试]实习报告
  • 课 程 设 计 课 程 题 目 专 业 班 级 学 号 姓 名 指导老师 2013年6月21号 目录 一.课题名称·······································3 二.实践目的·······································3 三.实践原 ...

  • 电子类毕业设计
  • 电子通讯] 出租车计价系统 [过程控制] 基于单片机实现单回路智能调节.. [电子通讯] 脉冲数字频率计 [机床仪表] 仪表机床数控系统的设计(论文.. 磁流体发电论文 [电子通讯] 基于VC++6.0的PC机与单片机串行.. [电子通信] 通信毕业翻译(移动通信技术的.. [电子] 利用单片机制作 ...

  • 自动化毕业设计论文题目
  • 自动化专业 毕 业 设 计 论 文 题 目 目 录 第1-100个自动化毕业设计论文题目 ..................................................................................................... 3 第 ...

  • 电子遥控防盗密码锁的设计方案
  • 电子遥控防盗密码锁帕设计方案 汕头市无线电一厂 郑小东 [摘要]随着人们生活水平的提高和安全意识的加强,各种各样的密码锁广泛进入了人们的生活和工作.当前市场上的密码锁有以下几种形式:机械式.电子式.磁卡式.智能Ic卡式.指纹式等,电子式的密码锁市场占有量最大,因为它的成本相对较低,安全性高,操 作简 ...

© 2024 范文中心 | 联系我们 webmaster# onjobs.com.cn