本实验使用RC522模块扫描NFC卡片信息。
电脑,windows系统
零知开发板
micro-usb线
RC522 模块
门禁卡、白卡等NFC卡片
#include <SPI.h>
#include "RFID.h"
//D10 - 读卡器CS引脚、D5 - 读卡器RST引脚
RFID rfid(10,5);
unsigned char status;
unsigned char str[MAX_LEN]; //MAX_LEN为16,数组最大长度
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init(); //初始化
}
void loop()
{
//Search card, return card types
if (rfid.findCard(PICC_REQIDL, str) == MI_OK) {
Serial.println("Find the card!");
// Show card type
ShowCardType(str);
//防冲突检测,读取卡序列号
if (rfid.anticoll(str) == MI_OK) {
Serial.print("The card's number is : ");
//显示卡序列号
for(int i = 0; i < 4; i++){
Serial.print(0x0F & (str[i] >> 4),HEX);
Serial.print(0x0F & str[i],HEX);
}
Serial.println("");
}
//选卡(锁定卡片,防止多数读取,去掉本行将连续读卡)
rfid.selectTag(str);
}
rfid.halt(); //命令卡片进入休眠状态
}
void ShowCardType(unsigned char * type)
{
Serial.print("Card type: ");
if(type[0]==0x04&&type[1]==0x00)
Serial.println("MFOne-S50");
else if(type[0]==0x02&&type[1]==0x00)
Serial.println("MFOne-S70");
else if(type[0]==0x44&&type[1]==0x00)
Serial.println("MF-UltraLight");
else if(type[0]==0x08&&type[1]==0x00)
Serial.println("MF-Pro");
else if(type[0]==0x44&&type[1]==0x03)
Serial.println("MF Desire");
else
Serial.println("Unknown");
}
将上述代码验证后上传到零知板,就可以看到测试结果了。这里打开串口调试窗口后,将NFC门禁卡靠近RC522天线区域,就可以扫描到NFC卡的信息:
完整代码:RC522-SerialNumberRead.7z(点击下载)