基本信息
源码名称:RC522模块测试例程
源码大小:3.54M
文件格式:.rar
开发语言:C/C++
更新时间:2021-05-27
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
测试RC522刷卡模块
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "rc522_config.h"
#include "rc522_function.h"
#include <stdbool.h>
#define spacenum 20
uint8_t KeyValue[]={0xFF ,0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 卡A密钥
unsigned char Block=0;
unsigned char Modify_Key[6]={0xff,0x00,0xff,0x00,0xff,0x00};//修改后的密码
unsigned char Default_Key[6]={0xff,0xff,0xff,0xff,0xff,0xff};//初始密码
unsigned char Write_Buffer[16]={//修改密码A
0xff,0x00,0xff,0x00,0xff,0x00,//KEYA
0xFF,0x07,0x80,0x69, //控制
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF //KEYB
};
unsigned char Write_Buffer1[16]={//还原密码A
0xff,0xff,0xff,0xff,0xff,0xff,//KEYA
0xFF,0x07,0x80,0x69,//控制
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF//KEYB
};
unsigned char Data_Buffer[16];//读块数据缓存
void ModifyKey(u8 Block);//修改扇区1的第三块控制块的KEY A
void RecoveryKey(u8 Block);//恢复扇区1的KEY A
//修改扇区1的第0块控制块的KEY A
void ModifyKey(u8 Block)
{
u8 block=Block;
uint8_t ucArray_ID [ 4 ]; /*先后存放IC卡的类型和UID(IC卡序列号)*/
uint8_t ucStatusReturn; /*返回状态*/
/*寻卡*/
if ( ( ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID ) ) != MI_OK )
/*若失败再次寻卡*/
ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID );
if ( ucStatusReturn == MI_OK )
{
/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/
if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
{
PcdSelect(ucArray_ID);
if(PcdAuthState( PICC_AUTHENT1A, block, Default_Key, ucArray_ID )==MI_OK)//校验初始密码
{
printf("验证秘钥成功!Card_Block: %2d\r\n",Block);
delay_ms(100);
if(PcdRead(block,Data_Buffer)==MI_OK)
{
printf("%*s读取块 %02d 成功!Block_Info: %02X%02X%02X%02X%02X%02X %02X%02X%02X%02X %02X%02X%02X%02X%02X%02X \r\n",
spacenum,"",block,
Data_Buffer[0],Data_Buffer[1],Data_Buffer[2],Data_Buffer[3],
Data_Buffer[4],Data_Buffer[5],Data_Buffer[6],Data_Buffer[7],
Data_Buffer[8],Data_Buffer[9],Data_Buffer[10],Data_Buffer[11],
Data_Buffer[12],Data_Buffer[13],Data_Buffer[14],Data_Buffer[15]);
}
if(PcdWrite(block,Write_Buffer)==MI_OK)
{
printf("密码修改成功!");
}
else
{
printf("密码修改失败!");
}
}
else
{
printf("密码验证失败!");
}
}
PcdHalt();
return;
}
}
//恢复扇区1的KEY A 注销该卡
void RecoveryKey(u8 Block)
{
u8 block=Block;
uint8_t ucArray_ID [ 4 ]; /*先后存放IC卡的类型和UID(IC卡序列号)*/
uint8_t ucStatusReturn; /*返回状态*/
/*寻卡*/
if ( ( ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID ) ) != MI_OK )
/*若失败再次寻卡*/
ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID );
if ( ucStatusReturn == MI_OK )
{
/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/
if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
{
PcdSelect(ucArray_ID);
if(PcdAuthState( PICC_AUTHENT1A, block, Modify_Key, ucArray_ID )==MI_OK)//校验初始密码
{
printf("验证秘钥成功!Card_Block: %2d\r\n",Block);
delay_ms(100);
if(PcdRead(block,Data_Buffer)==MI_OK)
{
printf("%*s读取块 %02d 成功!Block_Info: %02X%02X%02X%02X%02X%02X %02X%02X%02X%02X %02X%02X%02X%02X%02X%02X \r\n",
spacenum,"",block,
Data_Buffer[0],Data_Buffer[1],Data_Buffer[2],Data_Buffer[3],
Data_Buffer[4],Data_Buffer[5],Data_Buffer[6],Data_Buffer[7],
Data_Buffer[8],Data_Buffer[9],Data_Buffer[10],Data_Buffer[11],
Data_Buffer[12],Data_Buffer[13],Data_Buffer[14],Data_Buffer[15]);
}
if(PcdWrite(block,Write_Buffer1)==MI_OK)
{
printf("密码还原成功!");
}
else
{
printf("密码还原失败!");
}
}
else
{
printf("密码验证失败!");
}
}
PcdHalt();
return;
}
}
void IC_test ( void )
{
uint32_t writeValue = 100;
uint32_t readValue;
char cStr [ 30 ];
uint8_t ucArray_ID [ 4 ]; /*先后存放IC卡的类型和UID(IC卡序列号)*/
uint8_t ucStatusReturn; /*返回状态*/
u8 sta;
u8 sta2;
u8 sum;
u8 t;
u8 read_result;
/*寻卡*/
if ( ( ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID ) ) != MI_OK )
/*若失败再次寻卡*/
ucStatusReturn = PcdRequest ( PICC_REQIDL, ucArray_ID );
if ( ucStatusReturn == MI_OK )
{
/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/
if ( PcdAnticoll ( ucArray_ID ) == MI_OK )
{
PcdSelect(ucArray_ID);
for(t=1;t<64;t )
{ sta=PcdAuthState( PICC_AUTHENT1A, t, KeyValue, ucArray_ID );//校验密码
if(sta==MI_OK)
{
printf ( "第%d个块的密码校验成功,返回值:%X\r\n",t,sta); //打印密码校验结果
sta=0;
if((t%4)!=3)
{
WriteAmount(t,t); //写入金额
printf ( "第%d个块写入:金额%d元\r\n",t,t);
}
read_result=ReadAmount(t,&readValue);
printf ( "第%d个块读取函数返回值:%X\r\n",t,read_result);
if((t%4)!=3)
{
sprintf ( cStr, "TThe residual amount: %d", readValue);
printf ("第%d块余额为:%d\r\n",t,readValue);
}
delay_ms(1000);
if(t>=63)
{
t=0;
}
}
else
{
printf ( "第%x个块的密码校验失败,返回值:%X\r\n",t,sta);
}
}
PcdHalt();
return;
// sta2=WriteAmount(0x11,writeValue); //写入金额
//printf ( "%x\r\n",sta2); //打印写入函数返回值
/*sta2=ReadAmount(0x11,&readValue);
if(sta2== MI_OK) //读取金额
{
//writeValue =100;
sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X",ucArray_ID [0], ucArray_ID [1], ucArray_ID [2],ucArray_ID [3] );
printf ( "%s\r\n",cStr ); //打印卡片ID*/
/*sprintf ( cStr, "TThe residual amount: %d", readValue);
printf ("余额为:%d\r\n",readValue);
PcdHalt();
return;
}*/
}
}
}
int main(void)
{
u8 key;
u16 times=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延时初始化
uart_init(115200); //串口初始化波特率为115200
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
RC522_Init (); //RC522模块所需外设的初始化配置
printf ( "WF-RC522 Test\r\n" );
PcdReset ();
M500PcdConfigISOType ( 'A' );//设置工作方式
while(1)
{
key=KEY_Scan(0);
//printf("%d\r\n",key);
// IC_test ();//IC卡检测
if(key==KEY0_PRES)
{
printf("KEY0按下\r\n");
ModifyKey(7);
}
if(key==KEY1_PRES)
{
printf("KEY1按下\r\n");
RecoveryKey(7);
}
times ;
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);
}
}