51单片机rc522读卡程序代码
时间: 2023-09-21 13:00:24 浏览: 262
RC522 51单片机读写卡程序(LCD12864).zip_51 rc522_lcd12864的读写_rc522 51_亲测可
5星 · 资源好评率100%
51单片机rc522读卡程序代码如下:
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P2^0; //RC522的SDA接口
sbit SCK = P2^1; //RC522的SCK接口
sbit MOSI = P2^2; //RC522的MOSI接口
sbit MISO = P2^3; //RC522的MISO接口
sbit RST = P2^4; //RC522的RST接口
sbit IRQ = P2^5; //RC522的IRQ接口
/*******************************************************
函数功能:向RC522发送一个字节的数据
入口参数:uchar data-发送的字节数据
返回值:无
********************************************************/
void WriteByte(uchar data)
{
uchar bitCount=0;
for(bitCount=0;bitCount<8;bitCount++)
{
if(data&0x80)
MOSI = 1;
else
MOSI = 0;
data<<=1;
SCK=0;
SCK=1;
}
}
/*******************************************************
函数功能:从RC522读取一个字节的数据
入口参数:无
返回值:读取到的字节数据
********************************************************/
uchar ReadByte(void)
{
uchar i,bitCount=0;
uchar data=0;
SDA = 1;
for(bitCount=0;bitCount<8;bitCount++)
{
SCK=0;
SCK=1;
data<<=1;
if(MISO)
data|=0x01;
}
return data;
}
/*******************************************************
函数功能:向RC522写入一个字节的命令
入口参数:uchar command-写入的命令
返回值:无
********************************************************/
void WriteCommand(uchar command)
{
uchar i,n;
SDA = 1;
SCK=0;
SDA = 0;
SCK=1;
WriteByte(command);
SCK=0;
SDA = 1;
SCK=1;
}
/*******************************************************
函数功能:向RC522写数据到寄存器
入口参数:uchar Address-寄存器地址, uchar value-要写入的数据
返回值:无
********************************************************/
void WriteData(uchar Address,uchar value)
{
SDA = 1;
SCK=0;
SDA = 0;
SCK=1;
WriteByte(Address);
SCK=0;
SDA = 1;
SCK=1;
WriteByte(value);
SCK=0;
SDA = 1;
SCK=1;
}
/*******************************************************
函数功能:从RC522寄存器读取数据
入口参数:uchar Address-寄存器地址
返回值:读取到的数据
********************************************************/
uchar ReadData(uchar Address)
{
uchar value;
SDA = 1;
SCK=0;
SDA = 0;
SCK=1;
WriteByte(Address);
SCK=0;
SDA = 1;
SCK=1;
value=ReadByte();
SCK=0;
SDA = 1;
SCK=1;
return value;
}
/*******************************************************
函数功能:RC522初始化
入口参数:无
返回值:无
********************************************************/
void InitRC522(void)
{
RST = P0^7;
SDA=1;
DisableRC522();
EnableRC522();
WriteCommand(0x01);
WriteData(0x2A,0x8D);
WriteData(0x2B,0x3E);
WriteData(0x2D,0x2B);
WriteCommand(0x0C);
WriteData(0x2C,0x01);
WriteData(0x2E,0x00);
WriteData(0x15,0x40);
WriteData(0x11,0x3D);
WriteCommand(0x03);
WriteData(0x26,0x07);
WriteData(0x27,0x80);
WriteCommand(0x1F);
}
/*******************************************************
函数功能:使能RC522
入口参数:无
返回值:无
********************************************************/
void EnableRC522(void)
{
uchar status;
SDA=1;
SDA = 1;
SCK=0;
WriteCommand(0x0F);
SCK=1;
SDA = 0;
SDA = 0;
status=ReadData(0x14);
WriteCommand(0x0D);
SDA=1;
delay_5us(1);
status&=0x7F;
WriteData(0x14,status);
}
/*******************************************************
函数功能:禁用RC522
入口参数:无
返回值:无
********************************************************/
void DisableRC522(void)
{
WriteData(0x15,0x00);
}
/*******************************************************
函数功能:延时函数
入口参数:uint n-延时时间
返回值:无
********************************************************/
void Delay(uint n)
{
while(n--);
}
/*******************************************************
函数功能:延时5微秒
入口参数:uchar t-延时时间
返回值:无
********************************************************/
void delay_5us(uchar t)
{
uchar i;
while(t--)
{
for(i=0;i<1;i++);
}
}
/************************************************************
函数功能:主函数
************************************************************/
void main(void)
{
uchar data;
InitRC522(); //初始化RC522模块
while(1)
{
WriteCommand(0x0A); //寻卡
data = ReadData(0x17); //读取寄存器状态值
if(data == 0x28) //如果寄存器状态值为0x28,则表示成功读取到卡片
{
//TODO: 进行卡片读取操作,例如读取卡片ID
}
Delay(10000); //延时一段时间后进行下一次循环
}
}
以上程序为51单片机的RC522读卡程序代码,通过函数来实现与RC522的通信,具体功能包括向RC522发送和读取字节数据,写入命令和数据到寄存器,以及RC522的初始化和使能禁用等操作。在主函数中进行循环读取卡片的操作,成功读取到卡片后,可进行特定操作,比如读取卡片ID。延时函数用于控制读卡的频率,使得读取操作不至于太过频繁。
阅读全文