基于CW32的RC522 刷卡模块的应用

本文介绍了RC522刷卡模块的工作原理、所需物料以及如何与CW32单片机配合实现非接触式通信。通过实例展示了如何在智能仪表中使用该模块进行数据读写,包括密钥验证和余额操作的过程。
摘要由CSDN通过智能技术生成

例程资料链接如下(群文件也可下载):
BD网盘链接:
https://pan.baidu.com/s/110FD7JQyuP-aBmEngzbsig?pwd=vi1l
提取码:vi1l
相关视频:基于CW32的RC522刷卡模块的应用

一、简介

RC522 刷卡模块是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员,是NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片。

非接触式IC卡又称射频卡,由IC芯片、感应天线组成,常被用于智能仪表和便携式手持设备中,如“三表”(水表、电表、燃气表)应用。其射频卡技术,将射频识别技术和IC卡技术结合,结束了无源(卡中无电源)和免接触这一难题,为电子器件领域带来突破。卡片在一定距离范围(通常为5—10cm)靠近读写器表面,通过无线电波的传递来完成数据的读写操作。

二、所需物料

本实验使用到了CW32-48F大学计划开发板、TTS语音播报模块、RC522刷卡模块、IC钥匙扣卡及Keil5开发环境。

在这里插入图片描述
在这里插入图片描述
【RC522刷卡模块与单片机接线】

3.3V – 3.3V
RST – PB15
GND – GND
IRQ 悬空
MISO – PB14
MOSI – PB13
SCK – PB12
SDA – PA6
(注:采用SPI通信方式)

【TTS语音播报模块与单片机接线】
黑线 – GND
红线 – 3.3V
黄线 – PA9
白线 – PA10

三、原理简介

RC522模块(射频读写器)向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。

非接触性IC卡与读卡器之间通过无线电波来完成读写操作。二者之间的通讯频率为13.56MHZ。非接触性IC卡本身是无源卡,当读写器对卡进行读写操作时,读写器发出的信号由两部分叠加组成:一部分是电源信号,该信号由卡接收后,与本身的L/C产生一个瞬间能量来供给芯片工作。另一部分则是指令和数据信号,指挥芯片完成数据的读取、修改、储存等,并返回信号给读写器,完成一次读写操作。

四、核心代码

main.c:
#include "main.h"
#include "Uart.h"
#include "stdio.h"
#include "Delay.h"
#include "RC522.h"
#include "Buzzer.h"
#include "Lcd_Driver.h"
#include "LCD_calculate.h"

#define MONRY 100    //IC卡初始金额

uint8_t RecPcd[2]={0};  //存放IC卡类型
uint8_t uid[4]={0};     //存放IC唯一序列号
uint8_t read[16]={0};   //存放读出的数据
uint8_t write[16]={0};  //存放写入的数据
uint8_t DefaultKey[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//密钥(出厂默认)

void Card_Refresh(void)     //刷新卡的余额,仅在第一次使用IC卡或者IC金额刷光后使用
{
	write[0]=MONRY;   //将初始金额存进要写入IC卡的数组中
	RC522_PcdWrite(0x01,write);//将数据写入块1
}

int main()
{
	char str[16]="";   //存放显示在屏幕上的字符串
	Lcd_Init();        //TFT屏幕初始化
	UART3_Init();      //串口3初始化,通过串口进行语音播报
	Buzzer_Init();		 //初始化板载蜂鸣器
	RC522_Init();			 //初始化RC522刷卡模块
	Gui_DrawFont_GBK16(0,0,BLUE,WHITE,"      BUS       ");  //显示界面
	TFTShowString(2,0,"price: 1 RMB  ");  //单次刷卡金额
	while(1)
	{	
		TFTShowString(4,0,"Waiting card...");
		if(RC522_PcdRequest(PICC_REQALL,RecPcd)==MI_OK) //寻卡,有卡就认
		{	
			GPIO_WritePin(CW_GPIOB,GPIO_PIN_3,GPIO_Pin_SET);  //寻卡成功则蜂鸣器发出“滴”的一声
			Delay_ms(100);
			GPIO_WritePin(CW_GPIOB,GPIO_PIN_3,GPIO_Pin_RESET);
			if(RC522_PcdAnticoll(uid)==MI_OK)//防冲突,应对同时有多张卡的情况,将被选中卡片的序列号保存到uid中
			{	
				if(RC522_PcdSelect(uid)==MI_OK) //选定序列号为uid的卡片
				{
					if(RC522_PcdAuthState(PICC_AUTHENT1A,0x01,DefaultKey,uid)==MI_OK)//验证该卡片第一扇区A密钥
					{			
//						Card_Refresh();	//刷新卡的余额				
						if(RC522_PcdRead(0x01,read)==MI_OK)     //1.读取块1(16字节)数据
						{
							write[0]=read[0]-1;                   //2.读出数据的第一字节减去(车)票价,存到写入数据的第一字节中
							if(RC522_PcdWrite(0x01,write)==MI_OK) //3.写入数据到块1
							{
								if(RC522_PcdRead(0x01,read)==MI_OK) //4.读出刷卡后块1的数据,进行播报和显示
								{	
									printf("刷卡成功");//语音播报刷卡成功
									TFTShowString(4,0,"Brushing card...");
									sprintf(str,"  balance:%d",read[0]);
									TFTShowString(6,0,str);//显示卡中余额  
								}
							}
						}
					}
				}
			}
		}
		Delay_s(1); //刷卡间隔
		TFTShowString(6,0,"                "); //覆盖余额显示
	}
}

五、效果演示

在这里插入图片描述

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值