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

您所在的位置:网站首页 ID卡可以复制给M1卡吗 [STM32] Stm32f103c8t6+RC522 实现读卡写卡功能(超详细,零基础,小白)

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

2024-07-03 18:53| 来源: 网络整理| 查看: 265

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

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

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

目录

从来不按套路出牌的我

一.前期准备

STM32f103c8t6开发板

 Keil5编译器

串口工具

我就问你们什么叫专业

二.代码

简介RC522

代码功能

代码

总结

三.源码

从来不按套路出牌的我

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

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

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

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

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

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

好了废话不多说直接干货

一.前期准备 Stm32f103c8t6开发板 1块RC522 1杯杜邦线 适量轻触开关 3gled灯  根据个人喜好添加ST-LINK V2 一根 也可以使用 CH340替代(根据个人喜好调整)一台计算机 低于30吨的Keil5编译器 1千克串口烧录程序 1匙串口调试程序 1伊普西龙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_4 GND ====== GND ACC ====== ACC 按钮接线 KEY1_ACC === GPIOB_Pin_0 KEY2_ACC === GPIOB_Pin_1 GND === 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能... 就这样,就是能读卡能写卡,我们要它的功能也就是读卡写卡,我没必要为了实现一个读卡功能把这一百多也的文档看完,也没有必要为了实现一个功能就把它的原理全部吃透

介绍完毕

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

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

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); //获取卡ID if(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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3