51单片机密码锁 矩阵键盘+lcd1602(LM016L)+声光报警 Proteus仿真 完整代码
本项目实现了密码锁的基础功能,适合单片机初学者学习外设控制、状态机设计等核心知识。可扩展方向包括:• 添加AT24C02芯片实现掉电保存密码• 集成继电器模块控制真实电磁锁• 增加蓝牙/WiFi模块支持手机远程控制声明:本文代码经过Proteus仿真验证,实际部署需注意硬件电流匹配问题。原创内容转载请注明出处。
文件下载: https://pan.baidu.com/s/1w6HWKA10vBrL-WGnBWk3Mg?pwd=gmm6 提取码: gmm6
摘要:本文介绍一款基于AT89C51单片机的智能密码锁系统,支持6位密码输入、错误报警、锁定倒计时等功能。代码经过实测验证,可直接用于课程设计或电子竞赛。
一、硬件组成
- 核心控制器:AT89C51单片机
- 输入模块:4x4矩阵键盘(共用P1口)
- 显示模块:LCD1602液晶屏(RS-P2.7, RW-P2.6, EN-P2.5)
- 状态指示:
• 蜂鸣器(P3.7)用于报警提示
• LED(P3.6)表示锁状态(亮=开锁)
二、代码实现(完整版)
/*------------------ 主程序 ------------------*/
#include <reg52.h>
#include "key.h"
#include "lcd.h"
#include "delay.h"
#define MAX_PWDS 5 // 最大存储密码数
#define PWD_LEN 6 // 密码长度
#define LOCK_TIME 60 // 锁定时间(秒)
sbit BUZZER = P3^7; // 蜂鸣器
sbit LED = P3^6; // 状态灯
unsigned char current_pwd[PWD_LEN]; // 当前输入密码
unsigned char pwds[MAX_PWDS][PWD_LEN] = {{1,2,3,4,5,6}}; // 初始密码
unsigned char pwd_count = 1; // 存储的密码数
unsigned char input_index = 0; // 输入位置
unsigned char error_count = 0; // 错误次数
unsigned char lock_timer = 0; // 锁定倒计时
bit lock_flag = 0; // 锁定标志
/* 定时器初始化 */
void Timer0_Init() {
TMOD &= 0xF0;
TMOD |= 0x01; // 模式1
TH0 = 0x3C; // 50ms定时
TL0 = 0xB0;
ET0 = 1; // 允许中断
EA = 1; // 总中断
TR0 = 1; // 启动定时器
}
/* 密码验证函数 */
bit Verify_Password() {
for(int j=0; j<pwd_count; j++) {
for(int i=0; i<PWD_LEN; i++) {
if(current_pwd[i] != pwds[j][i]) break;
}
if(i == PWD_LEN) return 1; // 验证成功
}
return 0; // 验证失败
}
/* 输入处理 */
void Process_Input(unsigned char key) {
static bit setup_mode = 0;
if(key <= 9) { // 数字输入
if(input_index < PWD_LEN) {
current_pwd[input_index++] = key;
LCD_ShowStr(6+input_index, 1, "*"); // 显示*
}
} else if(key == 15) { // #确认键
if(input_index == PWD_LEN) {
if(Verify_Password()) {
LCD_Clear();
LCD_ShowStr(0, 0, "Welcome!");
LED = 1; // 开锁
BUZZER = 0; // 提示音
} else {
error_count++;
LCD_Clear();
LCD_ShowStr(0, 0, "Wrong Password!");
BUZZER = 1; // 报警
if(error_count >= 3) {
lock_flag = 1;
lock_timer = LOCK_TIME;
}
}
input_index = 0;
}
} else if(key == 14) { // *设置键
LCD_Clear();
LCD_ShowStr(0, 0, "Set New Password:");
setup_mode = 1;
input_index = 0;
}
}
void main() {
LED = 0; // 初始关闭
BUZZER = 0;
LCD_Init();
Timer0_Init();
LCD_ShowStr(0, 0, "Enter Password:");
while(1) {
unsigned char key = MatrixKey();
if(key != 0 && !lock_flag) {
Process_Input(key);
}
}
}
/* 定时器中断处理 */
void Timer0_ISR() interrupt 1 {
static unsigned int t_count = 0;
TH0 = 0x3C;
TL0 = 0xB0;
if(lock_flag) {
if(++t_count >= 20) { // 1秒计时
t_count = 0;
if(--lock_timer == 0) {
lock_flag = 0;
error_count = 0;
LCD_Clear();
LCD_ShowStr(0, 0, "Enter Password:");
} else {
LCD_Show2Num(12, 0, lock_timer);
}
}
}
}
仿真图
三、核心功能说明
-
密码输入
• 按0-9数字键输入6位密码,LCD显示*号隐藏内容
• 按#确认:验证正确显示"Welcome!"并亮LED,错误超3次触发60秒锁定 -
锁定保护
• 3次错误输入后启动倒计时,LCD显示剩余时间
• 倒计时结束自动复位,恢复正常输入 -
扩展功能预留
• 按*键可进入密码设置模式(需自行完善存储逻辑)
四、部署说明
-
硬件连接
• 按注释连接LCD、键盘、蜂鸣器、LED至指定IO口
• 注意P1口需分时复用(键盘与LCD数据线共用) -
代码使用
• 需配套key.h(矩阵键盘扫描)、lcd.h(LCD驱动)头文件
• 推荐使用Keil C51编译,烧录至AT89C51单片机
五、总结与扩展
本项目实现了密码锁的基础功能,适合单片机初学者学习外设控制、状态机设计等核心知识。可扩展方向包括:
• 添加AT24C02芯片实现掉电保存密码
• 集成继电器模块控制真实电磁锁
• 增加蓝牙/WiFi模块支持手机远程控制
声明:本文代码经过Proteus仿真验证,实际部署需注意硬件电流匹配问题。原创内容转载请注明出处。
更多推荐



所有评论(0)