基于51单片机智能电子密码锁密码箱保险柜系统设计
1 功能介绍
本系统基于STC89C52单片机,结合LCD1602液晶显示、继电器、蜂鸣器、AT24C02存储器、4*4矩阵键盘等电路模块,实现了一个功能较为完善的智能电子密码锁保险柜系统。系统的主要功能包括:
- 密码输入与验证:支持6位数字密码,输入正确后驱动继电器动作,打开锁具。
- 密码设置与修改:在输入原始密码验证成功后,可修改密码,修改时需输入两次相同的新密码进行确认,避免误操作。
- 安全保护功能:若连续输入错误3次密码,系统会自动锁定键盘1分钟,并启动蜂鸣器报警,提示用户注意安全。
- 掉电保存功能:系统利用AT24C02存储器保存密码,即使断电,密码也不会丢失。用户可随时修改并保存新密码。
- 输入清除功能:在密码输入过程中,可以通过清除键逐位删除输入的数字,方便用户操作。
- 液晶背光节能功能:若30秒内无按键输入,LCD背光会自动关闭以节约电能。当检测到按键输入时,背光自动点亮。
- 管理员功能:系统设有管理员密码,当用户忘记密码时,可以通过管理员密码恢复出厂初始密码,避免柜体被永久锁死。
- 强制恢复功能:若管理员密码也遗忘,可通过长按“恢复键”3秒来强制恢复初始密码,避免误操作的同时提供了双重保险。
初始密码:123123
管理员密码:520025
通过这些功能,系统不仅能够保障密码锁的安全性,还能够为用户提供方便、灵活的操作体验。
2 系统电路设计
系统硬件设计由以下几个部分组成:
2.1 单片机最小系统电路
本设计采用STC89C52单片机作为核心控制器。该芯片基于8051内核,具备丰富的I/O口资源,完全能够满足键盘扫描、液晶显示、继电器控制、存储器通信等功能需求。其最小系统主要包括电源电路、时钟电路和复位电路,确保系统稳定运行。
2.2 LCD1602液晶显示电路
LCD1602液晶作为人机交互界面,用于显示提示信息、输入密码状态、报警信息等。通过单片机的IO口与液晶的RS、RW、E以及数据总线相连,实现对液晶的初始化、数据写入、字符显示等操作。
2.3 4*4矩阵键盘电路
矩阵键盘由16个按键组成,用于密码输入、确认、清除、修改密码等功能操作。采用行列扫描的方式,单片机控制行信号,逐行扫描,再读取列信号,以确定按下的按键。
2.4 存储器电路
采用AT24C02存储器作为密码保存模块,支持I²C总线通信。单片机通过SCL和SDA与存储器进行数据交互,将修改后的密码存入EEPROM中,确保掉电后仍能保存密码信息。
2.5 继电器驱动电路
继电器作为锁具的执行器件,由单片机输出IO口通过三极管驱动。当密码输入正确时,单片机输出高电平,驱动继电器吸合,从而打开锁具。
2.6 蜂鸣器报警电路
蜂鸣器作为报警提示器件,与单片机IO口相连。当密码错误达到3次或系统进入报警状态时,单片机输出信号控制蜂鸣器鸣叫,提示用户注意。
2.7 电源电路
电源电路提供稳定的+5V直流电压,供单片机、液晶、存储器和外围电路使用。通过电源滤波和稳压电路保证系统的稳定性。
3 程序设计
系统程序设计主要包括初始化程序、键盘扫描程序、LCD显示程序、存储器读写程序、密码验证程序以及报警控制程序。以下对各部分程序进行详细介绍。
3.1 主程序设计
主程序作为系统的核心逻辑,负责调用各个子模块程序,并根据状态进行控制。
#include <reg52.h>
#include "lcd1602.h"
#include "keypad.h"
#include "at24c02.h"
#include "delay.h"
unsigned char input_pwd[6];
unsigned char saved_pwd[6];
unsigned char admin_pwd[6] = {5,2,0,0,2,5};
unsigned char error_count = 0;
void main() {
lcd_init();
at24c02_read(saved_pwd, 0, 6); // 从EEPROM读取密码
lcd_show_string(0, 0, "Password Lock");
delay_ms(1000);
while(1) {
get_password(input_pwd); // 获取输入密码
if(check_password(input_pwd, saved_pwd)) {
lcd_clear();
lcd_show_string(0, 0, "Unlock Success");
relay_on();
delay_ms(5000);
relay_off();
} else {
error_count++;
lcd_clear();
lcd_show_string(0, 0, "Error Password");
buzzer_on();
delay_ms(1000);
buzzer_off();
if(error_count >= 3) {
lock_system(); // 锁定系统
}
}
}
}
3.2 键盘扫描程序
键盘扫描用于检测用户输入的按键,支持数字、确认、清除等操作。
unsigned char key_scan() {
unsigned char row, col, key = 0xFF;
for(row = 0; row < 4; row++) {
P1 = ~(0x01 << row);
col = P1 & 0xF0;
if(col != 0xF0) {
delay_ms(10);
col = P1 & 0xF0;
if(col != 0xF0) {
key = row * 4 + (col >> 4);
while(P1 != 0xF0);
}
}
}
return key;
}
3.3 LCD1602显示程序
液晶显示用于提示用户输入状态和显示相关信息。
void lcd_show_password(unsigned char *pwd, unsigned char len) {
unsigned char i;
lcd_set_cursor(1, 0);
for(i = 0; i < len; i++) {
lcd_write_data('*');
}
}
3.4 AT24C02存储器程序
用于密码的掉电保存与读取。
void save_password(unsigned char *pwd) {
unsigned char i;
for(i = 0; i < 6; i++) {
at24c02_write(i, pwd[i]);
delay_ms(5);
}
}
void load_password(unsigned char *pwd) {
unsigned char i;
for(i = 0; i < 6; i++) {
pwd[i] = at24c02_read(i);
}
}
3.5 密码验证程序
bit check_password(unsigned char *input, unsigned char *saved) {
unsigned char i;
for(i = 0; i < 6; i++) {
if(input[i] != saved[i]) return 0;
}
return 1;
}
3.6 报警与锁定程序
void lock_system() {
unsigned int i;
lcd_clear();
lcd_show_string(0, 0, "System Locked");
for(i = 0; i < 60; i++) {
buzzer_on();
delay_ms(500);
buzzer_off();
delay_ms(500);
}
error_count = 0;
}
4 总结
本设计基于STC89C52单片机,实现了一个功能丰富、操作灵活且安全性高的智能电子密码锁系统。通过液晶显示、矩阵键盘、继电器、蜂鸣器和存储器的配合,系统能够支持密码输入与验证、密码修改、掉电保存、错误报警以及管理员恢复功能。特别是双重保护机制的设计,增强了系统的实用性和安全性。
该设计不仅能够用于家庭保险柜、智能箱包等小型场景,还可以扩展到更大规模的智能门锁系统,为用户提供更高效、更安全的使用体验。