这个智能门禁系统项目是我去年为某小区物业做的实际工程案例。当时物业经理找到我,说他们需要一套低成本、易维护的门禁解决方案,要求能支持刷卡、密码和远程控制三种开门方式。经过方案对比,最终选择了基于51单片机的设计方案。
51单片机作为入门级MCU,虽然性能比不上ARM芯片,但对于门禁这种低复杂度控制系统完全够用。整个系统硬件成本控制在200元以内,软件开发周期两周,最终实现了预期功能并稳定运行至今。下面我就把这个项目的完整设计过程和实现细节分享给大家。
先说说这个项目的核心需求:
基于上述需求,硬件配置如下:
提示:RC522模块要注意天线匹配,实际使用中发现部分国产模块天线阻抗不匹配会导致读卡距离缩短。
整个系统的工作流程如下:
STC89C52最小系统包含:
特别注意:STC单片机下载程序需要冷启动,建议在USB转TTL模块的DTR信号线上加100nF电容实现自动下载。
RC522模块通过SPI接口与单片机连接:
天线部分要注意:
系统需要三种电压:
采用两级稳压方案:
重要:电磁锁要单独供电,避免电机干扰导致单片机复位。
c复制void main() {
sys_init(); // 外设初始化
load_users(); // 从EEPROM加载用户数据
while(1) {
check_card(); // 检测IC卡
check_key(); // 检测键盘输入
check_wifi(); // 检测网络指令
if(open_door_flag) {
control_lock(OPEN);
log_event();
open_door_flag = 0;
}
}
}
M1卡验证流程:
关键代码片段:
c复制uchar verify_card(uchar *id) {
uchar status;
status = PcdRequest(PICC_REQALL, id);
if(status != MI_OK) return 0;
status = PcdAnticoll(id);
if(status != MI_OK) return 0;
status = PcdSelect(id);
if(status != MI_OK) return 0;
uchar key[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
status = PcdAuthState(PICC_AUTHENT1A, 8, key, id);
if(status != MI_OK) return 0;
return 1;
}
密码存储采用SHA-1哈希存储,实际存储的是哈希值而非明文密码。验证流程:
哈希计算简化算法:
c复制void sha1_simple(uchar *input, uchar *output) {
// 简化版SHA1计算,实际项目应使用标准算法
uint32_t hash = 0;
for(int i=0; i<6; i++) {
hash = (hash << 5) + hash + input[i];
}
memcpy(output, &hash, 4);
}
ESP8266配置为STA模式,通过AT指令与单片机串口通信。关键指令:
数据格式设计:
code复制协议帧格式:
[HEAD][LEN][CMD][DATA][CRC]
HEAD: 0xAA 0x55
LEN: 数据长度
CMD: 指令码
DATA: 数据内容
CRC: CRC8校验
这个项目从设计到实施总共用了三周时间,期间遇到了不少问题,比如最初选的STC12系列因为IO驱动能力不足导致继电器无法可靠吸合,后来换成STC89系列就解决了。还有一次EEPROM数据丢失,最后发现是写入时序问题,调整延时后就没再出现过。