51单片机rfid读卡程序
时间: 2023-08-13 12:05:35 浏览: 129
以下是51单片机通过RFID读卡器读取RFID卡片的示例代码:
```c
#include <reg52.h> // 引入单片机头文件
sbit beep=P1^5; // 蜂鸣器引脚
sbit led=P1^4; // LED引脚
unsigned char code table[16] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}; // RFID卡片ID码的映射表
void delay(unsigned int i) // 延时函数
{
unsigned int j,k;
for(j=i;j>0;j--)
for(k=120;k>0;k--);
}
void write(unsigned char addr, unsigned char dat) // 写入数据到RC522寄存器
{
P0 = addr;
P2 &= ~0x01;
P0 = dat;
P2 |= 0x01;
}
unsigned char read(unsigned char addr) // 从RC522寄存器读取数据
{
P0 = addr|0x80;
P2 &= ~0x01;
delay(1);
P2 |= 0x01;
delay(1);
return P0;
}
void init() // 初始化RC522
{
write(0x01,0x0F); // 复位
write(0x2A,0x8D); // 开启天线
write(0x2B,0x3E); // 天线增益
write(0x2D,0x30); // 信号强度调节
write(0x2C,0); // 关闭M1卡片检测
}
unsigned char request() // 寻卡
{
unsigned char status;
unsigned int i;
write(0x0D,0x07);
status = read(0x0D);
if(status == 0x07) // 寻到卡
{
status = 0;
write(0x0D,0x00);
write(0x0E,0x0C);
write(0x0F,0x00);
for(i=0;i<1000;i++) // 等待卡片回应
{
status = read(0x0F);
if(status == 0x18)
break;
delay(1);
}
if(status == 0x18) // 卡片已经准备好
{
write(0x0D,0x08);
status = 1;
}
}
return status;
}
unsigned char anticoll() // 防冲突
{
unsigned char i,status;
unsigned char cardid[5];
write(0x0D,0x01);
status = read(0x0D);
if(status == 0x01) // 防冲突成功
{
status = 0;
cardid[0] = read(0x16);
cardid[1] = read(0x17);
cardid[2] = read(0x18);
cardid[3] = read(0x19);
cardid[4] = read(0x1A);
for(i=0;i<4;i++)
status ^= cardid[i];
if(status != cardid[4]) // 校验失败
status = 0;
}
return status;
}
void main()
{
unsigned char i,cardid[5];
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18;
TR0 = 1;
ET0 = 1;
EA = 1;
init();
while(1)
{
if(request()) // 寻卡成功
{
if(anticoll()) // 防冲突成功
{
for(i=0;i<5;i++)
cardid[i] = read(0x16+i);
for(i=0;i<4;i++)
{
P0 = table[cardid[i] >> 4];
delay(10);
P0 = table[cardid[i] & 0x0F];
delay(10);
}
P0 = 0x00;
delay(100);
led = !led;
beep = 1;
delay(100);
beep = 0;
}
}
}
}
void timer0() interrupt 1 // 定时器中断
{
TH0 = 0xFC;
TL0 = 0x18;
beep = !beep;
}
```
这段代码使用了RC522 RFID模块进行卡片的读取,通过不断的寻卡和防冲突操作,最终可以将读取到的RFID卡片ID码输出到P0口,并且控制LED和蜂鸣器进行状态的提示。其中,需要注意的是RC522模块的引脚连接和初始化操作。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)