1. 项目概述
这个基于STM32的RFID员工打卡门禁系统是一个典型的嵌入式应用开发项目,它完美结合了硬件设计和软件开发,实现了现代企业常见的员工考勤管理功能。作为一名从事嵌入式开发多年的工程师,我认为这类项目非常适合作为电子类专业学生的毕业设计选题,因为它涵盖了从底层硬件到上层应用的完整开发流程。
系统采用STM32F103系列单片机作为主控芯片,搭配RC522 RFID读卡模块、OLED显示屏、ESP8266 WiFi模块和继电器等外围器件。当员工使用RFID卡靠近读卡器时,系统会读取卡片信息并通过WiFi将数据上传至上位机进行验证,验证通过后控制继电器模拟门禁开启,同时记录考勤信息。
这个项目的亮点在于:
- 完整实现了从硬件到软件的整套系统
- 采用了无线通信技术实现数据上传
- 设计了简洁实用的上位机管理界面
- 系统稳定可靠,具有实际应用价值
2. 硬件设计与选型
2.1 主控芯片选择
我们选用STM32F103C8T6作为主控芯片,这款芯片属于STM32F1系列,具有以下优势:
- 72MHz主频,性能足够处理RFID数据和通信任务
- 64KB Flash + 20KB RAM,满足程序存储需求
- 丰富的外设接口:USART、SPI、I2C等
- 价格适中,开发资源丰富
提示:STM32F103系列有多个型号,C8T6是最常用的最小系统板型号,性价比高且易于采购。
2.2 RFID模块选型与原理
系统采用MFRC522芯片的RFID读卡模块,这是目前最常用的13.56MHz射频识别方案:
- 工作频率:13.56MHz(符合ISO/IEC 14443标准)
- 通信接口:SPI(也可配置为I2C或UART)
- 读取距离:5-10cm(取决于天线设计)
- 支持卡类型:MIFARE Classic 1K、MIFARE Classic 4K等
RFID工作原理:
- 读卡器通过天线发送射频信号
- 卡片进入磁场后获得能量并返回卡号信息
- 读卡器解码信号并传输给主控
2.3 其他外围器件
- OLED显示屏:0.96寸I2C接口,用于显示系统状态和刷卡信息
- ESP8266 WiFi模块:实现与上位机的TCP通信
- 继电器模块:模拟门禁开关,控制电压根据实际需求选择
- 蜂鸣器:提供操作反馈音效
- LED指示灯:系统状态指示
3. 软件系统设计
3.1 下位机程序设计
下位机程序采用Keil MDK开发,基于HAL库实现模块化编程:
c复制// RFID初始化
void RFID_Init(void)
{
HAL_GPIO_WritePin(RFID_CS_GPIO_Port, RFID_CS_Pin, GPIO_PIN_SET);
HAL_SPI_Init(&hspi1);
MFRC522_Init();
}
// 主循环中的刷卡检测
while(1)
{
if(MFRC522_CheckCard())
{
uint8_t cardID[4];
if(MFRC522_ReadCardSerial(cardID))
{
// 处理卡号并发送到上位机
ProcessCardData(cardID);
}
}
HAL_Delay(100);
}
3.2 通信协议设计
系统采用自定义的简单通信协议实现下位机与上位机的数据交互:
| 数据类型 | 格式 | 说明 |
|---|---|---|
| 卡号上传 | $CARD,xxxx,xxxx,xxxx,xxxx# | 4字节卡号,逗号分隔 |
| 验证结果 | #RESULT,1# 或 #RESULT,0# | 1表示成功,0表示失败 |
| 人员信息 | #NAME,张三# | 验证成功时返回姓名 |
3.3 上位机程序设计
上位机使用Python开发,主要功能模块:
- TCP服务器:监听下位机连接请求
- 数据库管理:使用SQLite存储员工信息
- GUI界面:Tkinter实现的图形界面
关键数据库操作代码:
python复制def create_database():
conn = sqlite3.connect('employee.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS employees
(id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
card_id TEXT UNIQUE NOT NULL,
last_checkin TEXT)''')
conn.commit()
conn.close()
4. 系统实现与调试
4.1 硬件组装注意事项
- 天线布局:RFID模块天线应远离金属物体,避免干扰
- 电源设计:为STM32和外围器件提供稳定5V/3.3V电源
- 接口保护:在通信线上添加适当电阻(如SPI线上串联100Ω电阻)
- 继电器隔离:使用光耦隔离控制信号,避免干扰MCU
4.2 常见问题排查
-
RFID读卡不稳定
- 检查天线连接是否良好
- 调整读卡距离(通常3-5cm最佳)
- 确认卡片类型是否被支持
-
WiFi连接失败
- 检查ESP8266固件版本
- 确认SSID和密码正确
- 测试AT指令是否正常响应
-
上位机无法接收数据
- 检查网络连接和防火墙设置
- 确认端口号一致
- 使用串口调试助手测试通信协议
5. 项目扩展与优化
在实际应用中,可以考虑以下优化方向:
- 低功耗设计:采用STM32的低功耗模式,间隔唤醒检测
- 多卡识别:实现防冲突机制,支持快速连续刷卡
- 数据加密:对卡号和通信数据进行加密传输
- 云端同步:将考勤数据同步至云服务器
- 人脸识别:增加人脸识别模块实现双重验证
6. 开发心得与建议
在开发这类嵌入式系统项目时,我有以下几点经验分享:
- 模块化开发:先单独测试每个模块(RFID、WiFi、显示等),再整合
- 调试技巧:善用逻辑分析仪和串口打印调试信息
- 版本控制:使用Git管理代码,方便回溯和协作
- 文档记录:详细记录硬件连接和软件配置,便于后期维护
对于毕业设计来说,建议在完成基础功能后,至少实现一个创新点,比如:
- 添加指纹识别作为第二验证因素
- 开发手机APP查看考勤记录
- 实现数据分析功能(迟到早退统计等)
这个项目不仅能够帮助你掌握STM32开发的全流程,还能学习到嵌入式系统设计的核心思想,是电子类专业非常理想的毕业设计选题。
