用24C04跟1602LCD设计电子密码锁.docx
- 文档编号:5790102
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:31
- 大小:255.71KB
用24C04跟1602LCD设计电子密码锁.docx
《用24C04跟1602LCD设计电子密码锁.docx》由会员分享,可在线阅读,更多相关《用24C04跟1602LCD设计电子密码锁.docx(31页珍藏版)》请在冰豆网上搜索。
用24C04跟1602LCD设计电子密码锁
毕业设计(论文)
学生姓名:
赵军成
学号:
21
专业:
应用电子技术
系部:
电子工程学院
设计(论文)题目:
用24C04与1602LCD设计电子密码锁课程设计
指导教师:
陈爱文
年月日
摘要:
随着信息技术的不断发展,信息化时代也逐步进入普通家庭,人们对个人的信息安全以及隐私等私密信息的安全要求不断提高,传统的机械锁已经不能满足要求。
针对此现状设计一款安全可靠廉价的电子密码锁有着十分重要的意义。
本设计以AT89C51为主控芯片,带有一个密码输入键盘、外围时钟复位电路、存储单元24C04、显示单元1602LCD,通过LED灯的亮与灭表示电子锁的锁闭与打开。
利用单片机灵活的编程设计和丰富的IO端口,能实现密码锁的基本功能。
用户可以任意设置密码增加了密码锁的保密性,同时如果增加指纹识别、光电识别能进一步增加密码锁的保密性。
为了提高可读性采用了1602作为显示单元,使用户对密码锁的运行情况一目了然。
关键词:
单片机;电子密码锁;24C04;1602LCD;汇编语言;程序设计
1引言
随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,锁是置于可启闭的器物上,用以关住某个确定的空间范围或某种器具的,必须以钥匙或暗码打开扣件。
传统的机械锁由于其构造的简单,被撬的事件屡见不鲜。
锁具发展到现在已有若干年的历史了,人们对它的结构、机理也研究得很透彻,因此,不用钥匙就能打开的方法和工具也层出不穷。
盗贼还想方设法利用高科技手段撬门开锁,使广大居民防不胜防。
传统锁具都存在致命的弱点:
第一、 锁芯采用常见的铜、铝、锌等材料,抵抗不了强力破坏;第二、 锁具制作工艺,技术落后,无法阻止技术手段的开启。
目前,市场上很多国内外的锁具,实际上都不具备真正的防盗功能。
在惯偷面前,两根钢丝或几件简单的工具就可以把这些锁打开,主要是锁具的技术原理太过简单。
随着科技的进步,锁已发展到了密码锁、磁性锁、电子锁、激光锁、声控锁等等。
在传统钥匙的基础上,加了一组或多组密码,不同声音,不同磁场,不同声波,不同光束光波,不同图像。
(如指纹、眼底视网膜等)来控制锁的开启。
从而大大提高了锁的安全性,使不法之徒无从下手,人们也就能对自身财产安全有了更多的保障。
当今安全信息系统应用越来越广泛,特别在保护机密、维护隐私和财产保护方面起到重大作用,而基于电子密码锁的安全系统是其中的组成部分,因此研究它具有重大的现实意义。
电子锁可以在日常生活和现代办公中,住宅与办公室的安全防范、单位的文件档案、财务报表以及一些个人资料的保存等多种场合使用,大大提高了主人物资的安全性。
目前使用的密码锁种类繁多,各具特色。
本文从经济实用的角度出发,采用AT89S51单机,研制了一款具有防盗自动报警功能的电子密码锁,同时通过LCD1602增强了可读性。
该密码锁设计方法合理,简单易行,成本低,符合住宅、办公室用锁要求,具有一定的推广价值。
(1)系统设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。
(2)密码由用户自己设定,在开锁状态下,用户可自行修改密码。
(3)具有自动报警功能。
一是密码输入错误3次,则报警;保证了系统的安全性。
系统工作时,用户通过按键输入6位密码,单片机将输入密码与设定密码进行比较,若密码正确,则发出开锁信号,将门打开,系统不报警;若密码不正确,系统提示重新输入密码,重新输入密码的次数不能超过3次,若3次输入的密码都不正确,则发出报警信号。
本文注重实践和理论相结合,按照单片机初学者的学习过程,由浅入深逐步讲解了设计电子锁的整个设计过程及应用到的编程软件。
整个设计报告工分为4个部分,各部分的安排如下
第一部分:
是设计电子锁的背景及目的;
第二部分:
介绍了这个方案的设计任务要求;
第三部分:
介绍了电子锁的原理图及元器件清单;
第四部分:
介绍了电子锁的性能测试与分析;
2设计任务和要求
设计任务是利用开发板设计一个电子锁;
设计要求:
自己在自己电脑上写好要连接的电子锁的程序,再在实验室里将已经调试成功的电子锁的程序下载到开发板上,观察并记录开发板上的等的运行情况;如果不是如预期那样运行,要找出原因并进行调试,最后对自己的实验设计进行验收。
2.1系统总结构设计图
本设计由主控芯片51单片机,24C04断电存储电路、单片机时钟电路,LCD1602显示电路、键盘和开锁电路组成。
单片机负责控制整个系统的执行过程。
2.2单元电路设计与参数计算
图2.2-1电子锁的仿真图
2.3各模块的功能
1.键盘输入模块:
分为密码输入按键与几个功能按键,用于完成密码锁输入功能。
2.密码存储模块:
用于完成掉电存储功能,使修改的密码断电后仍能保存。
3.蜂鸣器报警电路:
用于完成输错密码时候的警报功能。
4.晶振电路:
用于单片机的起振。
5.复位电路:
完成系统的复位。
6.显示模块:
用于完成对系统状态显示及操作提示功能。
7.LED显示模块:
用于辅助报警与输入提示。
8.开锁电路:
应用继电器及发光二极管模拟开锁,完成开锁及开锁提示。
2.3.2矩阵键盘键值读取
矩阵键盘接P1口,行接低4位,列接高4为。
先让行为高,列为低,若有键按下,则所在行为低,得到按键的所在行数,之后令P1口,行为低,列为高,运用相似的方法得到所按键的所在列数,及确定按键位置,返回键值。
由于机械键盘会出现信号抖动的情况,固在发现有按键后延时5毫秒再次确定,若让有按键,证明按键稳定,否则认为接收到的是抖动信号,不予处理。
2.3.31602液晶显示模块
1602具有三个工作状态控制端,调节他们的高低变化配合数据口的信息,可以显示2×16的字母或者数字,通过子函数可以实现检测初始化LCD、写指令到LCD、LCD状态、LCD清屏、输入一个字节数据到LCD、LCD光标定位到x处、LCD光标归位、输入一个字符到LCD、输入一个字符串到LCD等功能。
液晶显示子程序在每次更新显示内容时都会被调用,其流程如图所示。
液晶显示子程序流程图
每次更新显示内容前,需清显示清空LCD原先的显示内容,清屏指令的指令码为01H,即将P0口赋值01H,然后写入指令寄存器IR。
LCD1602要显示的内容是根据其控制器内置的字符码表,事先列出要显示的ASCII字符串。
每次送一个字符的ASCII码入P0口,然后写入数据寄存器DR,最后将字符地址加一,LCD1602会将写入的ASCII码对应的字符依次显示出来。
由于显示字符串的长度不尽相同,约定每串字符以00H结尾;程序检测到字符码为00H时,即停止写入,返回。
LCD显示的内容在下次更新前会一直保持。
2.4.延时模块
一个程序会有许多地方需要进行延时操作,例如矩阵键盘的消抖延时。
一般延时可以通过空循环与中断响应两种方法进行。
由于本程序对于时间精度要求不高,故使用相对简单的空循环的方法进行延时。
进过实验,单片机每空循环110次耗时1ms。
故用两次循环,里面一次空循环110,外面的一次由输入决定循环次数,这样就会进行输入数值时长的延时。
2.4.4密码读取模块
首先预读入密码的字符数组清零,显示位置清空,然后读取键值。
先判断此时是否是在第九个键值输入了数字键值,如果是不响应重新读入,这样可以防止读入字符串溢出,造成密码读取错误。
然后通过switch语句5处理键值(字母键值),并将读取位置、显示位置进行相关调整;如果输入的是数字有效键值,存入当前指向的字符数组空间,其后将键值变量清零准备读取下一个键值。
进行循环读取,直到成功读取8位密码或者因为输入了确定键提前完成读取工作。
2.4.2密码设置模块
在系统进行初始化时,要求设置密码。
整体思路是要求读取一组密码,保存在临时空间,然后再次读取密码,如果相同,证明设置成功,将新密码覆盖进标准密码数组里,如果两次的密码不同,显示错误信息,要求重新输入。
图2.3.5密码设置模块
2.4.3密码比较模块
该模块将输入密码字符串与设定密码字符串比较。
如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。
逻辑框图如图2.3.6
图2.3.6密码比较模块
2.4.4改密处理.
如图,可以看出,改密键的处理流程跟开锁键类似,都需检查密码是否正确,错误的话,提示重新输入,只有输入密码正确才可以进行改密。
然后再按更改键,密码更改程序被调用,进而更改密码,此过程,LCD都会显示信息。
改密流程图
2.5单片机及其外围电路
复位电路
2.6时钟电路
时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在统一的时序脉冲的驱动下的进行的,如果单片机的时钟电路停止工作(晶振停振),那么单片机也就停止运行了。
当采用内部时钟时,连接方法如下图所示,在晶振引脚XTAL1(19脚)和XTAL2(18脚)引脚之间接入一个12MHZ晶振,两个引脚对地分别再接入一个电容即可产生所需的时钟信号,电容的容量一般在几十皮法,
2.7矩阵键盘电路的设计
为了加强密码的保密性,采用一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),从而提高了密码的保密性,同时也能减少与单片机接口时所占用的I/O口线的数目,节省了单片机的宝贵资源,在按键比较多的时候,通常采用这种方法。
每一行与每一列的交叉处不相同,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N根行线与M根列线,即可组成具有N×M个按键的矩阵键盘。
在这种行列式矩阵键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
当确认有按键按下后,下一步就是要识别哪一个按键被按下。
对键的识别方法通常有两种:
一种是通用的组行扫描查询法;另一种是速度较快的线反转法。
此系统中,我们采用线反转法。
首先辨别键盘中有无按键被按下,在单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。
具体方法是:
向行线输出全扫描字00H,把全部列线置成低电平,然后将列线的电平状态读入累加器A中。
如果有按键被按下,总会有一根行线电瓶被拉至低电平从而使行线不全为1。
判断键盘中哪一个按键被按下通常是通过将列线逐列至低电平后,检查行输入状态来实现的。
方法是:
依次给列线送低电平,然后检查所有行线状态,如果全为1,则所按下的按键不在此列;如果不全为1,则所按下的按键必在此列,而且是在与零电平行线相交的交点上的那个按键。
2.8操作面板
10个数字键用来输入密码,另外6个功能键分别是:
更正、改密、锁定。
其中更正键的功能是当输入密码错误的时候,清除前面已经输入的数据,重新输入。
在输入密码状态下,0-9数字键为有效键,有时间和次数限制功能:
只有三次输入密码机会,每次限制在10秒内完成,输入密码有误或每次输入密码超时,则被认为是密码输入错误。
当3次输入都错误时,程序将返回起始状态。
密码输入正确后,继电器吸合,表示锁被打开。
在密码输入正确的情况下,程序进入查看密码和修改密码状态,。
按“改密”键进入重新设置密码状态,在输入密码时,如发现输入有误,可按“更正”键删除后,重新输入,按“锁定”确认后,程序退出修改密码状态。
2.9液晶显示电路
本系统设计的显示电路是为了给使用者以提示而设置的为了达到界面友好的目的,显示部分由液晶显示器LCD1602取代普通的数码管完成。
开锁时,按下键盘上的开锁按键后,利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。
当密码输入完成时,如果输入的密码正确的话,LCD显示“OK”,绿灯亮起,单片机其中P3.0引脚会输出低电平,使三极管T2导通,电磁铁吸合,继电器开关跳转,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“ERROR”,P3.0输出的是高电平,电子密码锁不能打开,同时红灯亮起。
通过LCD显示屏,可以清楚地判断出密码锁所处的状态。
图3.7显示器电路
显示器主要用于显示以下几个字符,指示如图所示。
A
S
W
O
R
D
P
S
图3.8(a)开机状态
D
等待输入状态
K
O
密码输入正确状态
R
O
R
E
R
密码输入错误及输入密码超时的提示
2.9.2液晶显示子程序
液晶显示子程序在每次更新显示内容时都会被调用,其流程如图所示。
液晶显示子程序流程图
每次更新显示内容前,需清显示清空LCD原先的显示内容,清屏指令的指令码为01H,即将P0口赋值01H,然后写入指令寄存器IR。
LCD1602要显示的内容是根据其控制器内置的字符码表,事先列出要显示的ASCII字符串。
每次送一个字符的ASCII码入P0口,然后写入数据寄存器DR,最后将字符地址加一,LCD1602会将写入的ASCII码对应的字符依次显示出来。
由于显示字符串的长度不尽相同,约定每串字符以00H结尾;程序检测到字符码为00H时,即停止写入,返回。
LCD显示的内容在下次更新前会一直保持。
2.10系统软件设计
系统的软件设计采用汇编语言编码。
设计方法是先用文本编辑器编写源码,然后用软件KeilC51编译,如果没有错误,可连接生成.HEX格式的文件(需事先在KeilC51中设置)。
如果有错误则无法连接,但可在生成的.OBJ文件中找到代码错误的地方,便于修改。
当然也可以直接在Keil中编码。
生成的HEX文件是记录文本行的ASCII文本文件,在HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。
HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用HEX文件。
2.11系统主程序
系统的主程序如图4-1所示。
由于用户在使用系统的过程中,可能在任何时刻按下任何按键,而程序都必须对此作出正确响应。
主程序流程图
2.12初始化及按键识别
如图4.2,系统的初始化包括堆栈起始地址的设定,两个定时/计数器的设定,液晶显示模式的设定,密码缓冲区的初始化,一些自定义数据空间的初始化,蜂鸣器初始化发声等操作。
系统初始化并读取密码完成后,液晶显示"PASSWORDCONTROL",提示用户可以输入密码。
此时程序即不断测试按键,检查是否有按键被按下。
如果有,则进行按键识别;如果没有按键按下,或者按下的按键没有被识别,R3赋值0FFH,并跳转至按键测试。
实际程序运行时,绝大部分时间都在测试按键,等待用户输入。
初始化及按键识别流程图
2.13源程序如下所示:
#include"delay.h"
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
#include"eeprom.h"
#include"delay.h"
voidStart(void)//I2开始
{
SDA=1;
SCL=1;
NOP4();
SDA=0;
NOP4();
SCL=0;
}
voidStop(void)//I2C停止
{
SDA=0;
SCL=0;
NOP4();
SCL=1;
NOP4();
SDA=1;
}
voidRACK(void)//读取应答
{
SDA=1;
NOP4();
SCL=1;
NOP4();
SCL=0;
}
voidNO_ACK(void)//发送非应答信号
{
SDA=1;
SCL=1;
NOP4();
SCL=0;
SDA=0;
}
voidWrite_A_Byte(ucharb)//写一个字节数据
{
uchari;
for(i=0;i<8;i++)
{
b<<=1;
SDA=CY;//CY进位程序状态字寄存器
_nop_();
SCL=1;
NOP4();
SCL=0;
}
RACK();
}
voidWrite_IIC(ucharaddr,uchardat)//向指写地地址写数据
{
Start();
Write_A_Byte(0xa0);
Write_A_Byte(addr);
Write_A_Byte(dat);
Stop();
DelayMs(10);
}
ucharRead_A_Byte(void)//读取一个字节
{
uchari,b;
for(i=0;i<8;i++)
{
SCL=1;
b<<=1;
b|=SDA;
SCL=0;
}
returnb;
}
ucharRead_Current(void)//从当前地址取数据
{
uchard;
Start();
Write_A_Byte(0xa1);
d=Read_A_Byte();
NO_ACK();
Stop();
returnd;
}
ucharRandom_Read(ucharaddr)//从任意地址读取数据
{
Start();
Write_A_Byte(0xa0);
Write_A_Byte(addr);
Stop();
returnRead_Current();
}
#include"key.h"
unsignedcharkey_scan()
{
unsignedchartemp,keyno;
P1=0x0f;
DelayMs
(1);
temp=P1^0x0f;
switch(temp)//纵行
{
case1:
keyno=1/*1*/;break;//第一纵行
case2:
keyno=2/*2*/;break;//第二纵行
case4:
keyno=3/*3*/;break;//第三纵行
case8:
keyno=4/*3*/;break;//第四纵行
}
P1=0xf0;
DelayMs
(1);
temp=P1>>4^0x0f;
switch(temp)
{//横行
case1:
keyno+=0/*A*/;break;//第一行横行
case2:
keyno+=4/*B*/;break;//第一行横行
case4:
keyno+=8/*C*/;break;//第一行横行
case8:
keyno+=12/*D*/;break;//第一行横行
}
P1=0x0f;
returnkeyno;
}
#include"LCD.H"
voidwrite_com(unsignedcharcom)//写命令
{
RS_CLR;
RW_CLR;
P0=com;
DelayMs(5);
EN_SET;
DelayMs(5);
EN_CLR;
}
voidwrite_data(unsignedchardate)//写一个字符
{
RS_SET;
RW_CLR;
P0=date;
DelayMs(5);
EN_SET;
DelayMs(5);
EN_CLR;
}
voidinit()//初始化
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
write_com(0x80+x);
}
else
{
write_com(0xC0+x);
}
while(*s)
{
write_data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
write_com(0x80+x);
}
else
{
write_com(0xC0+x);
}
write_data(Data);
}
#include
#include
#include"lcd.h"
#include"key.h"
#include"delay.h"
#include"eeprom.h"
voidint0(void);
unsignedcharpassword[6]/*={0x01,0x01,0x01,0x01,0x01,0x01}*/;
unsignedcharpassword1[6];
unsignedcharcodeaa[]="Password";
unsignedcharcodegg[]="New";
unsignedcharcodebb[]="ERROR";
unsignedcharcodecc[]="OK";
unsignedcharcodedd[]="";
unsignedcharcodeee
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 24 C04 1602 LCD 设计 电子 密码锁