一、项目背景与功能概述
在物联网技术快速发展的今天,传统门锁正在向智能化方向演进。本系统基于STM32F103C8T6微控制器,整合多种外设模块,实现了一个具备以下核心功能的智能门禁系统:
- 密码输入与验证(4x3矩阵键盘)
- 用户信息存储管理(W25Q128 Flash)
- 实时状态显示(0.96寸OLED)
- 电磁锁控制(继电器+5V电磁锁)
- 声光提示反馈(无源蜂鸣器)
- 系统异常报警功能
二、硬件系统架构
1. 核心部件选型说明
模块名称 | 型号参数 | 功能说明 |
---|---|---|
主控芯片 | STM32F103C8T6 | 系统控制核心 |
存储模块 | W25Q128 | 存储用户密码 |
显示模块 | SSD1306 0.96寸OLED | 显示系统状态与交互界面 |
输入模块 | 4x3矩阵键盘 | 密码输入与人机交互 |
执行机构 | 5V电磁锁+继电器 | 门锁驱动控制 |
提示模块 | 无源蜂鸣器 | 操作反馈与报警提示 |
2. 硬件连接示意图
[STM32F103C8T6]
|
├── OLED (I2C)
│ ├── SCL -> PB8
│ └── SDA -> PB9
|
├── 矩阵键盘
│ ├── Rows -> PB0-PB2
│ ├──Rows4 -> PB10
│ └── Columns -> PB11-PB13
|
├── W25Q128 (SPI)
│ ├── CS -> PA4
│ ├── CLK -> PA5
│ ├── DO-> PA6
│ └── DI-> PA7
|
├── 继电器 -> PB7
├── 蜂鸣器 -> PC13
三、软件设计框架
1. 系统工作流程图
2. 关键模块实现逻辑
(1)矩阵键盘扫描
可看上一篇文章代码。
// 部分代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
uint8_t row = 0, column = 0;
if(key_value != 0) return;
//确认行
if(GPIO_Pin == GPIO_PIN_0)
row = 0x10;
else if(GPIO_Pin == GPIO_PIN_1)
row = 0x20;
else if(GPIO_Pin == GPIO_PIN_2)
row = 0x30;
else if(GPIO_Pin == GPIO_PIN_10)
row = 0x40;
//确定列
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11) == GPIO_PIN_SET)
{
delay_ms(10);
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11))
column = 0x01;
}
else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET)
{
delay_ms(10);
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12))
column = 0x02;
}
else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_SET)
{
delay_ms(10);
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13))
column = 0x03;
}
if(row != 0 && column != 0)
key_value = row | column;
}
uint8_t keyboard_get_value(void)
{
uint8_t ch = 0;
if(key_value != 0)
{
if(key_value == 0x11) ch = '1';
else if(key_value == 0x12) ch = '2';
else if(key_value == 0x13) ch = '3';
else if(key_value == 0x21) ch = '4';
else if(key_value == 0x22) ch = '5';
else if(key_value == 0x23) ch = '6';
else if(key_value == 0x31) ch = '7';
else if(key_value == 0x32) ch = '8';
else if(key_value == 0x33) ch = '9';
else if(key_value == 0x41) ch = '*';
else if(key_value == 0x42) ch = '0';
else if(key_value == 0x43) ch = '#';
delay_ms(400);
key_value = 0x00;
}
return ch;
}
(2)存储管理设计
部分代码
//密码比对
uint8_t password_compare(void)
{
uint8_t i = 0;
w25q128_read_data(0x000000, pwd_read, PASSWORD_SIZE);
if(strlen((char *)pwd_input) != strlen((char *)pwd_read))
return FALSE;
for(i = 0; i < strlen((char *)pwd_read); i++)
{
if(pwd_input[i] != pwd_read[i])
return FALSE;
}
return TRUE;
}
(3)电磁锁控制逻辑
部分代码:
//密码输入正确的操作
void password_input_right_action(void)
{
oled_show_right();
lock_on();
beep_on();
delay_ms(300);
beep_off();
delay_ms(1000);
lock_off();
try_times = 0;
}
//闭合继电器的函数
void lock_on(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); // 拉低LED1引脚,点亮LED1
}
四、系统特色功能实现
-
安全增强设计
- 密码输入错误3次触发报警
- 支持*键组合进入管理模式
- 断电数据保护(W25Q128存储)
-
可视化交互
- 动态输入显示
-
扩展功能预留
- RFID刷卡模块接口(SPI预留)
- 蓝牙通信模块(USART1)
- 指纹识别模块(USART2)
五、开发注意事项
-
软件优化建议
- 采用状态机实现键盘扫描
- 使用DMA加速SPI Flash读写
- 关键操作添加看门狗保护
-
常见问题排查
- OLED显示异常:检查I2C地址配置(通常0x78或0x7A)
- Flash写入失败:确保擦除操作在前
- 继电器无法吸合:检查驱动三极管基极电阻
六、应用场景与扩展方向
本系统可应用于:
- 智能家居门禁控制
- 实验室设备柜管理
- 共享储物柜控制系统
未来可扩展:
- 添加人脸识别模块
- 对接云平台实现远程管理
- 增加温度异常报警功能
七、总结
本文详细介绍了基于STM32F103C8T6的智能门禁系统设计方案。系统整合了多种常用外设模块,实现了完整的门禁控制功能。开发者可根据实际需求调整密码策略、存储容量等参数,具体实现代码可根据硬件连接关系进行适配开发。