基于51单片机的简易电子密码锁

合集下载

简易电子密码锁(基于51单片机)报告

简易电子密码锁(基于51单片机)报告

简易电子密码锁设计&我的设计思想联想到日前在安全技术防范领域,具有防盗报警功能的电子密码控制系统逐渐代替传统的机械式密码控制系统,并结合近期的学习过程和一些参考书籍,完成了简易的电子密码锁设计学习。

电子密码控制是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

电子密码控制不论性能还是安全性都已大大超过了机械类结,具有良好的应用前景。

一、设计目的与内容设计了一个简易电子密码锁,可按要求从矩阵键盘输入6位数密码如“080874”,输入过程中有按键音提示。

当密码输入正确并按下确认键(“OK”键)后,发光二极管被点亮。

二、工作原理与基本操作过程介绍采用80C51为核心的单片机控制。

利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,进行电子密码锁的设计。

(1)键盘的人工编码给每个按键指定一个按键值,报告设定按键S1~S9对应的按键值分别为“1~9”,S10为数字“0”,S11为“OK”,S12~S16对应的按键值分别为12~16。

(2)根据按键值,指定每个按键对应的输入数字和信息。

如下表为每个按键代表的数字和输入信息。

当键盘扫描程序扫描到S10键被按下时,将其代表的按键值“0”通知CPU,CPU根据事先的规定,就会知道输入的数字是“0”。

矩阵键盘中每个按键所代表的数字和输入信息(3)输入数字和密码对比。

先将设定的密码用一个数组保存,报告中用的密码“080874”和“OK”确认信息可以用如下数组保存:Unsigned char D[ ]={0,8,0,8,7,4,11};在主程序接收到数字和信息后,通过逐位对比的方法进行判断。

输入的数字经对比正确时,程序才会继续顺序执行,否则,程序拒绝继续执行。

(4)执行预期功能。

如果输入密码正确,执行预期功能,报告设计为点亮P3.0口引脚LED。

三、电路图设计(Proteus绘制)四、程序设计(C语言)矩阵式键盘实现的电子密码锁程序#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚sbit sound=P3^7; //将sound位定义为P3.7unsigned char keyval; //储存按键值/************************************************************** 函数功能:延时输出音频**************************************************************/ void delay(void){unsigned char i;for(i=0;i<200;i++);}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){unsigned char D[ ]={0,8,0,8,7,4,11}; //设定密码EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0keyval=0xff; //按键值初始化while(keyval!=D[0]) //第一位密码输入不正确,等待;while(keyval!=D[1]) //第二位密码输入不正确,等待;while(keyval!=D[2]) //第三位密码输入不正确,等待;while(keyval!=D[3]) //第四位密码输入不正确,等待;while(keyval!=D[4]) //第五位密码输入不正确,等待;while(keyval!=D[5]) //第六位密码输入不正确,等待;while(keyval!=D[6]) //没有输入“OK”,等待;P3=0xfe; //P3.0引脚输出低电平,点亮LED}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1 //定时器T0的中断编号为1,使用第一组寄存器{unsigned char i;TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=1; //可判断是S1键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=2; //可判断是S2键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=3; //可判断是S3键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=5; //可判断是S5键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=6; //可判断是S6键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=7; //可判断是S7键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=9; //可判断是S9键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=0; //可判断是S10键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=11; //可判断是S11键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=12; //可判断是S12键被按下P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=13; //可判断是S13键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=14; //可判断是S14键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=15; //可判断是S15键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=16; //可判断是S16键被按下for(i=0;i<200;i++) //让P3.7引脚电平不断取反输出音频{sound=0;delay();sound=1;delay();}}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值}五、用Proteus软件进行仿真利用Keil软件进行编译通过后,生成hex文件。

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

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

3晶振时钟电路与复位电路
7
晶振时钟电路
复位电路
系统电路图
8
电路PCB板
9
4.软件设计
10
软 件 设 计 流 程 图
5.程序调试
11
调试本程序需要用到KEIL C51,及51开 发板一块及其配套的下载烧录软件
首先打开KEIL C51主程序,新建工程, 新建文本框写入程序,保存,检查是否有语 法错误,经反复检查无误后汇编,生成51单 片机可执行的HEX文件。然后用51开发板相 匹配的烧录软件把HEX文件写入单片机 。
学的精神去解决问题。很多事情看起来是很简单的问题,但实际
做起来去会发现有许多奥妙!这是因为其中蕴含着许多科学的问
题。运用科学的方法去解决问题,这是我这次实训给我带来的思
想上的改变。学习上,使自已在大学所以的知识在这次得到实践
,学到一些书本上无法学到的经验,对电子元件有了进一步的认
识。
电子锁是信息化时代发展的产物,应时而生,我9C51
开锁驱动电路
电磁阀
通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而 达到开锁的目的。本设计通过P3.0接一个3极管驱动继电器打开 电磁阀线圈实现开关门。
当用户输入的密码正确而且是在规定的时间及次数输入之内 ,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁 ,达到开门的目的。
1
89C52
51单片机的电子锁设计 九组 DZ0901
密码锁的功能
2
开关锁,修改密码
还原,记忆
输入密码
目录
3
1.系统设计
2.硬件设计
3.软件设计
4.程序调试
1.系统设计
4
系统总设计结构图

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

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

电子密码锁一、工作原理本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O 线的数目,在按键比较多的时候,通常采用这样方法。

每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N ×M个按键的键盘。

在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。

4×4矩阵键盘的工作原理在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图5所示。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

扫描原理把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。

由于这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,为了避免让8051误判为多次输入同一按键,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。

利用51单片机设计一个用16个按键输入,6位数字输出显示的电子时钟。

如图1-1所示。

图1-1按键分布图具体要求和按键功能介绍如下:1. 上电后,6 位数码管显示“—”;2. 设置6 位密码,密码通过键盘输入,按“确定”键确认,如密码正确,将锁打开;3. 密码由用户自己设定,若密码正确即锁被打开,则指示灯被点亮;4. 若密码1 次输入错误,则报警;5. 按Set 键,修改密码;6. 按Cle 键可清除已输入的密码,重新进行输二、系统硬件组成本次设计的主要有键盘,数码管,STC89C52芯片,以及LED灯。

基于51单片机的电子密码锁—1

基于51单片机的电子密码锁—1

基于51单⽚机的电⼦密码锁—1这个程序是为了实现基于51单⽚机的电⼦密码锁,⽬前,程序解决了最重要之⼀的输⼊的密码和保存的正确密码相⽐较的问题。

通过定义了两个数组:uchar table2[6]; //临时密码保存uchar password[6]="123456"; //进门密码将输⼊的密码写⼊到table2[]中有⼀点需要特别注意:因为我写到table2[]数组内的是ASCII值的0-9,⽽ASCII值的0-9对应的符号却是NUT,SOH... (省略)所以在刚开始调试时,LCD1602屏幕输出的总是奇怪的字符,⽽不是我想要的0-9,通过查询ASCLL码表可以知道字符(0-9)对应的数值是48-57,所以我通过定义了⼀个新的数组,uchar smgduan[10]={48,49,50,51,52,53,54,55,56,57};以及lcd_write_data(smgduan[table2[i]]);的⽅式,实现了在LCD上输出字符0-9的功能。

在最后做两个数组⽐较时,开始同样出现了这个情况,因为数字1和字符1对应的ASCII值不同,所以password[i]不等于table2[i],需要进⾏转换,我的⽅式的是password[i]==smgduan[table2[i]];罗⾥吧嗦这个多,主要还是给未来的⾃⼰看看,当初犯得错误多么低级。

---------------------------------------------------分割线-----------------------------------------------------------------------------------下⼀版改进考虑把重复按键选择数字改成矩阵按键,加进些其他的功能。

---------------------------------------------------分割线-----------------------------------------------------------------------------------程序部分:/*这个⽅案是我写基于51单⽚机的电⼦密码锁过程中,未完成全部功能的程序。

基于51单片机简易密码锁设计

基于51单片机简易密码锁设计

易密码锁设计摘要:本设计以单片机STC89C52RC作为密码锁监控装置的检测和控制核心,分为主机控制和从机执行机构(本设重点介绍主机设计),实现钥匙信息在主机上的初步认证注册、密码信息的加密、钥匙丢失报废等功能。

根据51单片机之间的串行通信原理,这便于对密码信息的随机加密和保护。

而且采用键盘输入的电子密码锁具有较高的优势。

采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,提高信号传输的抗干扰性,减少错误动作,而且功率消耗低;反应速度快、传输效率高、工作稳定可靠等。

软件设计采用自上而下的模块化设计思想,以使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。

测试结果表明,本系统各项功能已达到本设计的所有要求。

关键词:单片机;智能密码锁;串行通信The Design Of The Simple Password LockAbstract:It can carry out the key information to register in the main on board initial attestation, the password information encrypt etc. Go to correspond by letter the principle according to the string between 51 machines, this is easy to encrypt and protect to the passwords information random. Adopt the numerical signal codes,not only can carry out many controls of the road information, raise the anti- interference that signal deliver, reduce the mistake action,but also the power consume is low,Respond quickly,the efficiency deliver is high, work stable credibility etc. The software design adoption the design thought from top to bottom, to make the system toward wear distribute type,turn to the direction development of small, strengthen the system and can expand the stability and circulate.Test the result enunciation, various functions of this system are already all request of this design.Key Words : singlechip; intelligent password lock; Serial communication;目录概述 (1)1 设计目标 (1)2硬件设计与原理 (2)2.1 设计总框图 (2)2.2 硬件设计分析 (2)2.2.1 电源的设计 (2)2.2.2 单片机最小系统 (3)2.2.3 显示系统 (8)2.2.4 矩阵按键模块 (8)2.2.5 蜂鸣器和指示灯电路 (9)3软件设计与分析 (9)3.1 软件设计的组成 (9)3.2 各部分软件分析 (9)3.2.1 延时子函数 (9)3.2.2 矩阵键盘扫描子函数 (10)3.2.3 检验密码正误子函数 (10)3.2.4锁定,鸣笛程序 (11)3.2.5显示子程序 (11)4软件仿真 (14)4.1 PROTEUS简介 (14)4.2仿真图 (15)总结 (19)参考文献 (20)致谢 (28)附录 (29)述随着人们生活水平的提高,传统的机械锁由于其构造的简单,被撬开的事件屡见不鲜,电子锁保密性高,能够防止不法分子多次试探密码;性价比高,因此,电子锁受到了广大的亲昵。

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

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

内容摘要近年来,在我国社会经济不断进步和迅猛发展的背景下,人们的生活水平越来越高,更多的人开始享受高质量的生活。

就拿我们家家离不开的锁具来说,从我国古代历史上就有了各种锁的记载和使用,发展到今天人们追求的不单单只是用来锁门的一个工具。

人们对于锁的追求体现在一种心理的安全感和使用过程中的先进技术体验上。

本课题为电子密码锁设计。

该设计采用STC89C51控制器来进行关键部分的运作,主要包括主控部分、显示部分、报警部分、电磁锁控制、红外遥控接收以及电源。

报警选择蜂鸣器。

显示电方案选取LCD1602显示相关信息。

用户可以通过键盘或者红外遥控输入密码数据,系统判断密码数据是否正确,来完成电子密码锁的开和关,键盘具有更改密码的作用。

采用C语言进行软件设计,其开发上手容易,通过单片机的专用Keil设计工具来实现程序文件的执行,系统软件设计完成后,利用Proteus来完成对系统的验证,成功功能验证。

并改善设计,完成系统设计要求。

关键词: STC89C51 密码锁红外遥控第一章绪论1.1研究的目的与意义近年来,在我国社会经济不断进步和迅猛发展的背景下,人们的生活水平越来越高,更多的人开始享受高质量的生活。

就拿我们家家离不开的锁具来说,从我国古代历史上就有了各种锁的记载和使用,发展到今天人们追求的不单单只是用来锁门的一个工具。

人们对于锁的追求体现在一种心理的安全感和使用过程中的先进技术体验上。

所以智能电子锁的发展趋势特别明显,而且在市场上的受众程度也非常高。

这种智能锁根据现代人的生活习惯和生活趋势量身设计,可以通过手机,指纹来控制锁的开关,很方便快捷,而且安全系数相对之前的机械锁高很多。

智能锁的发明和使用很大程度上减少了我们随身携带钥匙和容易丢钥匙的问题,给我们的生活带来更多的安全和便捷,是现代社会发展中必要的产物。

1.2国内外研究现状众所周知,我国是农业大国,近些年,我国的科技发展有了明显的进步,但是电子密码技术还是远远赶不上西方发达国家的步伐。

(完整word版)基于51单片机的智能密码锁

(完整word版)基于51单片机的智能密码锁

单片机的电子密码锁目录第一章绪论......................................................... . (2)1.1电子密码锁简介......................................................... .. (2)1.2电子密码锁设计的背景及意义............................................................................. . (3)第2章总体设计............................................................................. . (3)2.1设计分析............................................................................. (3)2.2系统结构............................................................................. (4)第3章硬件电路设计............................................................................. (5)3.1单片机最小系统设计............................................................................. . (5)3.1.1时钟电路............................................................................. (5)3.1.2 复位电路 ............................................................................ . (6)3.1.3 最小系统 ............................................................................ (6)3.2 矩阵键盘设计 ............................................................................ . (7)3.3 LCD显示模块设计 ............................................................................ (8)3.4 开锁机构 ............................................................................ ............................................... .93.5 报警机构 ............................................................................ ............................................... .103.6 硬件综合设计 ............................................................................ ....................................... .10第4章软件设计 ............................................................................ ........................................ (11)4.1 软件总体设计 ............................................................................ .. (11)4.2 键盘扫描子程序 ............................................................................ ................................... .124.3 定时器中断子程序 ............................................................................ ......................... . (14)4.4 密码输入子程序 ............................................................................ . (15)4.5 报警子程序 ............................................................................ (16)总结 ............................................................................ ................................................................ .17参考文献 ............................................................................ ...................................................... (18)附录程序源代码 ............................................................................ ....................................... . (19)摘要:本文中将要介绍的单片机电子密码锁是一种通过判断密码输入是否正确来控制电路或是芯片的工作状态,进而控制锁的打开和闭合。

基于51单片机的简易电子密码锁

基于51单片机的简易电子密码锁
3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。
4、AT24C02保存密码,支持复位保存,掉电保存功能。
二、按键说明
按键定义图
如图示:采用4X4键盘输入,键盘对应名称如下:
1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D
其中,【0—9】为数字键,用于输入相应的密码,
2、退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。
3、修改密码:在开锁状态下,再次输入正确的密码并按下【#】(确认)键,此时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入一次新密码并按【D】,会听到两声提示音,表示重设密码成功,内部保存新密码并存储到AT24C02。(如两次输入的新密码不一样,则重设密码失败)。
【*】号键为取消当前操作
【#】号键为确认
【D】键为修改密码
其它键无功能及定义
三、作用说明:
密码锁初始密码为:000000.
1、开锁:插上电源后,程序自动调入初始密码,此时依次输入:000000,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。(如为自己焊接,请首次使用输入:131420,对密码进行初始化,当显示出现:initpassword,证明密码初始化完成,此时初始密码即为:000000)。
DC电源座1只
自锁开关1只
4.7K色环电阻6只
5V继电器1只
蜂鸣器1只
三极管S85502只
发光二极管红绿各1只(共2只)
导线若干
USB电源线1条
一、实现功能:
1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。
2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前言随着电子技术的发展,具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。

电子密码锁与普通机械锁相比,具有许多独特的优点:性好,防盗性强,可以不用钥匙,记住密码即可开锁等。

目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。

下面就是现在主流电子密码锁:目前常见的遥控式电子防盗锁主要有光遥控和无线电遥控两类。

键盘式电子密码锁从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一部分应用于保管箱和运钞车。

卡式电子防盗锁使用各种“卡”作为钥匙的电子防盗锁是当前最为活跃的产品,无论卡的种类如何多种多样,按照输入卡的操作方式,都可分为接触式卡和非接触式卡两大类。

生物特征防盗锁人的某些与生俱来的个性特征(如手、眼睛、声音的特征)几乎不可重复,作为“钥匙”就是唯一的(除非被逼迫或伤害)。

因此,利用生物特征做密码的电子防盗锁,也特别适合金融业注重“验明正身”的行业特点。

人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高。

锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要安全可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。

随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。

据有关资料介绍,电子密码锁的研究从20世纪30年代就开始了,在一些特殊场所早就有所应用。

这种锁是通过键盘输入一组密码完成开锁过程。

研究这种锁的初衷,就是为提高锁的安全性。

由于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以避免因钥匙被仿制而留下安全隐患。

电子锁只需记住一组密码,无需携带金属钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。

电子锁的种类繁多,例如数码锁,指纹锁,磁卡锁,IC 卡锁,生物锁等。

但较实用的还是按键式电子密码锁。

20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,成本较高,是适合使用在安全性要求较高的场合,且需要有电源提供能量,使用还局限在一定围,难以普及,所以对它的研究一直没有明显进展。

目前,在西方发达国家,电子密码锁技术相对先进,种类齐全,电子密码锁已被广泛应用于智能门禁系统中,通过多种更加安全,更加可靠的技术实现大门的管理。

在我国电子锁整体水平尚处于国际上70年代左右,电子密码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国有几个厂生产供应市场。

但国自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。

国的不少企业也引进了世界上先进的技术,发展前景非常可观。

希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。

一、作品功能:1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。

2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。

修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。

3、报警、锁定键盘功能。

密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。

4、AT24C02保存密码,支持复位保存,掉电保存功能。

二、按键说明按键定义图如图示:采用4X4键盘输入,键盘对应名称如下:1 2 3 A4 5 6 B7 8 9 C* 0 # D其中,【0—9】为数字键,用于输入相应的密码,【*】号键为取消当前操作【#】号键为确认【D】键为修改密码其它键无功能及定义三、操作说明:密码锁初始密码为:000000.1、开锁:插上电源后,程序自动调入初始密码,此时依次输入:000000,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。

2、退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。

3、修改密码:在开锁状态下,再次输入正确的密码并按下【#】(确认)键,此时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入一次新密码并按【D】,会听到两声提示音,表示重设密码成功,部保存新密码并存储到AT24C02。

(如两次输入的新密码不一样,则重设密码失败)。

4、报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒又有按键,3秒再启动。

5、当重置新密码时,新密码会保存于AT24C02存储器里。

四、框图及流程图1、系统结构框图2、主程序设计流程图3、键功能程序流程图。

4、开锁程序流程图5.电子密码锁原理图程序(c语言)#include <REG51.h>#include<intrins.h>#define LCM_Data P0#define uchar unsigned char#define uint unsigned int#define w 6 //定义密码位数sbit lcd1602_rs=P2^5;sbit lcd1602_rw=P2^6;sbit lcd1602_en=P2^7;sbit Scl=P3^4; //24C02串行时钟sbit Sda=P3^5; //24C02串行数据sbit ALAM = P2^1; //报警sbit KEY = P2^0; //开锁sbit open_led=P2^2; //开锁指示灯bit operation=0; //操作标志位bit pass=0; //密码正确标志bit ReInputEn=0; //重置输入充许标志bit s3_keydown=0; //3秒按键标志位bit key_disable=0; //锁定键盘标志unsigned char countt0,second; //t0中断计数器,秒计数器void Delay5Ms(void);unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盘扫描控制表unsigned char code start_line[] = {"password: "};unsigned char code name[] = {"===Coded Lock==="}; //显示名称unsigned char code Correct[] = {" correct "}; //输入正确unsigned char code Error[] = {" error "}; //输入错误unsigned char code codepass[] = {" pass "};unsigned char code LockOpen[] = {" open "}; //OPEN unsigned char code SetNew[] = {"SetNewWordEnable"};unsigned char code Input[] = {"input: "}; //INPUT unsigned char code ResetOK[] = {"ResetPasswordOK "};unsigned char code initword[] = {"Init password..."};unsigned char code Er_try[] = {"error,try again!"};unsigned char code again[] = {"input again "};unsigned char InputData[6]; //输入密码暂存区unsigned char CurrentPassword[6]={1,3,1,4,2,0};//当前密码值unsigned char TempPassword[6];unsigned char N=0; //密码输入位数记数unsigned char ErrorCont; //错误次数计数unsigned char CorrectCont; //正确输入计数unsigned char ReInputCont; //重新输入计数unsigned char code initpassword[6]={0,0,0,0,0,0};//=====================5ms延时==============================void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//===================400ms延时==============================void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}//================================24C02====================================== void mDelay(uint t) //延时{uchar i;while(t--){for(i=0;i<125;i++){;}}}void Nop(void) //空操作{_nop_();_nop_();_nop_();_nop_();}/*起始条件*/void Start(void){Sda=1;Scl=1;Nop();Sda=0;Nop();}/*停止条件*/void Stop(void){Sda=0;Scl=1;Nop();Sda=1;Nop();}/*应答位*/void Ack(void){Sda=0;Nop();Scl=1;Nop();Scl=0;}/*反向应答位*/void NoAck(void){Sda=1;Nop();Scl=1;Nop();Scl=0;}/*发送数据子程序,Data为要求发送的数据*/ void Send(uchar Data){uchar BitCounter=8;uchar temp;do{temp=Data;Scl=0;Nop();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*读一字节的数据,并返回该字节值*/uchar Read(void){uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;do{Scl=0;Nop();Scl=1;Nop();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}void WrToROM(uchar Data[],uchar Address,uchar Num) {uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Send(*(PData+i));Ack();Stop();mDelay(20);}}void RdFromROM(uchar Data[],uchar Address,uchar Num){uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}//=======================================LCD1602=============================// #define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)//----------------延时函数,后面经常调用----------------------void delay(uint xms)//延时函数,有参函数{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}//--------------------------写指令---------------------------write_1602com(uchar )//****液晶写入指令函数****{lcd1602_rs=0;//数据/指令选择置为指令lcd1602_rw=0; //读写选择置为写P0=;//送入数据delay(1);lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备delay(1);lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令}//-------------------------写数据-----------------------------write_1602dat(uchar dat)//***液晶写入数据函数****{lcd1602_rs=1;//数据/指令选择置为数据lcd1602_rw=0; //读写选择置为写P0=dat;//送入数据delay(1);lcd1602_en=1; //en置高电平,为制造下降沿做准备delay(1);lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令}//-------------------------初始化-------------------------void lcd_init(void){write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);//开显示不显示光标write_1602com(0x06);//整屏不移动,光标自动右移write_1602com(0x01);//清显示}//==============将按键值编码为数值=========================unsigned char coding(unsigned char m){unsigned char k;switch(m){case (0x18): k=1;break;case (0x28): k=2;break;case (0x48): k=3;break;case (0x88): k='A';break;case (0x14): k=4;break;case (0x24): k=5;break;case (0x44): k=6;break;case (0x84): k='B';break;case (0x12): k=7;break;case (0x22): k=8;break;case (0x42): k=9;break;case (0x82): k='C';break;case (0x11): k='*';break;case (0x21): k=0;break;case (0x41): k='#';break;case (0x81): k='D';break;}return(k);}//=====================按键检测并返回按键值=============================== unsigned char keynum(void){unsigned char row,col,i;P1=0xf0;if((P1&0xf0)!=0xf0){Delay5Ms();Delay5Ms();if((P1&0xf0)!=0xf0){row=P1^0xf0; //确定行线i=0;P1=a[i]; //精确定位while(i<4){if((P1&0xf0)!=0xf0){col=~(P1&0xff); //确定列线break; //已定位后提前退出}else{i++;P1=a[i];}}}else{return 0;}while((P1&0xf0)!=0xf0);return (row|col); //行线与列线组合后返回}else return 0; //无键按下时返回0}//=======================一声提示音,表示有效输入========================void OneAlam(void){ALAM=0;Delay5Ms();ALAM=1;}//========================二声提示音,表示操作成功======================== void TwoAlam(void){ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;}//========================三声提示音,表示错误========================void ThreeAlam(void){ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;}//=====================显示输入的N个数字,用H代替以便隐藏============================void DisplayOne(void){// DisplayOneChar(9+N,1,'*');write_1602dat('*');}//=======================显示提示输入========================= void DisplayChar(void){unsigned char i;if(pass==1){//DisplayListChar(0,1,LockOpen);write_1602com(er);for(i=0;i<16;i++){write_1602dat(LockOpen[i]);}}else{if(N==0){//DisplayListChar(0,1,Error);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Error[i]);}}else{//DisplayListChar(0,1,start_line);write_1602com(er);for(i=0;i<16;i++){write_1602dat(start_line[i]);}}}}void DisplayInput(void){unsigned char i;if(CorrectCont==1){//DisplayListChar(0,0,Input);for(i=0;i<16;i++){write_1602dat(Input[i]);}}}//========================重置密码==================================================//============================================================================= =====void ResetPassword(void){unsigned char i;unsigned char j;if(pass==0){pass=0;DisplayChar();ThreeAlam();}else{if(ReInputEn==1){if(N==6){ReInputCont++;if(ReInputCont==2){for(i=0;i<6;){if(TempPassword[i]==InputData[i]) //将两次输入的新密码作对比i++;else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示pass=0;ReInputEn=0; //关闭重置功能,ReInputCont=0;DisplayChar();break;}}if(i==6){//DisplayListChar(0,1,ResetOK);write_1602com(er);for(j=0;j<16;j++){write_1602dat(ResetOK[j]);}TwoAlam(); //操作成功提示WrToROM(TempPassword,0,6); //将新密码写入24C02存储ReInputEn=0;}ReInputCont=0;CorrectCont=0;}else{OneAlam();//DisplayListChar(0, 1, again); //显示再次输入一次write_1602com(er);for(j=0;j<16;j++){write_1602dat(again[j]);}for(i=0;i<6;i++){TempPassword[i]=InputData[i]; //将第一次输入的数据暂存起来}}N=0; //输入数据位数计数器清零}}}}//=======================输入密码错误超过三过,报警并锁死键盘======================void Alam_KeyUnable(void){P1=0x00;{ALAM=~ALAM;Delay5Ms();}}//=======================取消所有操作============================================void Cancel(void){unsigned char i;unsigned char j;//DisplayListChar(0, 1, start_line);write_1602com(er);for(j=0;j<16;j++){write_1602dat(start_line[j]);}TwoAlam(); //提示音for(i=0;i<6;i++){InputData[i]=0;}KEY=1; //关闭锁ALAM=1; //报警关operation=0; //操作标志位清零pass=0; //密码正确标志清零ReInputEn=0; //重置输入充许标志清零ErrorCont=0; //密码错误输入次数清零CorrectCont=0; //密码正确输入次数清零ReInputCont=0; //重置密码输入次数清零open_led=1;s3_keydown=0;key_disable=0;N=0; //输入位数计数器清零}//==========================确认键,并通过相应标志位执行相应功能===============================void Ensure(void){unsigned char i,j;RdFromROM(CurrentPassword,0,6); //从24C02里读出存储密码 if(N==6){if(ReInputEn==0) //重置密码功能未开启{for(i=0;i<6;){if(CurrentPassword[i]==InputData[i]){i++;}else{ErrorCont++;if(ErrorCont==3) //错误输入计数达三次时,报警并锁定键盘{write_1602com(er);for(i=0;i<16;i++){write_1602dat(Error[i]);}doAlam_KeyUnable();while(1);}else{TR0=1; //开启定时key_disable=1; //锁定键盘pass=0;break;}}}if(i==6){CorrectCont++;if(CorrectCont==1) //正确输入计数,当只有一次正确输入时,开锁,{//DisplayListChar(0,1,LockOpen);write_1602com(er);for(j=0;j<16;j++){write_1602dat(LockOpen[j]);}TwoAlam(); //操作成功提示音KEY=0; //开锁pass=1; //置正确标志位TR0=1; //开启定时open_led=0; //开锁指示灯亮for(j=0;j<6;j++) //将输入清除{InputData[i]=0;}}else //当两次正确输入时,开启重置密码功能{//DisplayListChar(0,1,SetNew);write_1602com(er);for(j=0;j<16;j++){write_1602dat(SetNew[j]);}TwoAlam(); //操作成功提示ReInputEn=1; //允许重置密码输入CorrectCont=0; //正确计数器清零}}else //=========================当第一次使用或忘记密码时可以用131420对其密码初始化============{if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0)){WrToROM(initpassword,0,6); //强制将初始密码写入24C02存储//DisplayListChar(0,1,initword); //显示初始化密码write_1602com(er);for(j=0;j<16;j++){write_1602dat(initword[j]);}TwoAlam();Delay400Ms();TwoAlam();N=0;}else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示音pass=0;}}}else //当已经开启重置密码功能时,而按下开锁键,{//DisplayListChar(0,1,Er_try);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Er_try[j]);}ThreeAlam();}}else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示音pass=0;}N=0; //将输入数据计数器清零,为下一次输入作准备operation=1;}//==============================主函数===============================void main(void){unsigned char KEY,NUM;unsigned char i,j;P1=0xFF;TMOD=0x11;TL0=0xB0;TH0=0x3C;EA=1;ET0=1;TR0=0;Delay400Ms(); //启动等待,等LCM讲入工作状态lcd_init(); //LCD初始化write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示for(i=0;i<16;i++){write_1602dat(name[i]);//向液晶屏写日历显示的固定符号部分}write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示for(i=0;i<16;i++){write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号}write_1602com(er+9); //设置光标位置write_1602com(0x0f); //设置光标为闪烁Delay5Ms(); //延时片刻(可不要)N=0; //初始化数据输入位数while(1){if(key_disable==1)Alam_KeyUnable();elseALAM=1; //关报警KEY=keynum();if(KEY!=0){if(key_disable==1){second=0;}else{NUM=coding(KEY);{switch(NUM){case ('A'): ; break;case ('B'): ; break;case ('C'): ; break;case ('D'): ResetPassword(); break; //重新设置密码case ('*'): Cancel(); break; //取消当前输入case ('#'): Ensure(); break; //确认键,default:{//DisplayListChar(0,1,Input);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Input[i]);}operation=0;if(N<6) //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。

相关文档
最新文档