[STM32] Stm32f103c8t6+RC522 实现读卡写卡功能(超详细,零基础,小白)

article/2025/8/22 23:23:50

 本篇文章内容总结下来就是

  1. 读卡            使用默认密码读卡所有扇区所有块的数据
  2. 写ID            使用默认密码读取卡一的0扇区的第一块数据并写入到卡二的0扇区的第一块里
  3. 密码读卡     不同厂家的初始密码不同,整理了一些默认密码,如果有收集到新的也可以补充进去
  4. 写全卡        使用默认密码读取卡一的全部扇区全部块数据并写入到卡二的全部扇区的全部块里

感谢@Khanivore!指出寻卡方法有参数没有写定义

目录

从来不按套路出牌的我

一.前期准备

STM32f103c8t6开发板

 Keil5编译器

串口工具

我就问你们什么叫专业

二.代码

简介RC522

代码功能

代码

总结

三.源码



从来不按套路出牌的我

没用的前言,看干货跳过这段

想必看到这篇文章的人都是已经翻阅了大量的文章资料,已经厌倦了那种通篇都是百度百科,通篇都是复制官方资料,通篇都是怎样点亮led灯的没有多少营养的文章

本篇文章除了插科打诨与耐人寻味的笑点之外尽可能的把干货提供给大家学习,我在学习RC522时大量的时间都花在查找资料上了,真正的编程时间可能只有找资料的三分之一,所以为了不让同样抱有学习热情的人因为找不到合适的资料而失去耐心最终失去学习的热情,我准备把我整理的干货拿出来与大家分享

没错,不务正业的我又回来了,这回是玩一玩Stm32单片机

当然也是从基础的C语言开始学习,大概自学了小半个月的C语言就开始上手Stm32了

自学是在B站看的视频,一边写笔记一边敲代码,好在有java的基础,不然我就和这行无缘了

好了废话不多说直接干货

一.前期准备

  1. Stm32f103c8t6开发板 1块
  2. RC522 1杯
  3. 杜邦线 适量
  4. 轻触开关 3g
  5. led灯  根据个人喜好添加
  6. ST-LINK V2 一根 也可以使用 CH340替代(根据个人喜好调整)
  7. 一台计算机 低于30吨的
  8. Keil5编译器 1千克
  9. 串口烧录程序 1匙
  10. 串口调试程序 1伊普西龙
  11. M1 CUID卡 2开尔文

 

STM32f103c8t6开发板

 

RC522模块

RC522相关资料:

链接: https://pan.baidu.com/s/1Qob5o4tv0_gBXrRk6AvLSQ

提取码: fkjt 

 

接线图

每个人接线的引脚不同,我这里是因为接入了其他无关紧要的模块才分开接线,不影响单独RC522连接STM32

RC522接线
RC522_RST  ======  GPIOA_Pin_0
RC522_MISO ======  GPIOA_Pin_1
RC522_MOSI ======  GPIOA_Pin_2  
RC522_SCK  ======  GPIOA_Pin_3  
RC522_SDA(NSS) ==  GPIOA_Pin_4GND ======  GND  ACC ======  ACC按钮接线
KEY1_ACC === GPIOB_Pin_0
KEY2_ACC === GPIOB_Pin_1GND === GND灯接线(也可以使用板载灯,这里使用板载灯)LED5_ACC === GPIOA_Pin_5 //模式灯 在选择模式时用于显示当前模式用
LED6_ACC === GPIOA_Pin_6 //确认灯 在识别到卡1时会亮起提示换卡GND === GND

 我用最强画图工具<画图>绘制的接线图

 

 

 Keil5编译器

Keil5编译器

链接: https://pan.baidu.com/s/10jR0g10jxdosawc49IOazQ

提取码: uizh

Keil5开发环境

自己收集整理并添加一些自己常用的方法的Stm32f103c8t6开发环境,解压即用

Keil5开发环境

链接: https://pan.baidu.com/s/1U5sOv9lvs3wwKkisiAFYAA

提取码: z1ih 

串口工具

串口调试程序 串口烧录程序

链接: https://pan.baidu.com/s/11VCAXnfmO1FCQQVjirIkrQ

提取码: h1uz

失效私信我


我就问你们什么叫专业

硬件配置,开发环境详细到这个地步,初学者能够直接上手学习

这就是专业

这就是一条龙服务,以后你们给其他人分享这篇文章时都可以说被一条龙服务过

二.代码

简介RC522

 

官方文档一共有109页接下来都是复制这个文档所以大家可以走了[dog]

我就简单总结一下白话文:

1.RC522能读卡

2.RC522能写卡

3.RC522能... 就这样,就是能读卡能写卡,我们要它的功能也就是读卡写卡,我没必要为了实现一个读卡功能把这一百多也的文档看完,也没有必要为了实现一个功能就把它的原理全部吃透

介绍完毕

代码功能

  1. 读卡            使用默认密码读卡所有扇区所有块的数据
  2. 写ID            使用默认密码读取卡一的0扇区的第一块数据并写入到卡二的0扇区的第一块里
  3. 密码读卡     不同厂家初始密码不同,整理了一些初始密码,如果有收集到新的也可以补充进去
  4. 写全卡        使用默认密码读取卡一的全部扇区全部块数据并写入到卡二的全部扇区的全部块里

怎么样,干不干,全是干货,没有废话

1.读卡效果图

这是一张CUID白卡,一会复制可以用作对比

有人会问扇区啥意思 区块啥意思,这个就百度去吧好多文章在讲RC522或者复制卡的文章都会用很大篇幅讲什么是卡什么是扇区什么是区块什么是密码段,之后文章就结束了也不说怎么读怎么写怎么复制,最后来一句未完待续或者下一篇文章再详细的写,之后尸沉东京湾留下一段佳话,在这里因为我是旱鸭子就不写了

SQ代表扇区 0~15扇区

QK代表区块 0~3区块

 

2.写ID效果图

这是一张目标卡,我们要将这张卡的0扇区的0块数据写到上面那张空白卡中

进行写操作 放上卡1=> 读取卡1=> 识别到卡1后打印卡唯一id,并提示可进行复制=> 放上卡2=> 写入卡2

1.读取卡1

 

读取卡2

 已经写到卡2中了

3.密码读卡

每个扇区的3号区块存储的就是该扇区的密码,只有读取时携带相同的密码才能看到并修改该扇区的数据,如果没有密码都不会读到该扇区

因为厂家为了卡片的数据安全各厂会定义自己的读卡密码

个人收集了一部分密码分享一下

unsigned char KEY[14][6]={{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},{0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5},{0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5},{0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF},{0x4D, 0x3A, 0x99, 0xC3, 0x51, 0xDD},{0x1A, 0x98, 0x2C, 0x7E, 0x45, 0x9A},{0x71, 0x4C, 0x5C, 0x88, 0x6E, 0x97},{0x58, 0x7E, 0xE5, 0xF9, 0x35, 0x0F},{0xA0, 0x47, 0x8C, 0xC3, 0x90, 0x91},{0x53, 0x3C, 0xB6, 0xC7, 0x23, 0xf6},{0x8F, 0xD0, 0xA4, 0xF2, 0x56, 0xE9},{0x66, 0x55, 0x44, 0x11, 0x22, 0x33},{0x66, 0x55, 0x44, 0x33, 0x22, 0x11}
};

 

4.写全卡效果

效果就是两张一模一样的卡

代码

磨叽了半天终于到了重点

代码里出现的 if(EN) if(CN) if(OLED) 代表是否打印对应语言,

EN 代表打印英文

CN 代表打印中文

OLED 代表在屏幕显示(因为接入一块OLED屏幕)

寻卡

要点:每次对卡进行操作时调用,两个方法一模一样,就是第二种去掉了打印

验证卡片信息,防冲撞,选卡


//感谢Khanivore!指出有连个变量没有声明
unsigned char TagType[2];
unsigned char SelectedSnr[4];//				
//						寻卡方法
//					char Pcdmain(){u8 status;u8 ID_num[9];u8 *ID;	//卡号status= PcdRequest(REQ_ALL,TagType);//寻卡if(!status){status = PcdAnticoll(SelectedSnr);//防冲撞	if(!status){status=PcdSelect(SelectedSnr);//选卡if(!status){if(EN)printf("Read the success !! \r\n");if(CN)printf("寻找卡片成功 !! \r\n");if(OLED)GUI_ShowString(0,16,"1",16,1);ID = Card_ID(SelectedSnr,ID_num); //获取卡IDif(EN)printf("ID:%s !! \r\n",ID_num);if(CN)printf("卡号:%s !! \r\n",ID_num);if(OLED)GUI_ShowString(16,16,"ID:",16,1);if(OLED)GUI_ShowString(40,16,ID,16,1);return status;}else{if(EN)printf("The selected card \r\n");if(CN)printf("卡片未找到 \r\n");if(OLED)GUI_ShowString(0,16,"2",16,1);return status;}}else{if(EN)printf("Anti-collision \r\n");if(CN)printf("卡片冲突 \r\n");if(OLED)GUI_ShowString(0,16,"3",16,1);return status;}}else{if(EN)printf("Looking for failure \r\n");if(CN)printf("卡片未找到 \r\n");if(OLED)GUI_ShowString(0,16,"4",16,1);return status;}}//				
//						寻卡方法
//					char Pcdmain_3(){u8 status;status= PcdRequest(REQ_ALL,TagType);//寻卡if(!status){status = PcdAnticoll(SelectedSnr);//防冲撞	if(!status){status=PcdSelect(SelectedSnr);//选卡if(!status){return status;}else{return status;}}else{return status;}}else{return status;}}

 

读卡

要点:密码密码密码 如果密码不对那就结束了,初始密码需要在成员变量中定义


//				
//					notarize = 1 读卡
//					unsigned char  DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //默认密码 	void  notarize_type1(){u8 status;u8 section=0;u8 block = 0;unsigned char block_value[16];u8 i=0;status = Pcdmain();if(!status){if(EN)printf("function NO1 Read the card ...\r\n");if(CN)printf("功能1 读取卡片 \r\n");if(OLED)GUI_ShowString(48,0,"NO_1",16,1);for( section = 0 ; section <16 ; section++ ){status = PcdAuthState(KEYA, (section*4+3), DefaultKey, SelectedSnr);// 校验1扇区密码,密码位于每一扇区第3块if(!status){		for(block = 0; block< 4 ; block++){status = PcdRead((section*4+block), block_value);  // 读卡,读取1扇区0块数据到buf[0]-buf[16] if(EN)printf("SQ:%d , QK:%d     ",section,block);if(EN)printf("passA	");for (i = 0 ; i<6; i++){if(EN)printf("%X ",block_value[i]);}if(EN)printf("		Value	");for (i = 6; i<10; i++){if(EN)printf("%X ",block_value[i]);}if(EN)printf("		passB	");for (i = 10; i<16; i++){    if(EN)printf("%X ",block_value[i]);}if(EN)printf("\r\n");}}else {if(EN)printf("wrong password \r\n");if(CN)printf("密码错误 \r\n");if(OLED)GUI_ShowString(0,16,"5",16,1);}}if(EN)printf("\r\n");if(EN)printf("\r\n");if(EN)printf("\r\n");}else{if(EN)printf("Looking for failure \r\n");if(CN)printf("卡片未找到 \r\n");if(OLED)GUI_ShowString(0,16,"4",16,1);}}

 

复制ID

ID的重要性就不用我多说了,因为通常的ID卡扇区0是出厂就定义好的ID不能再修改,所以也是唯一性的保障,大多数的系统也只会记录ID作为验证使用

而除了0扇区之外的扇区多为详细信息存储使用,如取电卡的电量值,水卡的水量值,饭卡的余额之类,因为这部分可以读写所以密码会与出厂密码不同


//				
//					notarize = 2 复制卡id
//					void  notarize_type2(){u8 status;u8 test_status = 0; //id在0扇区 , 测试使用其他扇区u8 block_num=0;u8 copy_tf = 1;unsigned char copy_value[16];status = Pcdmain_3();if(!status){if(EN)printf("function NO1 Read the card ...\r\n");if(CN)printf("功能2 复制卡片 \r\n");if(OLED)GUI_ShowString(48,0,"NO_2",16,1);//读取并复制卡1 指定扇区指定块数据status = PcdAuthState(KEYA, (test_status*4+3), DefaultKey, SelectedSnr);// 校验1扇区密码,密码位于每一扇区第3块	DefaultKey为默认密码if(!status){	status = PcdRead((test_status*4+0), copy_value);  // 读卡,读取1扇区0块数据到buf[0]-buf[16]if(!status){if(EN)printf("COPY: SQ:%d , QK:%d     ",test_status,0);if(EN)printf("passA	");for (block_num = 0; block_num<6; block_num++){    if(EN)printf("%X ",copy_value[block_num]);}if(EN)printf("		Value	");for (block_num = 6; block_num<10; block_num++){    if(EN)printf("%X ",copy_value[block_num]);}if(EN)printf("		passB	");for (block_num = 10; block_num<16; block_num++){    if(EN)printf("%X ",copy_value[block_num]);}if(EN)printf("\r\n");}if(EN)printf("Read over \r\n");if(CN)printf("复制成功 替换目标卡片 \r\n");delay_ms(500);		if(OLED)GUI_ShowString(0,16,"COPY OK, CARD_2",16,1);				//读取第二张卡片do{LED6S;   	//PC13输出低电平//delay_ms(200);//LED6S;				//PC13输出高电平if(KEY1==0){status = Pcdmain_3();if(!status){if(EN)printf("Ready to write card 2 ...\r\n");if(CN)printf("写卡2\r\n");if(OLED)GUI_ShowString(0,0,"CARD2...",16,1);status = PcdAuthState(KEYA, (test_status*4+3), DefaultKey, SelectedSnr);// 校验1扇区密码,密码位于每一扇区第3块	if(!status){status = PcdWrite((test_status*4+0), copy_value);  // 写卡,将buf[0]-buf[16]写入1扇区0块if(!status){LED6R;				//PC13输出高电平delay_ms(20);LED6S;   	//PC13输出低电平delay_ms(20);LED6R;				//PC13输出高电平delay_ms(20);LED6S;   	//PC13输出低电平delay_ms(20);LED6R;				//PC13输出高电平if(EN)printf("Copy success (*^▽^*) \r\n");if(CN)printf("写入成功 (*^▽^*) \r\n");if(OLED)GUI_ShowString(0,16,"Copy SUCC (*^▽^*)",16,1);}else{if(EN)printf("Copy the failure (╯‵□′)╯︵┻━┻ \r\n");if(CN)printf("复制失败	 (╯‵□′)╯︵┻━┻  \r\n");if(OLED)GUI_ShowString(0,16,"Copy the failure",16,1);}}else{if(EN)printf("card 2 wrong password \r\n");if(CN)printf("卡2密码错误 \r\n");if(OLED)GUI_ShowString(0,16,"card 2 PASS WRONG",16,1);	}LED6R;				//PC13输出高电平}else{if(EN)printf("Looking for failure \r\n");if(CN)printf("卡片2未找到 \r\n");if(OLED)GUI_ShowString(0,16,"4",16,1);LED6R;				//PC13输出高电平}LED6R;				//PC13输出高电平copy_tf = 0;}}while(copy_tf);}else{if(EN)printf("wrong password \r\n");if(CN)printf("密码错误 \r\n");if(OLED)GUI_ShowString(0,16,"5",16,1);	}}else{if(EN)printf("Looking for failure \r\n");if(CN)printf("卡片未找到 \r\n");if(OLED)GUI_ShowString(0,16,"4",16,1);}}

 

密码测试

测试每个扇区的第3区块密码,当然幸运的话就是初始密码,点背的话也没关系只需要255*255*255*255*255*255 = 274,941,996,890,625次尝试也可以得到密码


//				
//					notarize = 3 常规密码测试
//					void  notarize_type3(){u8 status;u8 section=0;u8 block_num=0;u8 KEY_num = 0 ;unsigned char block_value[16];u8 i=0;status = Pcdmain_3();if(!status){if(EN)printf("function NO3 Password test ...\r\n");if(CN)printf("功能3 常规密码测试 \r\n");if(OLED)GUI_ShowString(48,0,"NO_3",16,1);for( section = 0 ; section <16 ; section++ ){for( KEY_num =0 ; KEY_num < 13 ; KEY_num++){status = Pcdmain_3();if(!status){//printf("section:%d  KEY:%d %d %d %d %d %d   ",section,KEY[KEY_num][0],KEY[KEY_num][1],KEY[KEY_num][2],KEY[KEY_num][3],KEY[KEY_num][4],KEY[KEY_num][5]);status = PcdAuthState(KEYA, (section*4+3), KEY[KEY_num], SelectedSnr);// 校验1扇区密码,密码位于每一扇区第3块if(!status){status = 1;//for(block_num = 0; block_num< 4 ; block_num++){status = PcdRead((section*4+3), block_value);  // 读卡,读取1扇区0块数据到buf[0]-buf[16] if(EN)printf("SQ:%d , QK:%d  KEY:%X %X %X %X %X %X   ",section,3,KEY[KEY_num][0],KEY[KEY_num][1],KEY[KEY_num][2],KEY[KEY_num][3],KEY[KEY_num][4],KEY[KEY_num][5]);if(EN)printf("passA	");for (i = 0 ; i<6; i++){ if(EN)printf("%X ",block_value[i]);}if(EN)printf("		Value	");for (i = 6; i<10; i++){    if(EN)printf("%X ",block_value[i]);}if(EN)printf("		passB	");for (i = 10; i<16; i++){    if(EN)printf("%X ",block_value[i]);}if(EN)printf("\r\n");//}	}else {}}status = 1;}}if(EN)printf("\r\n");if(EN)printf("\r\n");if(EN)printf("\r\n");}else{if(EN)printf("Looking for failure \r\n");if(CN)printf("卡片未找到 \r\n");if(OLED)GUI_ShowString(0,16,"4",16,1);}}

复制全卡

由于全卡每个扇区的密码不同所以复制全卡用处不大


//				
//					notarize = 4 复制全卡
//					void  notarize_type4(){u8 status;u8 section=0;u8 block = 0;u8 block_num=0;u8 copy_tf = 1;unsigned char block_value[16];unsigned char copy_value[16][3][16];status = Pcdmain_3();if(!status){if(EN)printf("function NO1 Read the card ...\r\n");if(CN)printf("功能1 读取卡片 \r\n");if(OLED)GUI_ShowString(48,0,"NO_4",16,1);for( section = 0; section <16 ; section++ ){status = PcdAuthState(KEYA, (section*4+3), DefaultKey, SelectedSnr);// 校验1扇区密码,密码位于每一扇区第3块if(!status){	for(block = 0; block< 3 ; block++){status = PcdRead((section*4+block), block_value);  // 读卡,读取1扇区0块数据到buf[0]-buf[16] for( block_num = 0; block_num < 16 ; block_num++){copy_value[section][block][block_num] = block_value[block_num];}}}}if(EN)printf("\r\n");if(EN)printf("\r\n");if(EN)printf("\r\n");if(EN)printf("\r\n");for(section = 0 ; section < 16 ; section++){for(block = 0 ; block < 3 ; block++){//for(block_num = 0 ; block_num < 16 ; block_num++){if(EN)printf("SQ:%d , QK:%d     ",section,block);if(EN)printf("passA	");for (block_num = 0; block_num<6; block_num++){    if(EN)printf("%X ",copy_value[section][block][block_num]);}if(EN)printf("		Value	");for (block_num = 6; block_num<10; block_num++){    if(EN)printf("%X ",copy_value[section][block][block_num]);}if(EN)printf("		passB	");for (block_num = 10; block_num<16; block_num++){    if(EN)printf("%X ",copy_value[section][block][block_num]);}if(EN)printf("\r\n");//}}if(EN)printf("\r\n");}if(EN)printf("\r\n");if(EN)printf("\r\n");if(EN)printf("\r\n");if(EN)printf("Read over \r\n");if(CN)printf("复制成功 替换目标卡片 \r\n");if(OLED)GUI_ShowString(0,16,"COPY OK, CARD_2",16,1);				//读取第二张卡片do{if(KEY1==0){status = Pcdmain_3();if(!status){if(EN)printf("Ready to write card 2 ...\r\n");if(CN)printf("写卡2\r\n");if(OLED)GUI_ShowString(0,0,"CARD2...",16,1);for(section = 0 ; section < 16 ; section++){//status = Pcdmain_3();//if(!status){status = PcdAuthState(KEYA, (section*4+3), DefaultKey, SelectedSnr);// 校验1扇区密码,密码位于每一扇区第3块	if(!status){for(block = 0 ; block < 3 ; block++){//status = PcdWrite((section*4+block), copy_value[section][block]);  // 写卡,将buf[0]-buf[16]写入1扇区0块//status = PcdWrite((section*4+block), zero);  // 写卡,将buf[0]-buf[16]写入1扇区0块status = PcdWrite((4*4+3), setkey);  // 写卡,将buf[0]-buf[16]写入1扇区0块if(EN)printf("SQ:%d , QK:%d     ",section,block);if(EN)printf("passA	");for (block_num = 0; block_num<6; block_num++){    if(EN)printf("%X ",copy_value[section][block][block_num]);}if(EN)printf("		Value	");for (block_num = 6; block_num<10; block_num++){    if(EN)printf("%X ",copy_value[section][block][block_num]);}if(EN)printf("		passB	");for (block_num = 10; block_num<16; block_num++){    if(EN)printf("%X ",copy_value[section][block][block_num]);}if(EN)printf("\r\n");if(!status){if(EN)printf("SQ:%d , QK:%d     Copy success (*^▽^*) \r\n",section,block);if(CN)printf("SQ:%d , QK:%d     写入成功 (*^▽^*) \r\n",section,block);if(OLED)GUI_ShowString(0,16,"Copy SUCC ",16,1);}else{if(EN)printf("SQ:%d , QK:%d     Copy the failure (* ̄︿ ̄) \r\n",section,block);if(CN)printf("SQ:%d , QK:%d     复制失败    (* ̄︿ ̄) \r\n",section,block);if(OLED)GUI_ShowString(0,16,"Copy the failure",16,1);}if(CN)printf("SQ:%d , QK:%d (*^▽^*) \r\n",section,block);}}else{if(EN)printf("card 2 wrong password \r\n");if(CN)printf("卡2密码错误 \r\n");if(OLED)GUI_ShowString(0,16,"5",16,1);	}		}	}else{if(EN)printf("Looking for failure \r\n");if(CN)printf("卡片2未找到 \r\n");if(OLED)GUI_ShowString(0,16,"4",16,1);}copy_tf = 0;}}while(copy_tf);	}else{if(EN)printf("Looking for failure \r\n");if(CN)printf("卡片未找到 \r\n");if(OLED)GUI_ShowString(0,16,"4",16,1);}}

总结

 最后显摆一下我的手工

这篇文章写一半的时候就停了下来,在草稿中存了小半年,最后在年末穿上秋裤的时候想了想还是补全发出来吧

让我写文章的动力是因为C语言可以对这类单片机进行编程,进而读取环境数据,简单的温湿度模块,人体红外感应模块,触摸模块,光敏模块等等

而这与网络爬虫的作用很相似,一个是获取网络信息的自动程序,一个是获取现实世界信息的自动程序,这也是我为什么写爬虫写着写着就学起C的原因

当然爬虫这方面也在找一些有趣有挑战的网站,如果有人能分享有挑战的项目我也会尝试的

 

三.源码

 

闲聊到这里,想要源码的两种途径

1.积分下载 链接我会放上来

https://download.csdn.net/download/qq_41873771/13992549

由于有部分人不尊重我的劳动成果,写了分享条件不遵守,依然私信直接发邮箱,现博客整顿所有资源取消积分下载,如有需要请私信说明缘由小问题我会直接解答,需要源码需要和我聊天,只要私信我的不管任何形式只要出现邮箱直接屏蔽拉黑

2.私信我 陪我聊聊天好么 秋梨膏

 

那么终于能完结这篇文章了,主要是我太懒,没有什么动力能刺激到我创作

预告一下,下次我要做......等一下有人敲门  我去看看......

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/oyaMjcxu.shtml

相关文章

STM32/51单片机实训day4——RFID数据读取|RC522|串口数据收发、可模拟RFID (三) 仿真

目录 1 任务指导 2 实验步骤 3 串口调试 4 USART配置 5 fputs函数重写 内 容&#xff1a;能够读取RFID卡S50的ID——编程实现串口数据收发 学 时&#xff1a;3学时 知识点&#xff1a;电路图设计、USART配置 重点&#xff1a; USART配置 难点&#xff1a;USART配置 时间…

Arduino文档阅读笔记-RFID工作原理及RC522模块介绍

RFID工作原理 RFID&#xff08;Radio Frequency Identification&#xff09;&#xff1a;无线射频识别 RFID由2个部分组成&#xff1a;应答器/标签被贴在某个物体上的东东。无线接收器用于读取应答器/标签上的数据。 读卡器由频射模块及高平磁场组成。Tag/应答器为待感应设备…

Arduino教程 RFID-RC522读IC卡门禁原理及破解防御

【文章特色&#xff1a;1、提出IC卡破解原理和简单有效的防御方法2、网上其他文章对于硬件如何接线说得模糊不清】 1、序言 先说下简单门禁系统的原理&#xff1a; (1)IC卡激活&#xff1a;门禁卡管理员将卡片放到读卡器、这时软件读取到IC卡的UID序列号信息(相当于身份证号…

51单片机驱动RC522模块

最近在某宝上买了一块RC522模块&#xff0c;试玩了下&#xff0c;读写卡正常。想学习使用新的东西时&#xff0c;有必要了解它的工作原理和工作过程&#xff0c;不清楚或者不知道的可以参考相关数据手册和参考文献&#xff0c;在这里为了节省自己的时间&#xff0c;我只对我的5…

基础篇010.1 STM32驱动RC522 RFID模块之一:基础知识

目录 1. RFID概述 1.1 RFID工作原理 1.2 RFID分类 1.3 RFID模块 1.4 RFID卡片 1.5 IC卡和ID卡介绍 1.6 IC卡和ID的区分 2. Mifare卡结构原理 2.1 Mifare卡概述 2.2 Mifare非接触式 IC 卡性能简介&#xff08;M1&#xff09; 2.2.1 Mifare S50与Mifare S70 2.2.2 S5…

RC522

该文为摘抄其他文章内容&#xff0c;主要为RC500书籍.pdf. 1. 通讯标准 1.1 RFID卡标准&#xff1a; 1.2 ISO/IEC 14443通讯标准&#xff1a; 2. 读写器 3. 卡 3.1 mifare 1卡 3.1.1 Mifare 1硬件结构&#xff1a; ① 射频接口&#xff1a;在 RF 射频接口电路中&#xff0c;包…

arduino rc522模块使用

rfid IC卡 先了解IC卡一些前置知识。 首先我们会有一张ic卡&#xff08;M1类型IC卡&#xff0c;一般买到的都是1K存储空间&#xff09;&#xff0c;在rc522代码中会出现这个&#xff0c;就是对IC卡进行检查PICC_TYPE_MIFARE_4K和PICC_TYPE_MIFARE_1K就是一种卡片类型不同大小…

RC522线圈设计及相关参数的选定

RC522线圈设计及相关参数的选定 LC低通滤波电路&#xff08;蓝色区域&#xff09;NFC天线电路(绿色区域)匹配电路(黄色区域)品质因子阻抗匹配 接收电路&#xff08;浅黄色区域&#xff09;TGND的疑问 LC低通滤波电路&#xff08;蓝色区域&#xff09; TX1、TX2为载波发送引脚。…

基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522

目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3.2 配置调试方式 3.3 配置时钟电路 3.4 配置时钟 3.5 配置GPIO 3.6 配置SPI 3.7 配置串口 3.8 项目配置 4. MDK工程…

STM32—驱动RFID-RC522模块

文章目录 一.S50&#xff08;M1&#xff09;卡介绍1.S50&#xff08;M1&#xff09;卡基础知识2.内部信息3.存取控制4.数据块的存取控制5.控制块的存取控6.工作原理7.M1与读卡器的通信 二.RC522工程代码详解1.RC522与M1通信2.STM32对RC522寄存器的操作3.STM32对RC522的基础通信…

STM32F103+RFID-RC522模块 实现简单读卡写卡demo

目录 前言特别声明:代码下载&#xff1a;功能介绍&#xff1a; 接线STM32STM32F1开发指南(精英版)-库函数版本_V1.2STM32中文参考手册 RFID-RC522RFID射频模块电路原理图 使用图效果图测试程序0 RC522_Handle()最终效果一、先用手机软件NFC Writer读取空卡看看内容1、打开软件和…

使用stm32驱动RC522读取IC卡

stm32驱动RC522 RC522与PN532简介关于STM32驱动方式接线说明程序烧录查看卡号总结 原文链接&#xff1a;https://www.yourcee.com/newsinfo/2924379.html 点击图片购买 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章&#xff0c;RC522与PN532在使用上都可以用…

RC522(RFID模块)实践总结

此次使用RC522模块和S50卡实现近场通讯功能&#xff08;开发板与RC522通讯方式为硬件SPI&#xff09;&#xff0c;就实践过程中的一些知识点进行总结&#xff1a; RC522模块和M1卡要点介绍&#xff1b;驱动代码&#xff1b;出现问题及解决方法&#xff1b; 1. RC522模块和M1卡…

RC522应用总结

公司需要做刷卡模块&#xff0c;因此选了RC522做demo程序。下面就RC522知识做简要的总结。 本人使用stm32的硬件spi接口搭建工程&#xff0c;相关的配置如下&#xff1a; spi配置&#xff1a; 引脚配置 SDA -------PA4 SCLK ----PB13 MOSI -------PB15 MISO ------PB14 IRQ —没…

RC522 - NFC刷卡模块

RC522 - NFC刷卡模块 芯片介绍/引脚介绍 MF RC522 是应用于 13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是 NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片&#xff0c;是智能仪表和便携式手持设备研发的较好选择。 非接触式…

STM32--RFID无线射频技术(RC522刷卡模块)

文章目录 1、RFID的概念2、RFID的工作原理&#xff08;1&#xff09;RFID中间件的概念&#xff08;2&#xff09;RFID中间件具有以下特点:&#xff08;3&#xff09;RFID中间件的意义: 3、RFID频率划分&#xff08;1&#xff09;RFID低频特性&#xff08;2&#xff09;RFID高频…

STM32——NFC门禁模块(RC522)

文章目录 1. 前言&#xff08;包括一些个人理解&#xff09;2. RC522门禁工作过程3. CubeMx配置3.1 SPI通讯的配置3.2 SDA和REST引脚的配置 4. 外设代码函数编写4.1 主函数能调用的接口函数4.2 二级内部调用函数4.3 第三级最底层函数4.4 头文件 5. 使用教程 1. 前言&#xff08…

RC522(RFID)读写驱动

文章目录 1、RC522驱动原理2、手机APP查看卡信息3、驱动移植4、读写卡5、源码 1、RC522驱动原理 我们常见的RC522大概如下所示&#xff0c;PCB部分是主机&#xff0c;然后白色的和绿色的都是IC卡&#xff0c;IC卡可以存储信息&#xff0c;通过靠近PCB主机部分就可以被感应到从…

RC522模块学习

目录 1.原理简介 2.SPI通信 3.获取卡号实验 3.驱动函数 参考&#xff1a; https://www.cnblogs.com/ivantang/p/3904025.html https://xiaolong.blog.csdn.net/article/details/117075834?spm1001.2014.3001.5506 https://blog.csdn.net/weixin_47316662/article/detai…

Jmeter下载安装配置---测试小白

一&#xff0c;进入官网&#xff1a;http://jmeter.apache.org/ 1.第一步进入官网如下图 2.选择进行下载&#xff0c;下载下来为一个压缩包&#xff0c;解压即可。 3.我下载的是jmeter4.0版本&#xff0c;对应jdk1.8。然后就进行解压。个人认为要注意3点&#xff1a;1.解压之后…