基于STM32的智能门禁锁系统设计与实现

摘要

本文设计并实现了一套基于STM32F103C8T6单片机的智能门禁锁系统。该系统集成了RFID刷卡、4×4矩阵键盘密码输入、指纹识别三种开锁方式,支持用户信息的添加、删除和断电保存功能。系统采用OLED显示屏进行人机交互,通过蜂鸣器和LED灯提供状态提示,利用继电器控制门锁开关。系统具有高安全性、高可靠性、操作便捷等特点,适用于家庭、办公室等场所的门禁控制。本文详细阐述了系统硬件设计、软件架构及功能实现,通过实验验证了系统的可行性与稳定性。测试结果表明,系统指纹识别准确率达98%,响应时间小于1秒,RFID刷卡识别时间约0.5秒,密码输入验证时间约0.3秒,满足实际应用需求。

关键词:STM32;智能门禁锁;RFID;指纹识别;OLED显示;断电保存

1. 引言

1.1 研究背景与意义

随着物联网技术的快速发展和智能家居概念的普及,传统机械门锁已难以满足现代生活对安全性与便捷性的要求。据统计,全球每年因门锁安全问题导致的财产损失超过百亿美金。传统的门锁依赖钥匙开锁,存在易丢失、易复制、安全性低等问题。此外,传统门锁无法记录开门记录,难以进行安全追溯。

智能门禁锁系统作为智能家居的重要组成部分,通过集成多种身份验证方式、显示模块、报警模块以及控制模块,实现了门禁系统的智能化和便捷化。基于STM32的智能门禁锁系统具有成本低、功耗小、性能稳定等优势,能够满足现代家庭和办公场所的门禁需求。

资料包括:

1.原理图,PCB

2.KEIL工程源码
3.参考lun文
4.指纹模块相关资料等

1.2 系统组成与功能概述

本系统主要由以下部分组成:

  • CPU:STM32F103C8T6单片机,作为系统的核心控制器
  • 复位电路:RC复位电路,确保系统上电时能正常复位
  • 电源指示:LED指示灯,显示系统电源状态
  • 工作指示:LED指示灯,显示系统运行状态
  • 振荡电路:8MHz外部晶振,为系统提供时钟源
  • 蜂鸣器电路:用于开锁成功或失败时的提示
  • 门控锁电路:由继电器和电磁锁组成,控制门锁的开关
  • 出门按钮:用于手动关闭门锁
  • 读卡模块:RC522射频卡模块,用于RFID刷卡识别
  • 显示模块:OLED显示屏,用于显示系统状态和操作提示

系统主要功能包括:

  1. 同时支持指纹、密码、RFID三种开锁方式
  2. 支持用户信息的添加、删除和断电保存
  3. 通过4×4矩阵键盘输入密码,OLED显示屏显示系统状态
  4. 一路继电器控制开关门,蜂鸣器报警,LED灯提示

2. 系统总体设计

2.1 系统架构设计

本系统采用模块化设计思想,将整个系统划分为身份验证模块、用户管理模块、门锁控制模块、人机交互模块和断电保存模块五个主要部分,如图1所示。

图1:智能门禁锁系统架构

2.2 系统功能需求分析

根据智能门禁系统需求,系统需实现以下核心功能:

  1. 身份验证功能

    • 指纹识别:使用AS608指纹模块,识别用户指纹
    • RFID刷卡:使用RC522射频卡模块,读取RFID卡ID
    • 密码输入:使用4×4矩阵键盘,输入密码进行验证
  2. 用户管理功能

    • 添加用户:支持添加指纹、RFID卡、密码三种类型的用户
    • 删除用户:支持删除已添加的用户信息
    • 用户信息断电保存:利用STM32内部Flash存储用户数据,断电后数据不丢失
  3. 门锁控制功能

    • 验证通过后控制继电器开启门锁
    • 门锁开启后延时自动关闭
    • 通过出门按钮实现门锁手动关闭
  4. 人机交互功能

    • OLED显示屏实时显示系统状态和操作提示
    • 4×4矩阵键盘进行输入操作
    • 蜂鸣器和LED灯提供状态提示(成功、失败、报警等)

3. 硬件设计

3.1 主控制器选型

系统主控制器选用STM32F103C8T6单片机,该芯片具有以下优势:

  • 72MHz主频,性能强大
  • 64KB Flash,20KB SRAM,满足系统需求
  • 12位ADC,支持多通道模拟信号采集
  • 丰富的通信接口(UART、I2C、SPI等)
  • 低功耗设计,适合长时间运行

3.2 各模块硬件设计

3.2.1 RFID模块设计

采用RC522射频卡模块,该模块支持ISO14443A标准,工作频率为13.56MHz,可读写Mifare Classic 1K卡。模块通过SPI接口与STM32通信,识别距离约10cm。

RC522与STM32连接电路

  • SCK:SPI时钟线,连接到STM32的PA5
  • MOSI:SPI主出从入线,连接到STM32的PA7
  • MISO:SPI主入从出线,连接到STM32的PA6
  • SDA:SPI片选线,连接到STM32的PB1
  • RST:复位线,连接到STM32的PB0
  • IRQ:中断线,未使用
3.2.2 指纹识别模块设计

采用AS608高性能光学指纹识别模块,内置DSP运算单元,集成指纹识别算法,能高效快速采集图像并识别指纹特征。模块通过UART接口与STM32通信,识别速度约0.3秒。

AS608与STM32连接电路

  • TX:UART发送线,连接到STM32的PA2
  • RX:UART接收线,连接到STM32的PA3
  • VCC:电源正极,连接到5V
  • GND:电源负极,连接到GND
3.2.3 显示模块设计

采用0.96寸OLED显示屏(SSD1306驱动),显示分辨率128×64,支持I2C通信。显示屏用于显示系统状态、操作提示和用户信息。

OLED与STM32连接电路

  • SCL:I2C时钟线,连接到STM32的PB6
  • SDA:I2C数据线,连接到STM32的PB7
  • VCC:电源正极,连接到3.3V
  • GND:电源负极,连接到GND
3.2.4 按键模块设计

采用4×4矩阵键盘,用于输入密码和进行系统操作。矩阵键盘通过GPIO口扫描,支持16个按键功能。

4×4矩阵键盘与STM32连接电路

  • 行线:连接到STM32的PA0-PA3
  • 列线:连接到STM32的PA4-PA7
3.2.5 门锁控制模块设计

采用5V继电器模块,控制电磁锁的开关。继电器通过STM32的GPIO口控制,可承受220V交流电,适合控制门锁电路。

继电器与STM32连接电路

  • IN:控制输入,连接到STM32的PB8
  • VCC:电源正极,连接到5V
  • GND:电源负极,连接到GND
3.2.6 报警模块设计

采用蜂鸣器和LED灯作为报警提示。蜂鸣器用于开锁成功或失败时的提示,LED灯用于显示系统状态(如待机、开锁、报警等)。

蜂鸣器与STM32连接电路

  • IN:控制输入,连接到STM32的PB9
  • VCC:电源正极,连接到5V
  • GND:电源负极,连接到GND

LED指示灯与STM32连接电路

  • IN:控制输入,连接到STM32的PB10
  • VCC:电源正极,连接到5V
  • GND:电源负极,连接到GND
3.2.7 电源与复位电路设计

系统采用5V直流电源供电,通过LM7805稳压芯片为STM32和其他模块提供稳定的5V电源。

电源电路

  • 输入:5V直流电源
  • 通过LM7805稳压芯片输出5V
  • 通过0.1μF电容滤波

复位电路

  • 采用RC复位电路,包括一个10kΩ电阻和一个10μF电容
  • 复位信号连接到STM32的NRST引脚

振荡电路

  • 采用8MHz外部晶振
  • 晶振电路包括一个8MHz晶振和两个22pF电容
  • 连接到STM32的OSC_IN和OSC_OUT引脚

4. 软件设计

4.1 系统软件架构

系统软件采用分层架构设计,包括硬件抽象层、系统服务层和应用层,如图2所示。

图2:智能门禁锁系统软件架构

4.2 各功能模块软件设计

4.2.1 系统初始化模块

系统初始化模块负责完成硬件和软件的初始化工作。

void System_Init(void) {
    // 系统时钟初始化
    SystemClock_Config();
    
    // 外设初始化
    GPIO_Init();
    OLED_Init();
    RC522_Init();
    AS608_Init();
    Relay_Init();
    BEEP_Init();
    LED_Init();
    
    // 用户数据加载
    Load_User_Data();
    
    // 显示初始界面
    Display_Welcome_Screen();
}
4.2.2 身份验证模块

身份验证模块负责处理三种开锁方式:指纹、RFID、密码。

// 指纹验证
uint8_t Verify_Fingerprint(void) {
    uint8_t result = 0;
    uint32_t fingerprint_id = 0;
    
    // 采集指纹
    result = AS608_Capture_Fingerprint();
    if (result != 0) {
        return 0; // 采集失败
    }
    
    // 比对指纹
    result = AS608_Compare_Fingerprint(&fingerprint_id);
    if (result == 0) {
        // 比对成功
        return fingerprint_id;
    }
    
    return 0; // 比对失败
}

// RFID验证
uint8_t Verify_RFID(void) {
    uint8_t uid[4] = {0};
    uint8_t result = 0;
    
    // 读取RFID卡ID
    result = RC522_Read_UID(uid);
    if (result != 0) {
        return 0; // 读取失败
    }
    
    // 比对RFID卡ID
    uint8_t user_id = Find_User_By_RFID(uid);
    if (user_id != 0) {
        return user_id;
    }
    
    return 0; // 未找到用户
}

// 密码验证
uint8_t Verify_Password(char *password) {
    // 比对密码
    uint8_t user_id = Find_User_By_Password(password);
    if (user_id != 0) {
        return user_id;
    }
    
    return 0; // 密码错误
}
4.2.3 用户管理模块

用户管理模块负责添加、删除用户信息,并实现断电保存功能。

// 添加用户
uint8_t Add_User(uint8_t user_type, void *data) {
    uint8_t user_id = Get_Available_User_ID();
    if (user_id == 0) {
        return 0; // 没有可用ID
    }
    
    // 根据用户类型添加用户
    switch (user_type) {
        case USER_TYPE_FINGERPRINT:
            // 添加指纹用户
            Add_Fingerprint_User(user_id, (uint32_t *)data);
            break;
        case USER_TYPE_RFID:
            // 添加RFID用户
            Add_RFID_User(user_id, (uint8_t *)data);
            break;
        case USER_TYPE_PASSWORD:
            // 添加密码用户
            Add_Password_User(user_id, (char *)data);
            break;
    }
    
    // 保存用户数据
    Save_User_Data();
    
    return user_id;
}

// 删除用户
uint8_t Delete_User(uint8_t user_id) {
    // 删除用户
    Delete_User_Data(user_id);
    
    // 保存用户数据
    Save_User_Data();
    
    return 1;
}

// 保存用户数据到Flash
void Save_User_Data(void) {
    // 将用户数据写入STM32内部Flash
    uint32_t *flash_address = (uint32_t *)USER_DATA_FLASH_ADDRESS;
    for (uint8_t i = 0; i < MAX_USER_COUNT; i++) {
        flash_address[i] = user_data[i].id;
        flash_address[i + MAX_USER_COUNT] = user_data[i].type;
        // 保存其他数据...
    }
}

// 从Flash加载用户数据
void Load_User_Data(void) {
    // 从STM32内部Flash加载用户数据
    uint32_t *flash_address = (uint32_t *)USER_DATA_FLASH_ADDRESS;
    for (uint8_t i = 0; i < MAX_USER_COUNT; i++) {
        user_data[i].id = flash_address[i];
        user_data[i].type = flash_address[i + MAX_USER_COUNT];
        // 加载其他数据...
    }
}
4.2.4 门锁控制模块

门锁控制模块负责控制门锁的开关。

// 开锁
void Unlock_Door(void) {
    // 开启继电器
    Relay_On();
    
    // 显示开锁成功提示
    Display_Message("Door Unlocked", 1);
    
    // 蜂鸣器提示
    BEEP_Turn_On();
    HAL_Delay(500);
    BEEP_Turn_Off();
    
    // 等待3秒后自动上锁
    HAL_Delay(3000);
    Lock_Door();
}

// 上锁
void Lock_Door(void) {
    // 关闭继电器
    Relay_Off();
    
    // 显示上锁提示
    Display_Message("Door Locked", 1);
}
4.2.5 人机交互模块

人机交互模块负责处理OLED显示、按键输入和状态提示。

// 显示主界面
void Display_Main_Menu(void) {
    OLED_Clear();
    OLED_ShowString(0, 0, "Smart Door Lock", 16);
    OLED_ShowString(0, 20, "1. Fingerprint", 12);
    OLED_ShowString(0, 32, "2. RFID Card", 12);
    OLED_ShowString(0, 44, "3. Password", 12);
    OLED_ShowString(0, 56, "4. User Mgmt", 12);
}

// 显示用户管理界面
void Display_User_Menu(void) {
    OLED_Clear();
    OLED_ShowString(0, 0, "User Management", 16);
    OLED_ShowString(0, 20, "1. Add User", 12);
    OLED_ShowString(0, 32, "2. Delete User", 12);
    OLED_ShowString(0, 44, "3. View Users", 12);
}

// 处理按键输入
uint8_t Process_Key_Press(void) {
    uint8_t key = Scan_Keyboard();
    if (key == 0) {
        return 0; // 没有按键
    }
    
    switch (key) {
        case 1:
        case 2:
        case 3:
        case 4:
            return key;
        default:
            return 0;
    }
}

5. 系统实现与测试

5.1 系统功能实现

系统实现了以下核心功能:

  1. 指纹识别开锁:用户将手指放在指纹模块上,系统识别指纹后自动开锁。
  2. RFID刷卡开锁:用户将RFID卡靠近RC522模块,系统读取卡ID后自动开锁。
  3. 密码输入开锁:用户通过4×4矩阵键盘输入密码,系统验证后自动开锁。
  4. 用户管理:支持添加、删除用户信息,所有用户数据断电保存。
  5. 状态提示:OLED显示屏显示系统状态,蜂鸣器和LED灯提供声音和视觉提示。

5.2 系统测试

5.2.1 功能测试
测试项目 测试方法 测试结果 通过
指纹识别 50次指纹识别 49次成功,1次失败
RFID刷卡 50次刷卡 50次成功
密码输入 50次密码输入 48次成功,2次失败
用户添加 添加10个用户 10个用户成功添加
用户删除 删除5个用户 5个用户成功删除
断电保存 断电后重新上电 用户数据成功恢复
5.2.2 性能测试
测试项目 测试方法 测试结果
指纹识别时间 50次指纹识别 平均0.3秒
RFID刷卡时间 50次刷卡 平均0.5秒
密码输入验证时间 50次密码输入 平均0.3秒
系统响应时间 从按键到开锁 平均0.8秒

5.3 系统优化

  1. 指纹识别优化:优化指纹采集算法,提高在潮湿环境下的识别率
  2. RFID优化:增加RFID天线增益,将识别距离从10cm扩大到15cm
  3. 系统稳定性优化:增加系统看门狗,防止死机;优化电源管理,减少功耗

6. 结论与展望

6.1 结论

本文设计并实现了一套基于STM32F103C8T6单片机的智能门禁锁系统。系统成功实现了指纹识别、RFID刷卡、密码输入三种开锁方式,支持用户信息的添加、删除和断电保存功能。通过实验测试,系统指纹识别准确率达98%,响应时间小于1秒,RFID刷卡识别时间约0.5秒,密码输入验证时间约0.3秒,满足实际应用需求。

本系统具有以下特点:

  1. 高安全性:支持多种开锁方式,提高门禁系统的安全性。
  2. 高可靠性:采用断电保存功能,确保用户数据不丢失。
  3. 操作便捷:OLED显示屏和4×4矩阵键盘提供良好的人机交互体验。
  4. 经济实用:成本低,适合家庭和办公场所的门禁控制。

6.2 展望

未来工作可以从以下几个方面进行拓展:

  1. 增加更多开锁方式:如人脸识别、蓝牙开锁等,进一步提升系统的便捷性和安全性。
  2. 优化用户体验:增加语音提示功能,实现更自然的人机交互。
  3. 增强网络连接能力:支持Wi-Fi或蓝牙连接,实现远程控制和监控。
  4. 扩展应用场景:将系统应用于酒店、办公楼等场所,提供更专业的门禁解决方案。

本系统为智能门禁锁提供了经济、实用的解决方案,具有较高的应用价值和市场前景。

参考文献

[1] 陈志华, 李明. 基于STM32的智能门禁系统设计[J]. 电子技术应用, 2022, 48(5): 112-115.

[2] 张伟, 王芳. 智能门禁锁系统研究与应用[J]. 传感器与微系统, 2021, 40(3): 78-82.

[3] 刘强. STM32单片机原理与应用[M]. 北京: 电子工业出版社, 2020.

[4] Chen, Y., & Wang, L. (2022). Smart door access control system based on IoT. Journal of Smart Systems, 14(2), 45-58.

[5] Smith, J. (2021). Design and implementation of an intelligent door lock system. International Journal of Smart Security, 8(4), 234-248.

附录

附录A:系统原理图

[系统原理图,包含主控电路、RFID模块电路、指纹模块电路、显示电路、按键电路、门锁控制电路、报警电路等]

附录B:系统PCB设计

[系统PCB设计图,包含双层板布局、元件分布、电源和地线设计等]

附录C:Keil工程源码

[系统源代码,包含主程序、驱动程序、功能模块等]

附录D:指纹模块相关资料

[AS608指纹模块技术手册、通信协议、开发指南等]

附录E:系统测试报告

[系统功能测试、性能测试、稳定性测试等详细报告]


总字数:约8000字

Logo

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

更多推荐