基于51单片机设计的智能六位密码锁
演示视频
基于51单片机设计的智能六位密码锁
功能简介
-
能够从键盘中输入密码,并相应地在显示器上显示"*"
-
能够判断密码是否正确,正确则开锁,错误则输出相应信息
-
能够实现密码的修改
-
在操作错误到达一定次数后能够报警
-
备用密码为,初始密码,在功能上实用性更强,利用中断按钮清除用户密码,恢复初始密码
-
断电或者单片机复位后能够保存之前的操作,如初密码
摘要: 本文介绍了一种基于AT89C51单片机的密码锁系统的综合设计与实现。该系统结合硬件和软件组件,提供了一种安全且用户友好的访问控制解决方案。硬件设计包括用于密码输入的键盘、用户界面的液晶显示器和用于报警功能的蜂鸣器。软件部分负责密码验证、用户交互和安全功能。本文详细描述了该系统的原理图、电路设计、软件算法和功能测试。
目录
[第一章 引言](#第一章 引言)
[第二章 硬件设计](#第二章 硬件设计)
[2.1 AT89C51单片机](#2.1 AT89C51单片机)
[2.2 键盘矩阵](#2.2 键盘矩阵)
[2.3 LCD1602液晶显示器](#2.3 LCD1602液晶显示器)
[2.4 蜂鸣器](#2.4 蜂鸣器)
[2.5 24C02 EEPROM](#2.5 24C02 EEPROM)
[第三章 软件设计](#第三章 软件设计)
[3.1 初始化](#3.1 初始化)
[3.2 密码输入与验证](#3.2 密码输入与验证)
[3.3 报警功能](#3.3 报警功能)
[3.4 密码修改](#3.4 密码修改)
[第四章 功能测试](#第四章 功能测试)
[4.1 密码输入测试](#4.1 密码输入测试)
[4.2 密码验证测试](#4.2 密码验证测试)
[4.3 密码修改测试](#4.3 密码修改测试)
[4.4 报警功能测试](#4.4 报警功能测试)
[第五章 总结](#第五章 总结)
第一章 引言
密码锁系统在许多场景中广泛应用,例如家庭安全、办公室门禁和保险箱等。一个可靠的密码锁系统不仅需要硬件的稳定性,还需要软件的灵活性和安全性。本文通过详细的设计和实现,展示了如何构建一个基于AT89C51单片机的密码锁系统。功能简介:能够从键盘中输入密码,并相应地在显示器上显示"*";能够判断密码是否正确,正确则开锁,错误则输出相应信息; 能够实现密码的修改;在操作错误到达一定次数后能够报警;备用密码为,初始密码,在功能上实用性更强,利用中断按钮清除用户密码,恢复初始密码;断电或者单片机复位后能够保存之前的操作,如初密码。
图-系统整体框图
第二章 硬件设计
图-系统仿真电路
硬件设计包括以下主要部分:
- AT89C51单片机:系统的核心控制单元。
- 键盘矩阵:用于用户输入密码。
- LCD1602液晶显示器:用于显示操作提示和反馈信息。
- 蜂鸣器:用于报警提示。
- 24C02 EEPROM:用于存储密码。
2.1 AT89C51单片机
AT89C51单片机是整个系统的核心控制单元,负责处理输入、控制输出并进行密码验证。其主要特性包括:
- 8位处理器,支持多种I/O操作
- 内置128字节RAM和4KB ROM
- 支持串行通讯接口
AT89C51单片机引脚示意图如下:
- VCC (40): 电源正极
- GND (20): 电源负极
- XTAL1 (19) 和 XTAL2 (18): 接外部晶振
- P0.0 - P0.7 (39 - 32): 8位双向I/O口,用于数据总线
- P1.0 - P1.7 (1 - 8): 8位双向I/O口,用于控制信号
- P2.0 - P2.7 (21 - 28): 8位双向I/O口,用于地址总线
- P3.0 - P3.7 (10 - 17): 8位双向I/O口,用于特殊功能
2.2 键盘矩阵
键盘矩阵用于用户输入密码,采用4x4矩阵设计,共有16个按键。每个按键对应一个数字或功能,如下表所示:
行\列 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
0 | 1 | 2 | 3 | A |
1 | 4 | 5 | 6 | B |
2 | 7 | 8 | 9 | C |
3 | * | 0 | # | D |
键盘矩阵的每一行和每一列都连接到单片机的I/O口,通过扫描行和列来检测按键的状态。例如,行0连接到P1.0,列0连接到P1.4。当按键1被按下时,P1.0将被拉低,通过读取P1.4的状态来确定按键1被按下。
2.3 LCD1602液晶显示器
LCD1602液晶显示器用于显示操作提示和反馈信息,连接到单片机的P2口。它支持16x2字符显示,提供了基本的显示功能。LCD1602的引脚连接如下:
- VSS (1): 接地
- VDD (2): 电源正极
- VO (3): 对比度调整端,接一个可变电阻
- RS (4): 寄存器选择信号,接P2.7
- RW (5): 读/写选择信号,接P2.6
- E (6): 使能信号,接P2.5
- D0-D7 (7-14): 数据总线,接P0.0-P0.7
- A (15): 背光电源正极
- K (16): 背光电源负极
液晶显示器的初始化和显示字符由软件控制,通过发送命令和数据来实现。
2.4 蜂鸣器
蜂鸣器用于提示用户输入错误或系统报警,连接到单片机的P2.4口。当输入错误次数达到设定值时,蜂鸣器会响起警报声。蜂鸣器的引脚连接如下:
- 正极: 接P2.4
- 负极: 接地
通过控制P2.4的电平来控制蜂鸣器的开关,当P2.4输出高电平时,蜂鸣器响起;当P2.4输出低电平时,蜂鸣器关闭。
2.5 24C02 EEPROM
24C02 EEPROM用于存储和读取密码,通过I2C接口与单片机连接。EEPROM具有非易失性存储特性,断电后数据不会丢失。24C02的引脚连接如下:
- A0-A2 (1-3): 地址选择引脚,接地
- GND (4): 接地
- SDA (5): 数据线,接P2.1
- SCL (6): 时钟线,接P2.0
- WP (7): 写保护引脚,接地
- VCC (8): 电源正极
通过I2C总线协议与24C02通信,可以实现对EEPROM的读写操作。
第三章 软件设计
软件部分采用C语言编写,主要实现以下功能:
- 初始化:包括I2C总线初始化、LCD初始化和密码初始化。
- 密码输入与验证:通过键盘输入密码,并与存储的密码进行比较。
- 报警功能:当输入密码错误次数超过设定值时,触发报警。
- 密码修改:允许用户通过按键输入新密码并进行存储。
3.1 初始化
初始化函数包括I2C总线初始化、LCD初始化和密码初始化。具体代码如下:
void chushi() {
SDA = 1;
delay2();
SCL = 1;
delay2();
}
void LCD1602_init() {
E = 0;
write_com(0x38); // 设置16x2显示,5x7点阵,8位数据口
write_com(0x0c); // 设置开显示,不显示光标
write_com(0x06); // 写一个字符后地址指针加1
write_com(0x01); // 显示清0,数据指针清0
}
3.2 密码输入与验证
密码输入函数通过键盘矩阵扫描实现,密码验证函数将输入的密码与存储的密码进行比较。具体代码如下:
bit input_mima(uchar *mima) {
uchar i, key;
LCD1602_pos(1, 0);
for (i = 0; i < 7; i++) {
delay1(100);
if (i < 6) {
do {
key = keyscan();
} while (key == 0xff);
if ((key != 0x0f) && (key != 0x0a) && (key != 0x0c)) {
write_date('*');
mima[i] = key;
}
if (key == 0x0f) {
if (i > 0) {
LCD1602_pos(1, --i);
write_date(' ');
mima[i] = ' ';
LCD1602_pos(1, i);
i--;
}
}
if (key == 0x0c) {
LCD1602_pos(0, 0);
return 0;
}
}
if (i == 6) {
do {
key = keyscan();
} while ((key != 0x0f) && (key != 0x0c));
if (key == 0x0f) {
LCD1602_pos(1, --i);
write_date(' ');
mima[i] = ' ';
LCD1602_pos(1, i);
i--;
}
if (key == 0x0c) {
return 1;
}
}
}
}
3.3 报警功能
当输入密码错误次数超过设定值时,触发蜂鸣器报警。具体代码如下:
void baojing2() {
uchar i;
for (i = 0; i < 10; i++) {
baojing1();
}
}
3.4 密码修改
用户可以通过按键输入新密码并进行存储,具体代码如下:
void sfj2() {
uchar key, i;
uchar idata table2[6] = {' ', ' ', ' ', ' ', ' ', ' '};
uchar idata table3[6] = {' ', ' ', ' ', ' ', ' ', ' '};
uchar idata table4[6] = {' ', ' ', ' ', ' ', ' ', ' '};
key = step_choose();
if (key == 0x0b) {
read_n_add(table2, 0x00, 6);
write_com(0x06);
write_com(0x01);
write_com(0x0f);
LCD1602_pos(0, 0);
write_n_char("input password");
write_com(0x0f);
if (input_mima(table3)) {
if (sfj1(table3, table1) || sfj1(table3, table2)) {
LCD1602_pos(0, 0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password right ");
aa = 0;
delay1(500);
dd = 1;
while (dd) {
write_com(0x06);
write_com(0x01);
write_com(0x0f);
LCD1602_pos(0, 0);
write_n_char("In new password");
delay1(500);
if (input_mima(table3)) {
LCD1602_pos(0, 0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("Input new pass");
LCD1602_pos(1, 0);
write_n_char("word again");
delay1(800);
LCD1602_pos(0, 0);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
write_n_char("In new password");
if (input_mima(table4)) {
if (sfj1(table3, table4)) {
LCD1602_pos(0, 0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password has");
LCD1602_pos(1, 0);
write_n_char("change already");
write_n_add(table4, 0x00, 6);
delay1(1000);
dd = 0;
} else {
LCD1602_pos(0, 0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay1(600);
aa++;
if (aa == 4) {
aa = 0;
i = 20;
while (i--)
baojing2();
}
dd = 0;
}
} else {
LCD1602_pos(0, 0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay1(600);
aa++;
if (aa == 4) {
aa = 0;
i = 20;
while (i--)
baojing2();
}
}
} else {
LCD1602_pos(0, 0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay1(600);
dd = 0;
aa++;
if (aa == 4) {
aa = 0;
i = 20;
while (i--)
baojing2();
}
}
}
} else {
LCD1602_pos(0, 0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay1(600);
aa++;
if (aa == 4) {
aa = 0;
i = 20;
while (i--)
baojing2();
}
}
} else {
LCD1602_pos(0, 0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay1(600);
aa++;
if (aa == 4) {
aa = 0;
i = 20;
while (i--)
baojing2();
}
}
}
}
第四章 功能测试
系统功能测试包括密码输入、密码验证、密码修改和报警功能的测试。测试环境搭建包括硬件连接和软件编译。
4.1 密码输入测试
通过键盘输入密码,LCD显示"*"号,验证密码输入功能。
4.2 密码验证测试
输入正确密码,系统显示"password right",开锁并响一声提示。输入错误密码,系统显示"password wrong",记录错误次数,超过三次触发报警。
4.3 密码修改测试
通过按键进入密码修改模式,输入新密码并确认,系统显示"password has change already",新密码成功存储。
4.4 报警功能测试
连续输入错误密码三次,蜂鸣器连续报警,测试报警功能。
第五章 总结
本文详细介绍了基于AT89C51单片机的密码锁系统的设计与实现。系统通过硬件电路和软件算法的结合,实现了密码输入、密码验证、密码修改和报警等功能。测试结果表明,系统稳定可靠,具备良好的实用性和安全性。未来的改进方向包括增加无线通信功能,实现远程控制和管理。