ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

104.无源门禁卡一贴就用?RC522射频识别原理与完整代码实现

104.无源门禁卡一贴就用?RC522射频识别原理与完整代码实现 一、为什么门禁卡没有电池也能工作日常使用的门禁卡大多是无源RFID卡本质上是一种被动式射频识别标签本身没有内置电池。当你把它靠近门禁读卡器时背后其实发生了一套精密的能量耦合与数据交互过程。1.1 核心原理读卡器隔空供电门禁读卡器的核心是RC522芯片它会通过板载天线持续产生13.56MHz的射频场。当门禁卡靠近这个射频场时卡内部的线圈天线会感应出交变电流经过整流电路后为卡内的芯片供电——这相当于读卡器在“隔空送电”让原本没电的卡片瞬间获得工作能量。1.2 通信流程从能量获取到数据交互整个交互过程分为4个关键阶段能量激活卡片线圈感应电流整流后为芯片供电卡片进入工作状态指令发送RC522通过射频场向卡片发送寻卡指令请求返回卡号负载调制卡片没有主动发射信号的能力它会快速改变内部线圈的负载让读卡器周围的射频场产生细微变化数据还原RC522捕捉这些射频场变化还原出卡片返回的卡号数据再交给主控MCU判断是否开门。二、RC522模块硬件与通信协议RC522是基于NXP MFRC522芯片的高集成度RFID读写模块工作在13.56MHz频段支持ISO14443A协议可识别常见的M1S50门禁卡、校园卡等。2.1 模块引脚与接线RC522模块支持SPI、I2C、UART三种通信方式最常用的是SPI接口引脚定义如下引脚名称功能说明Arduino连接示例VCC电源正极3.3V不可接5VGND电源负极GNDRST复位引脚D5SDA/SS片选信号D10MOSI主输出从输入D11MISO主输入从输出D12SCK串行时钟D132.2 通信协议SPI总线SPI通信采用四线制通信时序如下主控拉低SDA引脚选中RC522设备主控通过MOSI发送地址读写标志位主控与RC522通过MOSI/MISO交换数据主控拉高SDA引脚释放总线。三、Arduino完整代码实现以下代码基于Arduino平台实现了RC522模块的初始化、卡片检测、UID读取和门禁控制功能可直接复制使用。3.1 安装依赖库打开Arduino IDE通过“项目→管理库”搜索并安装MFRC522库。3.2 完整代码#include SPI.h #include MFRC522.h // 引脚定义 #define SS_PIN 10 // RC522 SDA/SS引脚 #define RST_PIN 5 // RC522复位引脚 #define GREEN_LED 7 // 合法卡指示灯 #define RED_LED 8 // 非法卡指示灯 // 合法卡号列表示例 const String VALID_UIDS[] {A1B2C3D4, E5F6G7H8}; const int VALID_COUNT sizeof(VALID_UIDS)/sizeof(VALID_UIDS[0]); // 创建RC522实例 MFRC522 mfrc522(SS_PIN, RST_PIN); void setup() { Serial.begin(9600); SPI.begin(); // 初始化SPI总线 mfrc522.PCD_Init(); // 初始化RC522模块 // 初始化LED引脚 pinMode(GREEN_LED, OUTPUT); pinMode(RED_LED, OUTPUT); digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, LOW); Serial.println(RC522门禁系统启动成功等待刷卡...); } void loop() { // 1. 检测是否有新卡片 if (!mfrc522.PICC_IsNewCardPresent()) { return; } // 2. 读取卡片序列号 if (!mfrc522.PICC_ReadCardSerial()) { return; } // 3. 格式化UID为字符串 String uidStr ; for (byte i 0; i mfrc522.uid.size; i) { if (mfrc522.uid.uidByte[i] 0x10) { uidStr 0; } uidStr String(mfrc522.uid.uidByte[i], HEX); } uidStr.toUpperCase(); Serial.print(检测到卡片UID: ); Serial.println(uidStr); // 4. 验证卡号合法性 bool isAuthorized false; for (int i 0; i VALID_COUNT; i) { if (uidStr VALID_UIDS[i]) { isAuthorized true; break; } } // 5. 控制指示灯 if (isAuthorized) { Serial.println(卡号合法开门); digitalWrite(GREEN_LED, HIGH); delay(1000); digitalWrite(GREEN_LED, LOW); } else { Serial.println(卡号非法拒绝访问); digitalWrite(RED_LED, HIGH); delay(1000); digitalWrite(RED_LED, LOW); } // 6. 挂起当前卡片准备下一次检测 mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); }3.3 代码说明初始化阶段完成SPI总线、RC522模块和LED引脚的初始化卡片检测通过PICC_IsNewCardPresent()检测是否有卡片进入射频场UID读取通过PICC_ReadCardSerial()读取卡片唯一标识符合法性验证将读取到的UID与合法列表对比控制指示灯输出卡片挂起完成一次交互后挂起卡片避免重复检测。四、扩展功能卡片数据读写除了读取UIDRC522还支持对M1卡的扇区进行读写操作。以下是读取指定扇区数据的示例代码// 认证指定扇区默认密钥A为0xFFFFFFFFFFFF MFRC522::MIFARE_Key key; for (byte i 0; i 6; i) { key.keyByte[i] 0xFF; } byte blockAddr 4; // 扇区0的第一个数据块 byte buffer[18]; byte size sizeof(buffer); // 认证扇区 MFRC522::StatusCode status mfrc522.PCD_Authenticate( MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockAddr, key, mfrc522.uid ); if (status ! MFRC522::STATUS_OK) { Serial.print(认证失败); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // 读取数据块 status mfrc522.MIFARE_Read(blockAddr, buffer, size); if (status ! MFRC522::STATUS_OK) { Serial.print(读取失败); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // 打印数据 Serial.print(扇区数据); for (byte i 0; i 16; i) { if (buffer[i] 0x10) Serial.print(0); Serial.print(buffer[i], HEX); Serial.print( ); } Serial.println();五、常见问题与调试技巧模块不工作检查VCC是否接3.3VRC522不支持5V供电无法读取卡片确认卡片是13.56MHz的M1卡排除125kHz低频卡通信不稳定检查SPI接线是否正确SDA引脚必须为输出模式串口输出乱码确认串口波特率设置为9600与代码一致。六、总结RC522模块通过射频场能量耦合和负载调制技术实现了无源卡片的非接触式识别是智能门禁、身份验证等场景的核心技术。本文从原理到代码完整讲解了RC522的工作流程和实现方法你可以基于此扩展更多功能如添加电磁锁控制、卡号存储、远程授权等。如果你需要进一步优化代码或解决调试问题欢迎在评论区留言交流。
返回列表