大家好,我是Danny,今天我要记录一个使用Arduino对RFID(RC522)模块进行编程的实例,模仿了公交中的刷卡系统,将余额记录在卡片中,每次刷卡自动扣费500,如果余额不足则会自动显示“余额不足”。
本人第一次学习Arduino,所以有错误欢迎指正.。
Mifare卡的存储原理
RFID的作用,历史什么的,随便找网址一大堆,所以我就不多赘述了。这里主要讲一下我对RFID中的一种—RC522模块所使用的Mifare卡的存储原理的理解。
在Mifare卡中一共有16个扇区(sector),每个扇区有4个区块(Block),每个块有16个字节。按照编号,16个扇区分为0-15号,64个区块可以分为某个扇区的0-3号,或者直接分为0-63号。打个比方,5号扇区的2号区块,即是22号区块。
在如此多的块中,0号扇区的0号区块用于存放厂商代码,已经固化,不可更改。除此之外,每个扇区的块0、块1、块2为数据块,可用于存贮数据;而每个扇区的块3为控制块,包括了密码A、存取控制、密码B。
每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:
三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。存取控制(4字节,其中字节9为备用字节)结构如下所示:
数据块(块0、块1、块2)的存取控制如下:
控制块块 3 的存取控制与数据块(块 0、 1、 2)不同,它的存取控制如下:
以上即为Mifare卡的重要储存原理。
库,变量和setup函数
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#define RST_PIN 5
#define SS_PIN 53
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);//lcd显示器相关代码
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key; //这部分代码参考网站:https://github.com/miguelbalboa/rfid/blob/master/examples/MifareClassicValueBlock/MifareClassicValueBlock.ino#L66C1-L66C1
long int intvalue;
String strvalue="";
String me="";
String password="5E9941B"; //设置uid为“5E99041B”这个请根据自己的卡片自行定义
void setup()
{
Serial.begin(9600);
SPI.begin();
lcd.begin(16, 2);
mfrc522.PCD_Init();
Serial.println("Scan a MIFARE Classic card");
// 定义读写密钥
for (byte i = 0;