51单片机控制RFID的代码
时间: 2023-11-13 20:03:56 浏览: 44
以下是一个简单的基于51单片机的RFID读写器控制代码示例:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit cs=P2^0; //RFID片选信号
sbit mosi=P2^1; //RFID数据发送引脚
sbit miso=P2^2; //RFID数据接收引脚
sbit sck=P2^3; //RFID时钟信号
uchar cmd[]={0x01,0x00,0x00,0x00,0x00,0x01,0x0a}; //读卡指令
uchar data_buf[16]; //存储读取到的卡数据
void delay(uint i) //延时函数
{
uint j;
for(j=0;j<i;j++);
}
void write_mfrc522(uchar addr, uchar value) //写寄存器函数
{
cs=0;
sck=0;
mosi=addr;
sck=1;
mosi=value;
sck=1;
cs=1;
}
uchar read_mfrc522(uchar addr) //读寄存器函数
{
uchar val;
cs=0;
sck=0;
mosi=((addr<<1)&0x7e)|0x80;
sck=1;
val=miso;
sck=1;
cs=1;
return val;
}
void init_mfrc522() //初始化函数
{
write_mfrc522(0x01,0x0f); //复位MFRC522
write_mfrc522(0x2a,0x8d); //调制器设置
write_mfrc522(0x2b,0x3e); //调制器设置
write_mfrc522(0x2c,0x03); //调制器设置
write_mfrc522(0x2d,0x00); //天线设置
write_mfrc522(0x15,0x40); //内部定时器设置
write_mfrc522(0x11,0x3f); //通信速率设置
}
uchar request_mfrc522(uchar req_mode,uchar *tag_type) //寻卡函数
{
uchar status;
uint un_len;
write_mfrc522(0x0a,0x01); //清空缓冲区
tag_type[0]=req_mode;
status=to_card(0x0c,tag_type,1,data_buf,&un_len);
if(status==0)
return 0;
else
return 1;
}
uchar to_card(uchar cmd,uchar *data_send,uchar send_len,uchar *data_recv,uint *recv_len) //向卡发送命令并接收数据
{
uchar status=0;
uchar irq=0;
uchar i;
write_mfrc522(0x01,0x0f); //复位MFRC522
write_mfrc522(0x0d,0x01); //发送命令
write_mfrc522(0x0e,send_len);
cs=0;
sck=0;
mosi=cmd;
sck=1;
if(send_len)
{
for(i=0;i<send_len;i++)
{
mosi=data_send[i];
sck=0;
sck=1;
}
}
if(cmd==0x0c)
irq=0x77;
else if(cmd==0x0d)
irq=0x78;
write_mfrc522(0x0f,irq); //启动命令
i=100;
while(i--)
{
status=read_mfrc522(0x13);
if(status&0x01)
break;
delay(1000);
}
if(!(status&0x01))
return 0;
if(status&0x06)
return 0;
if(cmd==0x0c)
{
*recv_len=read_mfrc522(0x14);
for(i=0;i<*recv_len;i++)
data_recv[i]=read_mfrc522(0x15);
}
return 1;
}
void main()
{
uchar status;
uchar str[16];
uchar i;
init_mfrc522(); //初始化MFRC522
while(1)
{
status=request_mfrc522(0x52,str); //寻卡
if(status==0)
{
for(i=0;i<16;i++)
str[i]=0;
continue;
}
status=to_card(0x0c,cmd,7,data_buf,&un_len); //读卡
if(status==0)
{
for(i=0;i<16;i++)
str[i]=0;
continue;
}
for(i=0;i<16;i++)
str[i]=data_buf[i];
for(i=0;i<16;i++)
data_buf[i]=0;
delay(5000);
}
}
```
以上代码中,通过控制MFRC522读写器的SPI接口,实现了寻卡、读卡等功能。具体实现过程可以参考MFRC522芯片的数据手册。需要注意的是,以上代码只是一个简单的示例,实际应用中需要根据具体需要进行相应的修改和优化。