单片机密码锁设计毕业论文
XXX大学
基于单片机的电子密码锁设计
姓 名: ---
班 级: ---
学 号:---
指导教师: ---
2015年3月10日
摘 要
随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,安全性能低,无法满足人们的需要。因此通过电子控制的密码锁应运而生,同时电子产品向智能化和微型化的不断发展,单片机成为电子产品研制和开发中首选的控制器。
本文从经济实用的角度出发,采用美国Atmel公司的单片机AT89S52与低功耗CMOS型E2PROM AT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁等电路,用C语言编写主控芯片的控制程序,设计了一款可以多次更改密码具有报警功能的电子密码锁。
经实验证明,该密码锁具有设计方法合理,简单易行,成本低,安全实用等特点,符合住宅、办公室用锁要求,具有推广价值。
关键词:
密码锁;单片机;报警
目 录
一、引言 .................................................................. 3
1.1 电子密码锁简介 ..................................... 3
1.2、电子密码锁的发展趋势 ............................... 3
二、设计方案的选择 ................................................... 4
2.1 方案一:采用数字电路控制 ........................... 4
2.2 方案二:采用以单片机为核心的控制方案 ............... 4
三、 系统构成 .......................................................... 5
3.1 设计原理 ........................................... 5
3.2 电路总体构成 ....................................... 6
3.3 单片机电路部分 ..................................... 7
3.4 键盘输入部分 ....................................... 7
3.5 密码存储部分 ....................................... 8
3.7 晶振部分 .......................................... 10
3.8 显示部分 .......................................... 11
3.9 报警部分 .......................................... 12
3.10 开锁部分 ......................................... 13
四、 主要元器件介绍 ............................... 14
五、 系统软件设计 ................................. 18
六、 结论 ......................................... 37
七、参考文献及附录实物图 .......................... 37
一、引言
1.1 电子密码锁简介
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁。其特点如下:
1) 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。
2) 密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。
3) 误码输入保护,当输入密码多次错误时,报警系统自动启动。
4) 使用灵活性好,不像机械锁必须佩带钥匙才能开锁。
5) 电子密码锁操作简单易行,一学即会。
1.2、电子密码锁的发展趋势
在日常生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。目前门锁主要用弹子锁,其钥匙容易丢失;保险箱主要用机械密码锁,其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。针对这些锁具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。它的出现为人们的生活带来了很大的方便,有很广阔的市场前景。由于电子器件所限,以前开发的电子密码锁,其种类不多,保密性差,最基本的就是只依靠最简单的模拟电子开关来实现的,制作简单但很不安全,在后为多是基于EDA来实现的,其电路结构复杂,电子元件繁多,也有使用早先的20引脚的2051系列单片机来实现的,但密码简单,易破解。随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了真实的电子加密,用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码锁。
1.3、本设计所要实现的目标
本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错
误三次将报警。密码可以由用户自己修改设定,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
二、设计方案的选择
2.1 方案一:采用数字电路控制
用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过10秒(一般情况下,用户不会超过10秒,若用户觉得不便,还可以修改)电路将报警20秒,若电路连续报警三次,电路将锁定键盘2分钟,防止他人的非法操作。采用数字电路设计的方案好处就是设计简单但控制的准确性和灵活性差。故不采用
2.2 方案二:采用以单片机为核心的控制方案
由于单片机种类繁多,各种型号都有其一定的应用环境,因此在选用时要多加比较,合理选择,以期获得最佳的性价比。一般来说在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最数器基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持和服务等等因素。
2.3 最终方案
基于以上因素:本设计选用单片机AT89S52作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路:外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。
当用户需要开锁时,先按键盘的数字键0-9输入密码。密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确后才能设置新密码。新密码输入无误后按确认键使新密码将得到存储,密码修改成功。
三、 系统构成
3.1 设计原理
设计原理:系统由硬件部分与软件部分两部分构成。其中硬件部分由单片机、电源输入部分、键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成,软件部分对应的由主程序、初始化程序、LCD显示程序、键盘扫描程序、启动程序、关闭程序、建功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。其原理框图如图4-1所示。
图3-1 电子密码锁原理框图
3.2 电路总体构成
根据系统要求画出的设计图总图-如图3-2:
图3-2 电电路原理图
电路由单片机、矩阵键盘、1602液晶显示和24c02密码存储等部分组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与24c02保存的密码进行对比,从而判断密码是否正确,然后控制单片机各引脚的高低电平从而传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。
3.3 单片机电路部分
本次设计采用AT89S52芯片,AT89S52是一个低电压,高性能CMOS 8位单片机,通过用keil软件编写程序,然后烧到单片机里面去,然后让它对整个系统进行信息的处理,如可以让它处理矩阵键盘传过来的信息,并根据编好的程序来确定哪个按键按下,并处理相应按键对应的功能,然后把相应的信息反应到单片机的各个引脚,来实现按键实现的现象,如:显示是否开启锁,报警等。它的电路如图3-3所示:
图3-3 单片机电路
3.4 键盘输入部分
由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。本设计中使用的这个4*4键盘不但能完成密码的输入还
能作特别功能键使用,比如修改密码功能等。键盘的每个按键功能在程序设计中已经编写好。其大体功能(看键盘按键上的标记)及与单片机引脚接法如图3-4所示:
图3-4 键盘输入原理图
矩阵键盘采用“行列”扫描法,行扫描法又称逐行扫描查询法,是一种最常用的按键扫描方法,如上图所示,开始时把行线P2.0-P2.3置为低电平,然后扫描列线,如果有一行列线为低电平,则去抖后判断是否还有一行列线为低电平,如果还有,则这条列线为低电平,同时处在这条行线中的按键为低电平,然后判断是哪个按键按下,如果列线全部为高电平,则表示没有按键按下,往复循环扫描。
3.5 密码存储部分
用EPROM芯片AT24C02存储密码。AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,通过单片机对24c02芯片进行密码存储,存储好密码后,通过按键输入密码与存储芯片里面的数据进行对比,根据数据是否一致,来执行相应的操作,还可以根据按键操作来执行是否更换数据。电路连接图如图3-5所示:
图3-5 密码存储电路原理图
图中AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。它们都接地,第8脚和第4脚分别为正、负电源。第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,与单片机的P3.3连接。第6脚SCL为串行时钟输入线,与单片机的P3.4连接。第7脚需要接地。
3.6 复位部位
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。地址锁存信号ALE也为高电平。根据实际情况选择如图3-6所示的复位电路。
图3-6 复位电路原理图
3.7 晶振部分
AT89S52引脚XTAL1和XTAL2与晶体振荡器及电容C5、C6按图3-7所示方式连接。晶振、电容C5/C6及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C5、C6的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C5、C6取值范围在5~30pF之间。根据实际情况,本设计中采用12MHZ做为系统的外部晶振。电容取值为30pF。如图3-7所示:
3-7 晶振电路
3.8 显示部分
为了提高密码锁的密码显示效果能力。本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。开始时显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,最多显示6位。当密码输入完成时,按下确认键,如果输入的密码正确的话, LCD子显示“Right Open”,单片机其中P1.3引角会输出低电平,使三极管导通,电磁铁吸合,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“Error Retry”,P1.3输出的是高电平,电子密码锁不能被打开。通过LCD显示屏,可以清楚的判断出锁所处的状态。其显示部分引脚接口如图4-8所示:
图3-8 显示电路原理图
3.9 报警部分
报警部分由蜂鸣器及外围电路组成,加电后不发声,当密码输入错误三次时,单片机的P1.4引脚为低电平,三极管导通执行蜂鸣器警车声子程序发出警笛报警。如图3-9所示:
图3-9 报警电路原理图
3.10 开锁部分
开锁用户通过键盘任意设置密码,并储存在EEPROM中作为锁码指令。开锁步骤如下:首先按下键盘数字键0-9输入密码,最后按下确认键。当用户输入一密码后,单片机自动识码,如果识码不符,则提示重新输入,如果超过三次则报警。如果正确,系统使单片机其中一引脚线发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开,实物中用led代替继电器。
图3-10 开锁电路原理图
四、 主要元器件介绍
4.1 主控芯片AT89S52
4.1.1 AT89S52性能简介
AT89S52为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
如图4-1
4-1图 单片机引脚
其主要功能特性: 兼容MCS-51指令系统;4k可反复擦写(>1000次)ISP Flash
I/O口; 4.5-5.5V工作电压;2个16位可编程定时/计数器时钟频率0-33MHz
全双工UART串行中断口线 128x8 bit内部RAM
2个外部中断源 低功耗空闲和省电模式
中断唤醒省电模式 3级加密位
看门狗(WDT)电路 软件设置空闲和省电功能
灵活的ISP字节和分页编程 双数据寄存器指针
4.2 存储芯片AT24C02
个双向 ;ROM32
AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5 V)、擦写次数多(大于10000次)、写入速度快(小于10 ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且他是采用了I2C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。AT24C02中带有的片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。I2C总线是一种用于IC器件之间连接的二线制总线。他通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。 AT24C02正是运用了I2C规程,使用主/从机双向通信,主机(通常为单片机)和从机(AT24C02)均可工作于接收器和发送器状态。主机产生串行时钟信号(通过SCL引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。AT24C02的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向。
SOIC PDIP
图4-2 AT24C02的两种引脚图
24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。
4.3 LCD1602显示器
现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示
模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
4.3.1 接口信号说明
1602型LCD的接口信号说明如表4-3所示:
表4-3 1602型LCD的接口信号说明
4.3.2 主要技术参数
1602型LCD的主要技术参数如下表所示:
表4-4 1602型LCD的主要技术参数
4.3.3 基本操作程序
读状态:输入:RS=L,RW=L, E=H
读数据:输入:RS=H,RW=H, E=H 输出:D0~D7=状态字 输出:无
写指令:输入:RS=L,RW=L, D0~D7=指令码,E=高脉冲 输出:D0~D7=数据
写数据:输入:RS=H,RW=L, D0~D7=数据, E=高脉冲 输出:无
4.4 晶体振荡器
石英晶体振荡器是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器,简称为石英晶体或晶体、晶振。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的。只要在晶体振子板极上施加交变电压,就会使晶片产生机械变形振动,此现象即所谓逆压电效应。当外加电压频率等于晶体谐振器的固有频率时,就会发生压电谐振,从而导致机械变形的振幅突然增大。晶体振荡器,简称晶振,其作用在于产生原始的时钟频率,这个频率经过频率发生器的放大或缩小后就成了电脑中各种不同的总线频率。以声卡为例,要实现对模拟信号44.1kHz或48kHz的采样,频率发生器就必须提供一个44.1kHz或48kHz的时钟频率。如果需要对这两种音频同时支持的话,声卡就需要有两颗晶振。但是现在的娱乐级声卡为了降低成本,通常都采用SCR将输出的采样频率固定在48kHz,但是SRC会对音质带来损害,而且现在的娱乐级声卡都没有很好地解决这个问题。现在应用最广泛的是石英晶体振荡器。
石英晶体振荡器是一种高精度和高稳定度的振荡器,石英晶体振荡器也称石英晶体谐振器,它用来稳定频率和选择频率,是一种可以取代LC谐振回路的晶体谐振元件。石英晶体振荡器广泛地应用在电视机、影碟机、录像机、无线通讯设备、电子钟表、单片机、数字仪器仪表等电子设备中。为数据处理设备产生时钟信号和为特定系统提供基准信号。在单片机中为其提供时钟频率。
五、 系统软件设计
本系统软件设计由主程序、初始化程序、LCD显示程序程序、键盘扫描程序、输入密码开锁程序、密码修改程序、EEPROM读写程序和延时程序等组成。主要程序设计流程图如下所示:
1、先执行初始化程序,然后启动程序,执行键盘扫描程序,根据各个功能键执行相应的功能。
图5-1 主程序流程图
图5-2 输入密码开锁流程图
图5-3 修改密码流程图
程序清单:
//1.初始密码123456,输入密码时显示******,有按键音.
//2 密码通过键盘输入0-9数字,当输入第6个密码,系统自动验证密码,若密码正确,则将锁打开。 //3.密码错误,返回输入密码界面,连续错误3次,键盘锁定,蜂鸣器报警。 //4.密码输入正确后,进入选择修改密码画面.
//5.新密码需要输入两次密码,两次新密码一致修改成功,否则不能修改。 //6.新密码修改成功后存入存储器,即使掉电密码也保存。 //
//开机画面1
//" Welcome ! " //" "
//输入密码画面 //" Input code " //" ***** "
//输入密码正确画面 //" Input code " //" Unlock OK! "
//输入密码错误画面 //" Input code " //" ERROR ! "
//修改密码选择画面 //"Change K10" //"Exit K11"
//第一次输入新密码 //" New code 1 "
//" ********* "
//第二次输入新密码 //" New code 2 " //" ********* "
//两次新密码一致,修改密码成功画面 //" OK! " //"Password Saved! "
//两次新密码不一致,修改密码失败画面 //"No rights ! " //" "
#include #include #include
#define uint unsigned int #define uchar unsigned char //--------------------------------- sbit BEEP=P3^5; //蜂鸣器
sbit JDQ=P3^6;
//继电器 模拟开锁
//--------------------------------- //P1.0-1.7---D0.0-D0.7 sbit rs = P3^0; //1602液晶 sbit wela = P3^1;
//1602液晶 sbit lcden = P3^2;
//1602液晶 //--------------------------------- #define C02_write 0xa0 //写 #define C02_read 0xa1 //读 sbit SCL=P3^4; //时钟 sbit SDA_EEPROM=P3^3; //数据
bit ack; bit dd;
//--------------------------------- //4*4 key - P1 //
//--------------------------------- uchar IIC_Password[16]=""; //IIC密码 uchar DSY_BUFFER[16]=""; //显示缓冲 uchar UserPassword[16]=""; //使用者密码 uchar TwoPassword[16]=""; //使用者密码 uchar OnePassword[16]=""; //使用者密码
uchar KeyNo =16;
//---------------1602-------------------------------------- void delayms(uint z) //延时N ms { }
void write_com(uchar com) //1602液晶写指令 { }
void write_date(uchar date) //1602液晶写数据 { }
void init_lcd(void) //初始化液晶,及画面初始化 {
// uchar num; wela=0; lcden=0;
rs=1; lcden=0; P1=date; delayms(1); lcden=1; delayms(2); lcden=0; rs=0; lcden=0; P1=com; delayms(1); lcden=1; delayms(2); lcden=0; uint x,y; for(x=z;x>0;x--) for(y=120;y>0;y--);
}
write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80);
//指定x,y写入字符串函数
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {
if (y == 0){write_com(0x80 + x);} //第一行 else{write_com(0xC0 + x);} //第二行 while (*s) // }
//-------------1602---------------------------------------- //蜂鸣器子程序 void Beep() { }
////////////////////2402/////////////////////////////////// //--------------------------------------------------------- void delay_ms(uchar i) { }
void I2C_start(void) { SDA_EEPROM=1; SCL=1; _nop_();
uchar j; for(;i>0;i--) for(j=124;j>0;j--); uchar i;
for(i=0;i
BEEP=1; //关蜂鸣器
delayms(2);BEEP=~BEEP;
{write_date( *s); s++;} //写入数据
_nop_(); _nop_(); _nop_(); _nop_(); SDA_EEPROM=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_();
}
void I2C_stop(void) { SDA_EEPROM=0; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA_EEPROM=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_();
}
void I2C_ackownledge(void) { SDA_EEPROM=0; _nop_(); _nop_(); SCL=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_();
}
void I2C_no_ackownledge(void) { SDA_EEPROM=1; _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_();
}
void I2C_sendB(uchar byte) { uchar counter;
for(counter=0;counter
_nop_();
_nop_(); SCL=0; _nop_(); _nop_(); byte
}
_nop_(); _nop_(); SDA_EEPROM=1; _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_();
if(SDA_EEPROM==0) ack=1; else ack=0;
SCL=0; _nop_(); _nop_(); }
uchar I2C_receiveB(void)
{ uchar temp; uchar counter; temp=0; SDA_EEPROM=1; _nop_(); _nop_();
for(counter=0;counter
_nop_();
if(SDA_EEPROM==1) temp=(temp
temp=temp
_nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_();
}
_nop_(); _nop_(); return(temp);
}
/*bit I2C_write_byte(uchar byte,uchar address) { I2C_sendB(address); if(ack=0) { I2C_stop(); return(0);
}
else I2C_sendB(byte); */
//存UserPassword
bit I2C_send_string(uchar no,uchar address) { uchar counter;
for(counter=0;counter
I2C_sendB(C02_write); if(ack==0) return(0); I2C_sendB(address+counter); if(ack==0) return(0);
I2C_sendB(UserPassword[counter]); I2C_stop(); delay_ms(20);
}
return(1);
}
//读EEPROMPassword
bit I2C_receive_string(uchar no,uchar address) { }
//----------------------------------------------------------- ////////////////////2402//////////////////////////////////////////// /*bit strcmp_key(uchar *string1,uchar *string2) { } */
//-----------------------------------------------------
//////////////////////////////////////////////////////////////////////
uchar Keys_Scan() { uchar Tmp,KeyNO=0; P2 = 0x0f; delayms(1); Tmp = P2 ^ 0x0f; switch(Tmp)
uchar counter;
for(counter=0;counter
return (1);
if(string1[counter]!=string2[counter]) return(0); uchar counter;
for(counter=0;counter
I2C_start();
I2C_sendB(C02_write); if(ack==0) return(0); I2C_sendB(address+counter); if(ack==0) return(0); I2C_start(); I2C_sendB(C02_read); if(ack==0) return(0); I2C_no_ackownledge(); I2C_stop();
IIC_Password[counter]=I2C_receiveB();
}
{ }
P2 = 0xf0; delayms(1);
Tmp = P2 >> 4 ^ 0x0f; switch(Tmp) { }
Beep();//按键音 return KeyNO;
case 1: KeyNO += 0; break; case 2: KeyNO += 4; break; case 4: KeyNO += 8; break; case 8: KeyNO += 12; case 1: KeyNO = 0; break; case 2: KeyNO = 1; break; case 4: KeyNO = 2; break; case 8: KeyNO = 3; break; default: KeyNO = 16;
//--------------key---------------------------------------
void main() {
BEEP=1; JDQ=1;
init_lcd();
//关蜂鸣器
//关锁 //初始化1602
uchar i=0; uchar error5=0;
//密码错误5次锁键盘.
//开机模式选择
uchar mode=0;
while(1) { if(mode==0) {
LCD_Write_String(0,0," Welcome ! "); //显示 Welcome ! LCD_Write_String(0,1," "); //显示
delayms(2000); EA=0;
//延时2秒
LCD_Write_String(0,0," Input code ");//显示 Input Code
}
I2C_receive_string(6,0); EA=1;
//读取24C02内部密码
mode=1; //去mode1
//////////////////////////////mode1密码输入和验证/////////////////////////////// //该模式为密码输入模式
//进入后显示Input code 输入密码后第二行显示 ****** //输入6个密码后,系统自动验证密码 //验证正确显示Unlock OK! 开锁
//验证错误显示 ERROR ! 然后再次输入密码,5次后锁键盘,报警 if(mode==1) {
KeyNo=16; //清零为键盘扫描做准备 i=0; {
//输入密码次数计数
while(1) P2 = 0xF0;
if(P2 != 0xF0) KeyNo = Keys_Scan(); //扫描键盘获取键序号KeyNo
switch ( KeyNo )
{ case 0: case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8: case 9: //当4*4键盘输入0123456789这几个数字时执行以下选择
if ( i
UserPassword[i] = KeyNo + '0'; //用户输入的密码UserPassword[0]-UserPassword[5]共6个
UserPassword[i+1] = '\0';
DSY_BUFFER[i] = '*'; //1602上显示***** DSY_BUFFER[i+1] = '\0';
LCD_Write_String(0,1,DSY_BUFFER); //1602上显示*****
// LCD_Write_String(8,1,UserPassword); i++; } break; }//switch
//如果i为0则执行一次清屏
if (i ==0) LCD_Write_String(0,1," "); //当i=0时显示空白
//密码限制在6位以内
if(i==6)
OK!
//输入6个后系统自动进行密码验证
{if(strcmp(UserPassword,IIC_Password) == 0)
{JDQ
=
//密码验证
0;error5=0;mode=2;LCD_Write_String(0,1,"
Unlock
");delayms(2000);break;}//密码正确,显示OK mode=2,
else{JDQ = 1;error5++;LCD_Write_String(0,1," ERROR ! "); //密码 i=0;delayms(2000);LCD_Write_String(0,0,"
Input
code
");
错误,显示错误
LCD_Write_String(0,1," ");}//第一排显示 Input code 第二排显示空白
} //if(i==6)
if(error5>2){LCD_Write_String(0,1," ERROR ! "); while(1){delayms(100); Beep();};}
P2= 0xF0;
while (P2 != 0xF0); //如果有键未释放则等待
while (P2 == 0xF0); //如果没有再次按下按键则等待 }
//////////////////////////////mode1软密码///////////////////////////////////////// //////////////////////////////mode2密码验证///////////////////////////////////// //输入密码正确后选择修改密码还是退出 //若选择修改密码 进入mode3
//若选择退出,关锁 则进入模式mode1 if(mode==2) {
delayms(1000); //延时1秒 LCD_Write_String(0,0,"Change K10"); //修改软密码 LCD_Write_String(0,1,"Exit K11"); //修改硬密码 KeyNo=16; while(1) { P2 = 0xF0;
if(P2 != 0xF0) KeyNo = Keys_Scan(); //扫描键盘获取键序号KeyNo
if(KeyNo==10){KeyNo=16;mode=3;delayms(500);break;}; //到mode=3 延时0.5秒 软密码//读 if(KeyNo==11){KeyNo=16;mode=0;delayms(500);JDQ=1;break;}; //到mode=0,继电器关,延时0.5秒
//清零为键盘扫描做准备 //循环需选择后退出
i=0; //输入密码次数计数 }//while(1)
// 错误3次,键盘锁,蜂鸣器响
EEPROMPassword 退出mode3
}
P2= 0xF0;//按键音
while (P2 != 0xF0); //如果有键未释放则等待 while (P2 == 0xF0); //如果没有再次按下按键则等待 }
//////////////////////////////mode2密码验证///////////////////////////////////// ///////////////////////////////mode3改软密码//////////////////////////////////////// //输入新密码需要输入2次密码
//两次输入密码正确修改密码成功 数据存入24c02 显示 OK! Password Saved! 然后进入mode=1; //两次新密码输入不一样,不能修改密码 显示 No rights ! 返回到mode1 if(mode==3) {
while(1) {
P2 = 0xF0;
if(P2 != 0xF0) KeyNo = Keys_Scan();
switch ( KeyNo )
{ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: 行以下选择
if ( i
OnePassword[i] = KeyNo + '0'; //用户第一次输入的密码 OnePassword[i+1] = '\0';
DSY_BUFFER[i] = '*'; DSY_BUFFER[i+1] = '\0'; }
LCD_Write_String(0,1,DSY_BUFFER);
// 显示***
i++;
// 显示***用
//密码限制在6位以内
//如果i为0则执行一次清屏
//当4*4键盘输入0123456789这几个数字时执
//扫描键盘获取键序号KeyNo
delayms(500);
//延时0.5S
LCD_Write_String(0,0," New code 1 "); //显示New Soft code 1 LCD_Write_String(0,1," "); //显示空白 KeyNo=16;
//清零为键盘扫描做准备
i=0; //输入密码次数计数
if (i ==0) LCD_Write_String(0,1," "); //显示空白
break;
}//switch
//输入6个后退出 //如果有键未释放则等待
P2= 0xF0;//按键音 if(i==6){break;}
while (P2 != 0xF0); while (P2 == 0xF0);
} //while(1) delayms(1000); //1s
LCD_Write_String(0,0," New code 2 "); //显示New Soft code 2 LCD_Write_String(0,1," "); //界面 KeyNo=16; i=0;
//清零为键盘扫描做准备 //输入密码次数计数
while(1) {
P2 = 0xF0;
if(P2 != 0xF0) KeyNo = Keys_Scan(); //扫描键盘获取键序号KeyNo
switch ( KeyNo )
{ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: if ( i
TwoPassword[i] = KeyNo + '0'; //用户第二次输入的密码 TwoPassword[i+1] = '\0';
DSY_BUFFER[i] = '*'; DSY_BUFFER[i+1] = '\0'; } break;
}//switch
LCD_Write_String(0,1,DSY_BUFFER);
//显示字符
i++;
//
//当4*4键盘输入0123456789这几个数字//密码限制在6位以内
//如果i为0则执行一次清屏
时执行以下选择
if (i ==0) LCD_Write_String(0,1," ");
if(i==6){ if (strcmp(OnePassword,TwoPassword) == 0) //输入6个后系统自动进行密码验证
{ for(i=0;i
//验证两次输
入的密码是否正确
EA=0;I2C_send_string(6,0);EA=1; //密码正确 存入
24c02
LCD_Write_String(0,0," OK! "); LCD_Write_String(0,1,"Password Saved! ");
//
//
//显示OK! 显
示
Password Saved! delayms(2000); //延时2秒
i=0; mode=0;
JDQ = 1;//继电器关
break;//延时2S
} else
{ i = 0;
LCD_Write_String(0,0,"No rights ! ");//显示No rights ! LCD_Write_String(0,1," ");//显示空白 delayms(1000); //延时1秒 mode=0; // mode=1
JDQ = 1;
//继电器关
break;
// mode=1
}
}
if(mode!=3){mode=0;break;}
//退出该模式 去mode1
P2= 0xF0;
while (P2 != 0xF0);
//如果有键未释放则等待
while (P2 == 0xF0);
}//while }//for(mode==3)
//////////////////////////////mode4改软密码/////////////////////////////////////// } }
六、 结论
本设计从经济实用的角度出发,采用美国Atmel公司的单片机AT89S52与低功耗CMOS型E2PROM AT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁等电路并用C语言编写主控芯片的控制程序,研制了一款可以多次更改密码具有报警功能的电子密码锁。设计完全可行可以达到设计目地。使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可应用于住宅、办公室的保险箱及档案柜等需要防盗的场所,有一定的实用性。该电路设计还具有按键有效提示,输入错误提示,控制开锁电平,控制报警电路,修改密码等多种功能。可在意外泄密的情况下随时修改密码。保密性强,灵活性高,特别适用于家庭、办公室、学生宿舍及宾馆等场所。
七、参考文献:
[1] 石文轩,宋薇.基于单片机MCS一1的智能密码锁设计[M].武汉工程职业技术学院学报,2004,(01); [2] 祖龙起,刘仁杰.,2005,(10);
[4] 郭海英.基于单片机的电子安全密码锁的设计[M].现代电子技术,2005,(13); [5] 李明喜.新型电子密码锁的设计[J].[6] 董继成.一种新型安全的单片机密码锁[J].电子技术,2004,(03);
[7] 祖龙起,刘仁杰,孙乃凌.一种新颖的电一种新型可编程密码锁[J].大连轻工业学院学报,2002,(01); [8] 李明喜.新型电子密码锁的设计[J].机电产品开发与创新,2004,(03); [9] 杨茂涛.一种电子密码锁的实现[J].福建电脑,2004,(08); [10] 瞿贵荣.实用电子密码锁[J].家庭电子,2000,(07); [11] ATmega.ATmega8L-8AC,2006,(01);
[12] Wireless World,1998,vol、84,No、1509,p69;
[13] 王千.实用电子电路大全[M],电子工业出版社,2001,p101;
附录1:
(2) 实物图1 整体图
河南工业职业技术学院
总 结
随着毕业日子的逼近,毕业设计也接近了尾声。在指导老师XX的悉心指导下,我终于顺利的完成了毕业设计。以前觉得毕业设计只是对这几年来所学知识的单纯总结,但是通过这次的毕业设计发现自己的看法有点太片面。毕业设计不仅是对前面所学知识的一种检验,而且是对自己能力的一种提高。通过这次毕业设计,我明白了自己所学的知识还是比较欠缺的。要学习的东西还很多,以前老是觉得什么东西都会什么东西都懂,有点眼高手低。通过这次毕业设计,我才明白了学习是一个长期累积的过程,在以后的工作中生活中,都应该不断的学习,努力提高自己的知识和综合素质。注重理论和实践的结合。在整个设计中我更加了解到了什么是毕业论文,毕业论文就是高等院校毕业生提交的一份有一定的学术价值的文章。它是大学生完成学业的标志性作业,是对学习成果的综合性总结和检阅。是大学生从事科研的最初尝试,是在指导教师的指导下所取得的科研成果文字记录,也是检验学生掌握知识的程度、分析和解决问题的基本能力的一份综合答卷。
对于这次的毕业设计,总的来说还是比较成功的,硬件部分基本完成。这次设计的难点是软件的实现,软件部分的密码输入和密码比较式最困难的,经过本人坚持不懈的努力和其他人的帮助最后终于完成了。在硬件部分由于MCS-51系列单片机具有良好的通用性,兼容性强等特点,本设计中所用的芯片还可以用同类的其他芯片代替,这样使得密码锁的设计更加灵活。单片机的指令简单易学,因此开发周期可以很短。由于时间有限和本人知识水平的有限发挥,本系统可以改进的地方还很多,在第5章已经详细介绍过了。
在这次的毕业设计中,同学之间互相帮助,遇到问题大家一起讨论,发现我们所学的知识实在是有限,不过我们能够充分利用网络的优势去查阅资料。设计过程中懂得了很多东西,也培养了我们独立思考和设计的能力,也树立了我们对知识应用的信心,使自己充分体会到了在设计过程中的成功喜悦。
河南工业职业技术学院
致 谢
在论文完成之际,我要忠心的感谢身边给予过我莫大帮助的老师、同学和朋友,致以他们最诚挚的谢意。
本研究及学位论文是在我的导师XX的亲切关怀和悉心指导下完成的。她严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,崔老师都始终给予我细心的指导和不懈的支持。崔老师多次询问研究进程,并为我指点迷津,帮助我开拓研究思路,精心点拨、热忱鼓励,这让我在整个论文的撰写过程中学习到了很多关于课题研究方面的知识。
真诚的感谢参加论文评审和答辩的各位老师,感谢你们的辛勤劳动和即将从你们那里获得的有益教诲;感谢学长和同学们在设计中给予的指导和帮助。衷心感谢通信学院XX学长,在设计过程中他多次帮助我解决问题。多亏了XX学长的开导和帮助,这次的设计才得以顺利完成。
在这四年的学期中结识的各位生活和学习上的挚友让我得到了人生最大的一笔财富。在此,也对他们表示衷心感谢。
本文参考了大量的文献资料,在此,向各学术界的前辈们致敬。最后要感谢的是我的父母和家人,感谢他们多年来对我默默的支持和帮助。由衷的希望在未来的日子里,周围的老师、同学和朋友们一如既往的在各方面继续给予我更多的指教和帮助,以期取得新的进步和成绩来回报大家。
2