文件下载: https://pan.baidu.com/s/1w6HWKA10vBrL-WGnBWk3Mg?pwd=gmm6 提取码: gmm6
摘要:本文介绍一款基于AT89C51单片机的智能密码锁系统,支持6位密码输入、错误报警、锁定倒计时等功能。代码经过实测验证,可直接用于课程设计或电子竞赛。


一、硬件组成
  1. 核心控制器:AT89C51单片机
  2. 输入模块:4x4矩阵键盘(共用P1口)
  3. 显示模块:LCD1602液晶屏(RS-P2.7, RW-P2.6, EN-P2.5)
  4. 状态指示
    • 蜂鸣器(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);
            }
        }
    }
}

仿真图
在这里插入图片描述

三、核心功能说明
  1. 密码输入
    • 按0-9数字键输入6位密码,LCD显示*号隐藏内容
    • 按#确认:验证正确显示"Welcome!"并亮LED,错误超3次触发60秒锁定

  2. 锁定保护
    • 3次错误输入后启动倒计时,LCD显示剩余时间
    • 倒计时结束自动复位,恢复正常输入

  3. 扩展功能预留
    • 按*键可进入密码设置模式(需自行完善存储逻辑)


四、部署说明
  1. 硬件连接
    • 按注释连接LCD、键盘、蜂鸣器、LED至指定IO口
    • 注意P1口需分时复用(键盘与LCD数据线共用)

  2. 代码使用
    • 需配套key.h(矩阵键盘扫描)、lcd.h(LCD驱动)头文件
    • 推荐使用Keil C51编译,烧录至AT89C51单片机


五、总结与扩展

本项目实现了密码锁的基础功能,适合单片机初学者学习外设控制、状态机设计等核心知识。可扩展方向包括:
• 添加AT24C02芯片实现掉电保存密码
• 集成继电器模块控制真实电磁锁
• 增加蓝牙/WiFi模块支持手机远程控制


声明:本文代码经过Proteus仿真验证,实际部署需注意硬件电流匹配问题。原创内容转载请注明出处。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐