1. 项目概述:基于STM32的RFID员工打卡门禁系统
这个项目是我去年指导学弟完成的毕业设计,用STM32单片机搭配RFID模块实现了一套完整的员工打卡门禁系统。相比传统的指纹或密码门禁,RFID方案有几个明显优势:非接触式识别更卫生(疫情后这点尤为重要)、卡片不易磨损、系统响应速度快(实测识别时间<0.5秒)。整套系统硬件成本控制在200元以内,非常适合中小企业或学校实验室使用。
系统核心功能包括:
- 员工信息管理(增删查改)
- 实时打卡记录
- OLED屏显示考勤状态
- WiFi数据同步到上位机
- 继电器控制门锁开关
从技术实现角度看,这个项目完整覆盖了嵌入式开发的典型流程:硬件选型→电路设计→固件开发→上位机编程→系统联调。特别适合电子信息类专业的学生作为毕业设计选题,既能展示专业能力,又不会因为复杂度太高导致难以完成。
2. 硬件设计详解
2.1 核心器件选型
主控芯片:STM32F103C8T6(性价比之王)
- 72MHz主频足够处理RFID数据
- 64KB Flash + 20KB RAM满足系统需求
- 丰富的GPIO和外设接口(USART、I2C、SPI)
RFID模块:RC522(13.56MHz频段)
- 支持ISO14443A协议
- 最大7cm识别距离
- 配套白卡成本仅0.5元/张
WiFi模块:ESP-01S(ESP8266)
- 支持802.11 b/g/n
- 内置TCP/IP协议栈
- AT指令控制,开发简单
其他关键部件:
- 0.96寸OLED(SSD1306驱动,I2C接口)
- 5V继电器模块(控制门锁)
- DS1302实时时钟模块
2.2 电路设计要点
电源部分特别需要注意:
c复制// 典型供电方案
USB 5V → AMS1117-3.3 → 给MCU和模块供电
↘ 继电器单独用5V供电
RC522与STM32的连接方式:
code复制RC522 STM32
SDA → PA4(SPI1_NSS)
SCK → PA5(SPI1_SCK)
MOSI → PA7(SPI1_MOSI)
MISO → PA6(SPI1_MISO)
IRQ → 不接
GND → GND
RST → PA1
3.3V → 3.3V
特别注意:RC522的工作电压必须为3.3V,直接接5V会烧毁芯片!
3. 软件系统实现
3.1 下位机程序设计
RFID识别流程:
- 初始化SPI接口和RC522
- 循环检测是否有卡片靠近
- 防冲突处理(多卡同时出现时)
- 读取卡片UID
- 通过串口发送给ESP8266
关键代码片段:
c复制void RFID_Read(void) {
if (PcdRequest(PICC_REQIDL, &TagType) == MI_OK) {
if (PcdAnticoll(&serNum) == MI_OK) {
sprintf(msgBuf, "CARD:%02X%02X%02X%02X",
serNum[0],serNum[1],serNum[2],serNum[3]);
USART_SendString(USART1, msgBuf);
}
}
}
3.2 上位机系统设计
采用Python+SQLite开发,主要功能模块:
- 通信模块:Socket TCP服务端
- 数据库模块:员工信息存储
- UI界面:Tkinter实现
数据库表结构设计:
sql复制CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
card_id TEXT UNIQUE,
is_checked INTEGER DEFAULT 0,
last_check_time TEXT
);
4. 系统调试经验
4.1 常见问题排查
问题1:RC522读卡距离短
- 检查天线匹配电路(典型值:27pF电容)
- 确保供电电压稳定在3.3V
- 尝试调整PCD_SetAntennaGain()参数
问题2:WiFi频繁断开
- 增加心跳包机制(每30秒发送"AT+PING")
- 在ESP8266固件中设置WiFi休眠模式为NONE
- 检查路由器是否开启了AP隔离
问题3:继电器误动作
- 在GPIO输出端加1N4148续流二极管
- 软件上做防抖处理(连续检测到3次相同指令才执行)
4.2 性能优化技巧
-
RFID识别加速:
- 预加载认证密钥到RC522
- 缩短寻卡间隔(建议100ms)
-
数据同步优化:
- 采用差分同步策略(仅上传变更记录)
- 本地缓存未成功上传的记录
-
低功耗设计:
- 无人操作时进入STOP模式
- 通过RFID中断唤醒MCU
5. 项目扩展方向
这个基础系统还可以进一步扩展:
-
人脸识别融合:
- 添加OV2640摄像头模块
- 运行轻量级人脸识别算法(如MobileNet)
-
云端部署:
- 改用MQTT协议上传数据到阿里云IoT
- 开发微信小程序查询考勤记录
-
多机联网:
- 通过RS485组网多个读卡器
- 实现总部-分部的数据同步
我在实际部署中发现,系统稳定性最关键的是电源设计。建议给STM32和RFID模块单独用LDO供电,避免继电器动作时引起电压波动导致MCU复位。另外,卡片数据库最好定期备份到SD卡,防止意外数据丢失。
(完整工程代码和原理图已上传至GitHub,需要可私信获取)
