电子密码锁

137 阅读7分钟

1. 系统介绍****

采用STC89C52作为主控芯片,结合矩阵按键输入模块、数码管显示模块、LCD1602液晶显示、LED、蜂鸣器报警器等电路模块实现开锁、上锁、报警、密码更改等功能,设计一款可修改密码且具有报警功能的液晶显示电子密码锁。主要由STM32单片机+最小系统+LCD1602液晶显示模块+ +LED指示灯模块+矩阵键盘模块。

1)       器件选择

序号器件编号Proteus器件名称器件性质参数及说明
1U1AT89C51单片机12MHz
2D1-D2LED发光二极管red,green
3R1-R2RES电阻470欧
4LCD1LMO16L液晶显示屏/
5K0-K9,KA,KBBUTTON按钮开关置数

2)       功能

(1)输入密码功能。
输入密码时,具有清除前一位/或多位的密码功能(用清除键)。
密码输入完毕,按(确认/开锁键)确认并生效。
(2)上锁功能。
在锁开状态下,通过上锁键上锁。
(3)在锁合的状态下,通过输入密码开锁功能。
开锁时,先按确认/开锁键后,再在键盘上输入六位密码,然后按
确认/开锁键,如果密码正确,进入锁开状态。
(4)在锁开状态下,设置新密码功能。
按设置新密码键,在键盘上输入六位新的密码,按(确认/开锁)
键确认,代替旧密码。
(5)在开锁时,如果输入密码三次错误,产生声、光报警功能。
每错误一次,告警一次, 若连续三次错误,则系统屏蔽输入功能,
直到系统复位后重新开始。
程序设计

2. 设计内容****

这里就用到了Proteus。采用STC89C51作为主控芯片,结合矩阵按键输入模块、数码管显示模块、LCD1602液晶显示、LED、蜂鸣器报警器等电路模块实现开锁、上锁、报警、密码更改等功能,设计一款可修改密码且具有报警功能的液晶显示电子密码锁。

主要由STM32单片机+最小系统+LCD1602液晶显示模块+蜂鸣器模块+LED指示灯模块+矩阵键盘模块。
下面是最终的效果:

(1)用4*4组成了 0~12 数字键及确认键、删除键以及其它功能键;

(2)用3位数码管组成了显示电路提示信息。

(3)当密码位输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则开锁(继电器控制或电机控制);

3. 系统框架****

 


4. 流程图****



5. 设计思路和方法****

设计思路:初始化从EEPROM中读取密码,单片机通电即显示首页,按任意键进入功能选择界面,可通过按键移动光标选择直接输入密码登录,或者进行修改密码操作。①直接输入密码登录:通过矩阵按键输入4位数字密码,并存入数组,然后通过该数组与EEPROM读取的密码进行比对,从而判断密码是否正确,如果密码正确则显示登录成功并触发流水灯反馈结果,如果密码错误则显示输入错误并触发蜂鸣器警告,当输入密码次数超过3次则直接返回首页。②将51单片机的头文件和i2c.h的头文件包含进来,对24C02芯片进行读写操作,调用At24c02Write函数将变量、数据写入到对应的地址内,调用 At24c02Read 函数进行读取操作,将从对应地址内读取的值存储在变量中。

LCD1602 初始化

LCD1602驱动的底层协议中几个常用的函数:
① LcdWriteCom():写命令函数,通过此函数向LCD1602写命令。比如:清屏LcdWriteCom(0x01); 设置数据指针起LcdWriteCom(0x80)。
② LcdWriteData():显示函数,在写数据之前需要通过LcdWriteCom()函数告诉要写数据的地址,LCD1602的第一行的16个显示位地址是0x80到0x8f;第二行的地址是0xc0到0xcf。比如在1602的第一行第一位显示数字8:LcdWriteCom(0x80)或LcdWriteData(‘8’)。
③ showString (unsigned char Coordinate,char ptr):ShowString (首地址,字符串)函数在需要显示字符串时使用。比如在第二行第3位开始显示hello:ShowString (0x13,”hello”)。其中首地址的高四位为0则表示在第一排显示,为“1”则在第二排显示。低四位为0则在第0位显示。***

矩阵按键扫描

使用一组键或者一个键盘,由于单片机I/O口较少,当系统中需要用到较多按键时,为了更合理利用单片机的I/O口,一般采用矩阵键盘的方式来实现多按键的矩阵按键P1口的低四位接的4*4矩阵键盘的行,高四位接的矩阵键盘的列。检测矩阵键盘是否有按键按下时:先将P1端口的低四位置1,高四位清零,检测P1端口的状态,如果高四位不为零,则表示有按键按下,并且可以知道是x0-x3哪一列有按键按下,比如P1=0x1f;则第一列有按键按下。此时我们在将P1口第四位清零,高四位置1;检测P1的状态,就知道y0-y3哪一行有按键按下。结合xy就可以知道具体是哪个按键按下。

开锁机构

在基于单片机的电子密码锁设计中,用户需要输入密码,密码正确则发出开锁信号实现开锁。设计中是以发光二极管代替电磁锁,二极管亮代表锁开,因此可以设计一个简单的可以点亮二极管的电路系统代替电磁锁开锁机构。由于单片机I/O口默认为高电平,故初始时二极管不亮,代表锁是闭着的(密码错误)。当用户输入密码并验证正确时,发出开锁信号(二极管点亮)。

 

报警机构

在这次基于单片机的电子密码锁设计中,通过控制蜂鸣器的发音来实现系统的报警功能。蜂鸣器是一种采用直流电压供电的电子讯响器。下图是用蜂鸣器模拟的报警机构仿真图。当P3.7口有脉冲信号输入时,蜂鸣器SOUNDER即会发音。通过控制输入脉冲的频率还能控制蜂鸣器的发音频率。


6. 主程序源代码****

#include <REGX52.H>

#include "Delay.h"

#include "LCD1602.h"

#include "MatrixKey.h"


unsigned char KeyNum;

unsigned int Password,Count;


void main()

{

LCD_Init();

LCD_ShowString(1,1,"Password:");

while(1)

{

KeyNum=MatrixKey();

if(KeyNum)

{

if(KeyNum<=10) // 如果 S1~S10 按键按下,输入密码****

{

if(Count<4)    // 如果输入次数小于 4

{

Password=10;                     //* 密码左移一位****

Password+=KeyNum%10;        // 获取一位密码****

Count++; // 计次加一****

}

LCD_ShowNum(2,1,Password,4);  // 更新显示****

}

if(KeyNum==11) // 如果 S11 按键按下,确认****

{

if(Password==2345)  // 如果密码等于正确密码****

{

LCD_ShowString(1,14,"OK ");      // 显示 OK

Password=0;        // 密码清零****

Count=0;       // 计次清零****

LCD_ShowNum(2,1,Password,4);  // 更新显示****

}

else                       // 否则****

{

LCD_ShowString(1,14,"ERR");    // 显示 ERR

Password=0;        // 密码清零****

Count=0;       // 计次清零****

LCD_ShowNum(2,1,Password,4);  // 更新显示****

}

}

if(KeyNum==12) // 如果 S12 按键按下,取消****

{

Password=0;        // 密码清零****

Count=0;       // 计次清零****

LCD_ShowNum(2,1,Password,4);  // 更新显示****

}

}

}

}

7. 矩阵键盘****

#include <REGX52.H>

#include "Delay.h"


/**

*** @brief** 矩阵键盘读取按键键码****

*** @param** ****

*** @retval KeyNumber** 按下按键的键码值****

****如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回 0

*/

unsigned char MatrixKey()

{

unsigned char KeyNumber=0;


P1=0xFF;

P1_3=0;

if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}

if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}

if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}

if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}


P1=0xFF;

P1_2=0;

if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}

if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}

if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}

if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}


P1=0xFF;

P1_1=0;

if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}

if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}

if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}

if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}


P1=0xFF;

P1_0=0;

if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}

if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}

if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}

if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}


return KeyNumber;

}

8. 实验结果****

1. )初始化界面****


(2)输入密码错误

(3)密码正确提示

9. 参考文献****

感谢江科大单片机教程。****