1. 项目概述
这个小区门禁控制系统是我去年指导的一个本科毕业设计项目,采用STM32单片机作为主控,实现了刷卡+密码的双重验证机制。整套系统从硬件选型到软件调试都是学生独立完成的,期间踩了不少坑,也积累了不少实战经验。现在把整个设计过程整理出来,给需要做类似项目的同学参考。
门禁系统作为小区安全的第一道防线,传统机械锁已经无法满足现代安防需求。我们设计的这套系统主要有三个特点:一是采用RFID+密码双重验证,安全性更高;二是具备完善的用户管理功能,物业可以随时添加/删除卡号;三是预留了联网接口,方便后期扩展成智慧社区系统。
整个项目开发周期约3个月,硬件成本控制在200元以内(不含外壳),实测刷卡响应时间<0.5秒,密码验证时间<1秒,完全满足小区日常使用需求。下面我会从硬件设计、软件实现到系统调试,详细讲解每个环节的技术要点。
2. 硬件系统设计
2.1 核心器件选型
主控芯片我们最终选择了STM32F103C8T6,这款ARM Cortex-M3内核的单片机有以下几个优势:
- 72MHz主频,处理RFID和键盘扫描绰绰有余
- 64KB Flash + 20KB RAM,足够存储用户数据和程序
- 丰富的GPIO和通信接口(3个USART、2个SPI、2个I2C)
- 价格仅10元左右,性价比极高
RFID模块选用的是MFRC522,这是市面上最常用的13.56MHz读卡芯片。需要注意几点:
- 天线设计很关键,我们先用现成模块测试,后期自己画PCB天线时阻抗匹配没做好,读卡距离从5cm降到了2cm,后来调整了匹配电路才解决
- 工作电压3.3V,与STM32电平兼容
- 支持ISO14443A协议,兼容市面上大多数IC卡(M1卡等)
2.2 关键电路设计
电源电路:
- 主电源12V输入,通过LM2596降压到5V
- 5V再经过AMS1117-3.3得到3.3V给单片机供电
- 后备电池选用18650锂电池,通过TP4056充电管理芯片实现充放电
特别注意:电磁锁工作时电流较大(约500mA),一定要单独供电,不能直接从稳压芯片取电,否则会导致单片机复位。
电磁锁驱动电路:
c复制// 使用N沟道MOSFET IRF540N驱动电磁锁
// 单片机GPIO -> 1k电阻 -> MOSFET栅极
// MOSFET漏极接电磁锁,源极接地
// 电磁锁两端一定要并联续流二极管(1N4007)
矩阵键盘接口:
4x4矩阵键盘接在GPIOC的8个引脚上,采用行列扫描方式。硬件上每个按键并联0.1μF电容去抖,软件中也做了去抖处理。
2.3 PCB设计注意事项
- 天线部分要严格按照MFRC522 datasheet的推荐布局
- 数字地和模拟地要分开,最后单点连接
- 所有IO口串联100Ω电阻做限流保护
- 预留SWD调试接口和串口下载接口
- 电源走线要足够宽(至少1mm)
我们第一版PCB就因为天线设计不当和地线处理不好,导致读卡不稳定,后来重做了一版才解决。建议先用洞洞板搭测试电路,确认没问题再画PCB。
3. 软件系统实现
3.1 主程序流程
系统采用状态机设计,主要状态如下:
c复制typedef enum {
MODE_STANDBY, // 待机状态,等待刷卡
MODE_PASSWORD_WAIT, // 等待输入密码
MODE_OPEN, // 门锁开启状态
MODE_ADMIN // 管理员模式
} AccessState;
主循环逻辑:
c复制while(1) {
// 1. 检查RFID卡
if(检测到卡片){
if(卡号有效){
进入密码输入状态;
启动超时计时器;
}
}
// 2. 扫描键盘
if(有按键按下){
处理按键;
if(密码正确){
开启门锁;
启动3秒计时;
}
}
// 3. 检查超时
if(密码输入超时){
返回待机状态;
}
// 4. 检查门锁开启时间
if(门锁开启超过3秒){
关闭门锁;
返回待机状态;
}
HAL_Delay(50); // 50ms延时
}
3.2 RFID卡处理
RFID卡处理流程:
- 寻卡 → 防冲突 → 选卡 → 读取UID
- 在EEPROM中查找该UID
- 如果找到,进入密码输入状态
UID存储结构:
c复制typedef struct {
uint8_t uid[4]; // 卡号
uint8_t pwd_hash[4];// 密码哈希值
uint32_t valid_time;// 有效期时间戳
} UserInfo;
密码采用简单的异或加密:
c复制void encrypt_pwd(char* pwd, uint8_t* uid, uint8_t* out_hash) {
for(int i=0; i<4; i++){
out_hash[i] = pwd[i] ^ uid[i%4];
}
}
3.3 管理员功能实现
通过特定组合键(如连续按*键3次)进入管理员模式:
- 添加用户:刷卡后输入密码,保存到EEPROM
- 删除用户:刷卡后删除对应记录
- 清空所有用户:恢复出厂设置
EEPROM操作要点:
- 使用AT24C02芯片,I2C接口
- 每次写入前先擦除
- 重要数据要写校验和
- 采用磨损均衡算法延长寿命
4. 系统调试与优化
4.1 常见问题排查
-
读卡距离短
- 检查天线匹配电路(通常需要调整L0和C0)
- 测量天线谐振频率(应为13.56MHz)
- 确保周围没有金属物体干扰
-
按键失灵
- 检查上拉电阻是否接好
- 测量按键按下时电压变化
- 调整软件去抖时间(通常20ms为宜)
-
电磁锁不动作
- 测量MOSFET栅极电压(应>4.5V)
- 检查续流二极管方向
- 单独测试电磁锁是否正常
4.2 性能优化技巧
-
RFID处理优化:
- 将常用的卡号缓存在内存中
- 使用二分查找加速UID匹配
- 调整SPI时钟频率(最高10MHz)
-
键盘扫描优化:
- 采用中断方式检测按键
- 空闲时降低扫描频率
- 使用状态机处理长按/短按
-
低功耗设计:
- 空闲时进入睡眠模式
- 关闭不用的外设时钟
- 降低显示屏亮度
5. 功能扩展建议
-
联网功能
- 增加ESP8266 WiFi模块
- 开门记录上传到服务器
- 支持远程下发黑名单
-
生物识别
- 增加指纹识别模块
- 支持人脸识别(需较强算力)
-
手机APP控制
- 开发蓝牙或NFC功能
- 通过手机APP开门
-
多门联动
- 通过RS485组网
- 实现单元门+电梯联动
实际开发中发现,STM32的硬件I2C有时不太稳定,后来改用软件模拟I2C反而更可靠。另外电磁锁的续流二极管一定要选快恢复型的,普通二极管可能导致MOSFET损坏。这些经验都是调试过程中积累的宝贵教训。