1. 项目概述与核心需求
这个基于STM32的RFID员工打卡门禁系统是一个典型的嵌入式应用开发项目,主要解决企事业单位的考勤管理痛点。传统的人工签到方式效率低下且容易作假,而市面上的商业门禁系统价格昂贵且功能固化。我们设计的这套系统以STM32F103C8T6为主控芯片,配合MFRC522射频识别模块,实现了低成本、高可靠性的员工身份识别与考勤记录功能。
系统核心功能包括:
- 员工RFID卡片的识别与验证
- 合法卡片的开门控制(通过继电器模拟)
- 非法卡片的报警提示(蜂鸣器+LED)
- 考勤记录的存储与查询(OLED显示+EEPROM存储)
- 管理员模式下的卡片管理(添加/删除授权卡)
提示:选择STM32F103C8T6是因为其性价比高(10元左右),具有足够的GPIO和存储空间,且开发资料丰富。MFRC522模块价格仅15元左右,整套硬件成本可控制在50元以内。
2. 硬件系统设计详解
2.1 主控芯片选型与电路设计
STM32F103C8T6作为核心控制器,主要考虑以下特性:
- 72MHz主频的Cortex-M3内核
- 64KB Flash + 20KB SRAM
- 37个GPIO接口
- 3个USART、2个SPI、2个I2C接口
- 7通道DMA控制器
最小系统电路设计要点:
- 电源部分:采用AMS1117-3.3V稳压芯片,输入5V输出3.3V
- 复位电路:10kΩ上拉电阻+0.1μF电容构成RC复位
- 时钟电路:8MHz晶振+两个22pF负载电容
- 启动模式:BOOT0通过10kΩ电阻接地(从Flash启动)
- SWD调试接口:预留SWDIO和SWCLK测试点
2.2 RFID模块接口设计
MFRC522模块通过SPI接口与STM32通信,硬件连接如下:
| STM32引脚 | MFRC522引脚 | 功能说明 |
|---|---|---|
| PA4 | NSS | 片选信号 |
| PA5 | SCK | 时钟线 |
| PA6 | MISO | 主入从出 |
| PA7 | MOSI | 主出从入 |
| PA1 | RST | 复位信号 |
| - | IRQ | 未使用 |
| 3.3V | 3.3V | 电源 |
| GND | GND | 地线 |
注意:MFRC522的工作频率为13.56MHz,天线部分不要用手直接触碰,避免频率偏移。天线与PCB板的距离建议保持5mm以上。
2.3 外围设备电路设计
-
继电器控制电路:
- 采用5V继电器模块,通过NPN三极管(如S8050)驱动
- 基极串联1kΩ限流电阻连接STM32的PB0
- 继电器线圈两端并联1N4148续流二极管
-
OLED显示模块:
- 0.96寸I2C接口SSD1306
- SCL接PB6,SDA接PB7
- 需4.7kΩ上拉电阻
-
蜂鸣器报警电路:
- 有源蜂鸣器接PB1
- 三极管驱动(同继电器)
-
LED指示灯:
- 绿色LED(合法卡)接PB8
- 红色LED(非法卡)接PB9
- 各串联220Ω限流电阻
-
EEPROM存储:
- AT24C02芯片通过I2C连接
- 地址引脚全部接地(地址0xA0)
3. 软件系统架构与实现
3.1 开发环境搭建
推荐使用以下工具链组合:
- 代码编辑:VSCode + PlatformIO插件
- 安装C/C++扩展
- 安装ARM Cortex-Debug扩展
- 编译工具链:ARM GCC工具链
- 调试工具:ST-Link V2调试器
- 库依赖:
- STM32 HAL库
- MFRC522驱动库
- SSD1306 OLED驱动库
工程目录结构示例:
code复制├── Inc/
│ ├── main.h
│ ├── stm32f1xx_hal_conf.h
│ ├── rc522.h
│ └── oled.h
├── Src/
│ ├── main.c
│ ├── stm32f1xx_it.c
│ ├── rc522.c
│ └── oled.c
├── Drivers/
├── PlatformIO/
└── README.md
3.2 主程序流程图
c复制void main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
MX_I2C1_Init();
RFID_Init();
OLED_Init();
BEEP_Init();
RELAY_Init();
while (1) {
uint8_t cardID[4];
if (RFID_CheckCard(cardID)) {
if (CheckValidCard(cardID)) {
OLED_ShowMsg("Welcome!");
RELAY_Open(3000); // 开门3秒
RecordLog(cardID);
} else {
OLED_ShowMsg("Invalid Card!");
BEEP_Alarm(1000);
}
}
HAL_Delay(100);
}
}
3.3 RFID卡识别关键代码
c复制uint8_t RFID_CheckCard(uint8_t *id) {
// 寻卡
if (PCD_Request(PICC_REQIDL, &buffer[0]) != MI_OK)
return 0;
// 防冲突
if (PCD_Anticoll(&buffer[2]) != MI_OK)
return 0;
// 验证卡片
if (PCD_Select(&buffer[2]) != MI_OK)
return 0;
// 复制卡片ID
memcpy(id, buffer+2, 4);
return 1;
}
3.4 考勤记录存储实现
采用EEPROM循环存储设计,避免频繁擦写:
c复制#define LOG_START_ADDR 0x00
#define LOG_END_ADDR 0x7FF
#define LOG_ITEM_SIZE 8 // 4字节ID + 4字节时间戳
void RecordLog(uint8_t *cardID) {
static uint16_t logAddr = LOG_START_ADDR;
uint32_t timestamp = HAL_GetTick();
// 写入卡片ID
HAL_I2C_Mem_Write(&hi2c1, 0xA0, logAddr, I2C_MEMADD_SIZE_8BIT, cardID, 4, 100);
// 写入时间戳
HAL_I2C_Mem_Write(&hi2c1, 0xA0, logAddr+4, I2C_MEMADD_SIZE_8BIT, (uint8_t*)×tamp, 4, 100);
// 更新存储位置
logAddr += LOG_ITEM_SIZE;
if (logAddr > LOG_END_ADDR)
logAddr = LOG_START_ADDR;
}
4. 系统调试与优化技巧
4.1 RFID模块常见问题排查
-
卡片无法识别:
- 检查SPI接线是否正确(特别是NSS片选信号)
- 用逻辑分析仪抓取SPI波形,确认时钟极性(CPOL)和相位(CPHA)设置
- 调整天线匹配电路:典型值为50Ω匹配,可尝试调整天线线圈旁的匹配电容
-
识别距离短:
- 确保天线周围没有金属物体干扰
- 尝试调整MFRC522的RxGain寄存器(默认值0x70<<1)
- 检查电源稳定性,建议在VCC对地加100μF电容
-
多卡片冲突:
- 优化防冲突算法,增加重试机制
- 在代码中添加去抖动处理(同一卡片500ms内不重复识别)
4.2 低功耗优化方案
对于电池供电场景,可采取以下措施:
- 将STM32设置为STOP模式,通过RFID模块的中断唤醒
- 调整MFRC522的功耗模式:
c复制void RFID_Sleep(void) { WriteRawRC(CommandReg, PCD_IDLE); WriteRawRC(TModeReg, 0x80); // 定时器自动唤醒 WriteRawRC(TPrescalerReg, 0xA9); WriteRawRC(TReloadRegH, 0x03); WriteRawRC(TReloadRegL, 0xE8); } - 关闭OLED背光,仅在有操作时点亮
- 降低系统时钟频率(通过修改SystemClock_Config())
4.3 系统安全性增强
-
卡片加密验证:
- 使用MIFARE Classic的AUTH认证机制
- 修改默认密钥FF FF FF FF FF FF为自定义密钥
c复制uint8_t keyA[6] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6}; PCD_Authenticate(PICC_AUTHENT1A, 1, keyA, &buffer[2]); -
数据校验:
- 在EEPROM存储时增加CRC校验
- 对关键操作(如删除卡片)需要管理员密码确认
-
防重放攻击:
- 记录最后一次成功打卡时间
- 同一卡片两次打卡需间隔最小时间(如30秒)
5. 项目扩展与进阶方向
5.1 无线通信扩展
-
通过ESP8266添加WiFi功能:
- 将考勤数据上传至云服务器
- 实现手机APP远程管理
- 接线示例:
code复制
ESP8266_TX -> STM32_PA3 (USART2_RX) ESP8266_RX -> STM32_PA2 (USART2_TX)
-
蓝牙模块HC-05应用:
- 短距离手机蓝牙打卡
- 配置为从机模式:
at复制AT+ROLE=0 AT+CMODE=1 AT+PSWD="1234"
5.2 生物识别融合方案
-
指纹模块集成:
- 使用FPM10A光学指纹模块(UART接口)
- 实现多因子认证(RFID+指纹)
-
人脸识别扩展:
- 采用OV7670摄像头+OpenMV方案
- 运行简化版LBPH算法识别面部特征
5.3 管理软件对接
-
上位机开发:
- 使用Qt或C#开发考勤管理系统
- 通过USB虚拟串口(CDC)与STM32通信
-
Web后台对接:
- STM32通过ESP32的HTTP Client上传数据
- 后台采用PHP+MySQL架构
php复制$card_id = $_POST['card_id']; $time = $_POST['time']; $sql = "INSERT INTO records (card_id, time) VALUES ('$card_id', '$time')";
5.4 硬件工艺改进
-
PCB设计建议:
- 使用4层板设计,单独RF信号层
- 射频部分做50Ω阻抗匹配
- 添加TVS二极管防护电路
-
外壳设计:
- 3D打印定制外壳
- 天线区域避免金属材料
- 预留安装孔位
这套系统从原型到产品化还需要考虑电磁兼容(EMC)测试、环境适应性测试等环节,建议参考GB/T 17626系列标准进行浪涌、静电等抗扰度测试。实际部署时,门禁控制器与读卡器的距离建议不超过5米,可通过增加射频功放模块延长识别距离。
