1. 项目概述
这个IC卡门禁系统是我去年为小区物业做的一个实际项目。当时物业经理找到我,说他们想用电子门禁替代老旧的机械锁,但市面上的成品系统要么太贵,要么功能太复杂。于是我决定用单片机+RC522读卡器自己开发一套,成本控制在200元以内,最终效果出乎意料地好。
整套系统由STM32F103C8T6单片机作为主控,搭配RC522射频读卡模块、电磁锁和OLED显示屏构成。住户刷卡时,系统会验证卡号是否在授权列表中,验证通过则驱动继电器打开电磁锁,同时在OLED上显示欢迎信息。我还特意增加了管理卡功能,物业人员可以用特殊权限卡添加/删除普通卡。
2. 硬件设计与选型
2.1 核心器件选型
主控芯片我选择了STM32F103C8T6,也就是常说的"蓝莓派"。这个选择基于几个考虑:
- 72MHz主频完全够用,价格仅10元左右
- 丰富的GPIO和USART接口,方便扩展
- 自带硬件SPI接口,与RC522通信更稳定
- 社区资源丰富,遇到问题容易找到解决方案
读卡模块用的是RC522,这是最成熟的13.56MHz射频读卡方案:
- 支持ISO14443A标准的MIFARE卡
- 有效读卡距离4-6cm,刚好适合门禁场景
- 淘宝单价不到15元,性价比极高
- 有成熟的库支持,开发难度低
2.2 外围电路设计
电源部分采用12V/2A的开关电源供电,通过LM2596降压到5V给RC522供电,再通过AMS1117-3.3降到3.3V给单片机。这里有个经验:一定要在电源输入端加1000μF的电解电容,否则电磁锁动作时可能会引起电压骤降导致系统重启。
电磁锁驱动电路我画了三次才定型。最初直接用单片机GPIO驱动继电器,发现继电器闭合时产生的反电动势会导致单片机复位。后来改进方案:
- 在继电器线圈两端并联1N4007续流二极管
- 增加光耦隔离(PC817)
- 使用三极管(S8050)驱动继电器
- 在继电器触点两端并联0.1μF电容吸收火花
3. 软件系统实现
3.1 开发环境搭建
我使用Keil MDK进行开发,配置过程有几个关键点:
- 安装STM32F1的Device Family Pack
- 设置编译器为ARMCC V5
- 勾选"Use MicroLIB"以减小代码体积
- 优化等级选择-O2,在size和speed间取得平衡
对于RC522的驱动,我移植了GitHub上的开源库,但做了以下改进:
- 修改SPI时钟分频为8分频(原库是4分频)
- 增加防冲突处理,避免多张卡同时出现时死锁
- 添加了读卡超时机制,设置500ms无响应自动复位
3.2 核心逻辑实现
主程序采用状态机设计,主要状态包括:
c复制typedef enum {
STATE_IDLE, // 待机状态
STATE_READING, // 读卡中
STATE_CHECKING, // 验证卡号
STATE_OPENING, // 开门中
STATE_ADMIN // 管理模式
} SystemState;
卡号验证采用简单的白名单机制,我将授权卡号存储在STM32的Flash中,最多支持100张卡。这里有个技巧:STM32F103的Flash每页1KB,我在最后一页(0x0800FC00-0x0800FFFF)存储卡号数据,避免与程序空间冲突。
c复制#define CARD_DB_ADDR 0x0800FC00
#define MAX_CARDS 100
typedef struct {
uint8_t uid[4]; // 卡UID
uint32_t valid; // 有效标志
} CardRecord;
4. 系统优化与调试
4.1 抗干扰设计
在实际测试中,发现以下干扰问题及解决方案:
- 金属门框导致读卡距离缩短 → 在RC522天线外围加装3mm厚的亚克力隔离板
- 多人同时刷卡造成误判 → 增加防冲突算法,设置最小读卡间隔300ms
- 电源波动引起复位 → 在3.3V电源端并联220μF钽电容
4.2 功耗优化
虽然系统接市电,但我还是做了低功耗设计:
- 空闲时关闭OLED背光
- 设置看门狗定时唤醒(每500ms唤醒一次检查卡片)
- 电磁锁驱动改为脉冲触发(500ms后自动断开)
- 读卡模块采用PWM控制电源,非活动期降低供电电压
5. 实际部署经验
5.1 安装注意事项
在小区单元门安装时积累的经验:
- 读卡器高度建议1.2-1.5米,方便不同身高人群使用
- 避免将读卡器安装在金属表面,至少保持5cm间距
- 电磁锁的安装方向要与门开方向一致
- 所有线缆必须穿管保护,特别是户外部分
5.2 维护技巧
系统运行半年后总结的维护要点:
- 每月检查一次接线端子是否松动
- 每季度清洁一次读卡器表面
- 备用电源建议使用超级电容而非电池
- 卡数据库变更后立即备份到PC
6. 功能扩展方向
现有系统还可以进一步扩展:
- 增加蓝牙模块,支持手机APP开锁
- 添加指纹模块实现双因素认证
- 联网功能实现远程授权和日志记录
- 电池供电版本作为临时门禁使用
这个项目最让我满意的是它的稳定性 - 部署的10套系统半年内零故障。关键是要做好电源处理和抗干扰设计,这些经验比代码本身更有价值。