1 概述
1.1 选题背景
安全是现代社会更加关注的现象之一。盗窃事件常有发生,因此更需要一种工具来维护门户安全。在此之前,挂锁、子弹锁和插入式锁被广泛使用。这些锁结构简单、安全性低。撬锁入室和入室盗窃的案件越来越多。因此,我们的团队设计了一款电子智能密码锁。产品的设计主要考虑了保证人们安全使用、使用方便、使用方便等综合因素。电路产品设计包括防探键盘输入、智能控制解锁、锁定、报警、密码重置等功能。其次,由于采用多位密钥设置,具有保密性好、灵敏度高等优点。
1.2 方案描述
(1)输入密码功能。输入密码时,用“*”代替真实的密码以防密码泄露。在输入密码时,具有清除前一位/或多位的密码功能(用清除键)。密码输入完毕,按(确认/开锁键)确认并生效。
(2)上锁功能。在锁开状态下,通过上锁键上锁。
(3)在锁合的状态下,通过输入密码开锁功能。开锁时,先按确认/开锁键后,再在键盘上输入六位密码,然后按确认/开锁键,如果密码正确,进入锁开状态。
(4)在锁开状态下,设置新密码功能。按设置新密码键,在键盘上输入六位新的密码,按(确认/开锁)键确认,代替旧密码。
(5)在开锁时,如果输入密码三次错误,产生声、光报警功能。每错误一次,告警一次, 若连续三次错误,则系统屏蔽输入功能,直到系统复位后重新开始。
1.3 设计的目的
在信息产业迅速发展的今天,我们生活中必不可少的设备都向着小型化、微型化、智能化、自动化的方向发展。避免用钥匙开启旋芯式锁的一切烦恼。安全性能高,成本低,功耗低,易操作,从而实现了对锁的电子控制,突破了传统的机械锁的单一性,保密性低,易撬性的缺点,具有使用灵活性好,安全系数高的优点。它的主要工作部分是将输入密码与设定密码进行比较,密码正确时,控制继电器开锁,密码错误时,数码管清屏,继电器保持关闭状态。它的电路结构简单,密码破译难度较大,操作简单。
2 方案设计
2.1 硬件选择
基于AT89C51单片机的电子密码锁硬件设计选用AT89C51单片机作为本设计的核心元件, 于AT89C51单片机的电子密码锁硬件设计利用AT89C51单片机灵活的编程设计和丰富的I/O端口, 及其控制的准确性, 基于AT89C51单片机的电子密码锁实现基本的密码锁功能。在AT89C51单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,基于AT89C51单片机的电子密码锁硬件设计选用LM016L用于显示作用。
2.2 功能介绍
当用户需要开锁时, 先按基于AT89C51单片机的电子密码锁的键盘开锁键之后按键盘的数字键0-9输入密码。基于AT89C51单片机的电子密码锁的密码输完后按下确认键, 如果基于AT89C51单片机的电子密码锁的密码输入正确则开锁, 不正确显示密码错误重新输入密码, 当三次密码错误则发出报警;当用户需要修改基于AT89C51单片机的电子密码锁的密码时, 先按下基于AT89C51单片机的电子密码锁的键盘设置键后可以设置新密码。新密码输入无误后按基于AT89C51单片机的电子密码锁的确认键使新密码将得到存储, 密码修改成功。
2.3 总体设计
图2-1 电子密码锁结构框架图
3 硬件设置
3.1 硬件组成
基于AT89C51单片机的电子密码锁的外围电路包括基于AT89C51单片机的电子密码锁键盘输入部分、基于AT89C51单片机的电子密码锁的显示部分、基于AT89C51单片机的电子密码锁的报警部分、基于AT89C51单片机的电子密码锁的开锁知识部分组成, 根据基于AT89C51单片机的电子密码锁的实际情况键盘输入部分选择4*4矩阵键盘, 基于AT89C51单片机的电子密码锁的显示部分选择字符型液晶显示LM016L。
3.2 LCD显示器设置
LM016L液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。
图3-1 LCD显示器
3.3 矩阵按键电路设计
本设计中采用的4*4矩阵共有16个键位,4根行线连PI口低4位,4根列线连PI口高4位。在按键未被按下时,每条行线与列线的交叉处互不相通,当莫格按键被按下后,该键所在的行线和列线连通。这样PI口的高4位和低4位中各有一位互相连通。通过行列扫描检测出这两位,即可识别出被按下的键。
图3-2 矩阵按键设计
基于AT89C51单片机的电子密码锁的输入密码输入过程中可以进行退格, 输入完成后按下确认键, 电子密码锁会将所输入与系统密码进行比对。若输入密码正确则显示“Open”开锁, 按下电子密码锁的B选择上锁, 锁重新回到闭锁状态, 电子密码锁LCD液晶显示回到初始化状态。电子密码锁如果密码输入错误, 基于AT89C51单片机的电子密码锁的错误警告灯亮,电子密码锁的LCD液晶显示器会显示错误, 并显示输入错误限制次数。一段时间后, 进入闭锁状态。若连续在电子密码锁上操作错误超过3次, 一定时间内电子密码锁的系统会锁定键盘, 并报警用以防止恶意试探密码。如果在规定次数以内密码输入正确, 则锁开, 且错误次数清空, 不会影响到下一次的开锁。
3.4 报警器设置
蜂鸣器模块部分的电路如下图3-2 报警器设置,就是用P2.1口控制一个有源蜂鸣器发声,作为提示音或报警音。蜂鸣器有两个引脚,其中长脚为正极,短脚为负极。其发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它。由于单片机I/O引脚输出的电流较小,基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路,一般使用三极管来放大电流就可以了。本设计中使用三极管,P2.1口高电平时三极管截至,蜂鸣器不发声;P2.1口低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P2.1脚的电平来使蜂鸣器发出声音和关闭。
图3-3 报警器设置
3.5 系统电路设置
下图为基于AT89C51单片机的电子密码锁的系统主电路图:
图3-4 电子密码锁主电路
4 程序设计
4.1 系统流程
系统初始化并读取密码完成后,液晶显示"Password:”,提示用户可以输入密码。此时程序即不断测试按键,检査是否有按鍵被按下。如果有,则进行按键识别:行列扫描法识别出的键位与对应BUFF的值。如果没有按键按下,或者按下的按键没有被识别,BUFF赋值0FFH,并跳转至按键测试。
4.2 源程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define GPIO_KEY P1
sbit RS=P2^2;
sbit RW=P2^3;
sbit E=P2^4;
sbit LED = P2^0;
sbit BEEZ = P2^1;
uchar welcome[]="Hello Welcom";
uchar pw_error[]="Password Error";
uchar Lock[]="XXXXXXXXXXXXXXXX";
uchar set_pw[]="Set PassWord";
uchar input_pw[]="Please Input";
uchar pw[6]={0,0,0,0,0,0};
uchar temp_pw[6]={0,0,0,0,0,0};
uchar KeyValue;
uchar flag=0;
uchar pw_count;
uchar pw_errnum=0;
void lcd_int();
void lcd_w_cmd(unsigned char com);
void lcd_w_dat(unsigned char dat);
unsigned char lcd_r_start();
void show_Status(uchar *str);
void show_pw(uchar num);
void Input_Key();
void KeyDown(void);
void open();
void alarm();
void Lock_Device();
void delay(uint j)
{ uint x;
for(x=0;x
}
void main()
{ lcd_int();
show_Status(&input_pw);
show_pw(0);
while(1){
Input_Key();
}
}
void KeyDown(void)
{
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{ delay(3);
if(GPIO_KEY!=0x0f)
{ GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while(GPIO_KEY!=0xf0);
return ;
}
}
KeyValue = 0xff;
}
void open() { }
void alarm()
{ uchar i;
LED = 0;
for(i = 0;i<100;i++)
{ BEEZ = ~BEEZ;
delay(100);
}
LED = 1;
}
void Lock_Device()
{ while(1)
{ alarm();
}
}
void Input_Key()
{ KeyDown();
if(KeyValue == 0xff||pw_errnum>=3)return;
if(KeyValue>=0&&KeyValue<=9)
{ if((flag == 0 || flag ==2)&&pw_count<6)
{ pw_count++;
temp_pw[pw_count] = KeyValue;
show_pw(pw_count);
}
}
else if(KeyValue == 12)
{ if(flag == 1)
{ flag = 0;
show_Status(&input_pw);
}
}
else if(KeyValue == 13)
{ if(pw_count>0)pw_count--;
show_pw(pw_count);
}
else if(KeyValue == 14)
{ if(pw_count == 6)
{ if(flag == 0)
{if(temp_pw[0] == pw[0]&&temp_pw[1] == pw[1]&&temp_pw[2] == pw[2]&&temp_pw[3] == pw[3]&&temp_pw[4] == pw[4]&&temp_pw[5] == pw[5]){
show_Status(&welcome);
flag = 1;
pw_count = 0;
pw_errnum = 0;
show_pw(pw_count);
open();
}
else{ pw_errnum++;
pw_count = 0;
show_pw(pw_count);
show_Status(&pw_error);
alarm();
if(pw_errnum>=3)
{ show_Status(&Lock);
Lock_Device();
}
}
}
else if(flag == 1)
{ }
else if(flag == 2)
{ pw[0] = temp_pw[0];
pw[1] = temp_pw[1];
pw[2] = temp_pw[2];
pw[3] = temp_pw[3];
pw[4] = temp_pw[4];
pw[5] = temp_pw[5];
show_Status(&welcome);
flag = 1; pw_count = 0; show_pw(pw_count);
}
}else{ LED = 0;
}
}
else if(KeyValue == 15)
{ if(flag == 1)
{ show_Status(set_pw);
flag = 2;
}
}
}
void show_pw(uchar num)
{ uchar i;
lcd_w_cmd(0xC5);
for(i=0;i<6;i++)
{ lcd_w_dat(' ');
}
lcd_w_cmd(0xC5);
for(i=0;i
{ lcd_w_dat('*');
}
}
void show_Status(uchar *str)
{ uchar i=0;
lcd_w_cmd(0x80);
for(i=0;str[i]!='\\0';i++)
{ lcd_w_dat(str[i]);
}
}
void lcd_int()
{ lcd_w_cmd(0x3c);
lcd_w_cmd(0x0c);
lcd_w_cmd(0x01);
lcd_w_cmd(0x06);
lcd_w_cmd(0x80);
}
void lcd_w_cmd(unsigned char com)
{ unsigned char i;
do
{i=lcd_r_start();
i&=0x80;
delay(2);
}while(i!=0);
RW=0;
delay(1);
RS=0;
delay(1);
E=1;
delay(1);
P0=com;
delay(1);
E=0;
delay(1);
RW=1;
delay(2);
}
void lcd_w_dat(unsigned char dat)
{ unsigned char i;
do
{i=lcd_r_start();
i&=0x80;
delay(2);
}while(i!=0);
RW=0;
delay(1);
RS=1;
delay(1);
E=1;
delay(1);
P0=dat;
delay(1)
E=0;
delay(1);
RW=1;
delay(2);
}
unsigned char lcd_r_start()
{ unsigned char s;
RW=1;
delay(1);
RS=0;
delay(1);
E=1;
delay(1);
s=P0;
delay(1);
E=0;
delay(1);
RW=0;
delay(1);
return(s);
}
5 仿真测试
(1)点击proteus软件下方最左边按钮,使电路开始运行,图5-1为电路运行后状态,LCD液晶显示出Please Input,输入密码进行开锁:
图5-1 初始化界面
(2)通过矩阵按键,输入数据,会显示在LCD液晶上,按C按键可以删除上个输入数字。连续输入6个数后,按D键系统自动判断密码的对错,如图 5-2输入错误密码后,会提示密码错误,并提示点击任意按键退出:
图5-2 输入错误密码
(3)按键输入000000后,LCD液晶会显示密码正确,同时LED“锁”被打开,LED显示Hello Welcome:
图5-3 输入正确密码
(4)在开锁状态下,点击F键,此时听到两声提示,输入新的六位密码并按“D”(重设)键,会听到两声提示音,表示重设密码成功。
图5-4 重新设置密码
-
继电器
+关注
关注
132文章
5354浏览量
149129 -
控制器
+关注
关注
112文章
16389浏览量
178436 -
LCD显示器
+关注
关注
0文章
87浏览量
20205 -
AT89C51单片机
+关注
关注
1文章
56浏览量
18078
发布评论请先 登录
相关推荐
评论