单片机_MFRC522射频模块使用方法(含代码)

单片机_MFRC522射频模块使用方法(含代码)MFRC522射频模块使用方法本文只讲解MFRC522射频模块使用方法(下文简称522模块),不包含原理说明,原理下篇~一、管脚解释522模块总共有8个引脚,除去复位、GND接地、3.3V电源、NC端悬空、SCK时钟端,剩余3个引脚,起数据作用。二、连接方法这里主要使用IIC的方法,相信写过IIC的同学都很熟悉这段代码。不熟悉也没关系,后文会附上52单片机的LCD1602显示UID的实现代码,包含UART测试代码。显而易见,通过总线办法读取数据只需要依照手册写代码就可以读出来,这里官方提供了

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

MFRC522射频模块使用方法

本文只讲解MFRC522射频模块使用方法(下文简称522模块),不包含原理说明,原理下篇~

一、管脚解释

在这里插入图片描述
522模块总共有8个引脚,除去复位、GND接地、3.3V电源、NC端悬空、SCK时钟端,剩余3个引脚,起数据作用。

二、连接方法

在这里插入图片描述
这里主要使用IIC的方法,相信写过IIC的同学都很熟悉这段代码。不熟悉也没关系,后文会附上52单片机的LCD1602显示UID的实现代码,包含UART测试代码。
显而易见,通过总线办法读取数据只需要依照手册写代码就可以读出来,这里官方提供了函数代码。同样后文附上。
再附上IIC的数据传输规则。
在这里插入图片描述

三、实战

什么是UID?

   假设我们写522代码的目的是为了设计一个门禁系统,那提出的第一个问题一定是:我们需要从ic中读出什么数据?什么数据又是正确的数据?
   ic卡分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位。

在这里插入图片描述
第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。
这样一个东西,叫做UID,这是一个存储在ic中的不可更改的数据,他是一个4字节16进制数,所以我们将他作为我们的判断依据。
幸运的是厂商给我们提供了参考代码,返回这个ic的UID。见后

读取数据流程

在这里插入图片描述
简单做个解释。1、检测是否有人打卡(寻卡),2、放冲突,3、选择这张卡(目的是确认写入卡片),4、进入三次相互验证(对于门禁系统来说仅涉及1,2步骤)

寻卡

卡片的电气部分只由一个天线和ASIC组成。
天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。
工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。
了解原理了,来看看官方代码。

/
// req_code[in]:寻卡方式
// 0x52:寻找感应区内所有符合14443A标准的卡(一般传入参数)
// 0x26:寻找进入休眠状态的卡
// pTagType[out]:卡片类型代码
/
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{ 
   
   char status;  
   unsigned int  unLen;
   unsigned char ucComMF522Buf[MAXRLEN]; 
   ClearBitMask(Status2Reg,0x08);
   WriteRawRC(BitFramingReg,0x07);

   SetBitMask(TxControlReg,0x03);
 
   ucComMF522Buf[0] = req_code;

   status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

   if ((status == MI_OK) && (unLen == 0x10))
   { 
       
       *pTagType     = ucComMF522Buf[0];
       *(pTagType+1) = ucComMF522Buf[1];
   }
   else
   { 
      status = MI_ERR;   }
   
   return status;
}

当req_code传入0x52时,如果寻找到卡,返回status == MI_OK == 0。调用:

if (PcdRequest(0x52, Temp) == MI_OK){ 
   }

放冲突

在通过了寻卡这个if后,进入到放冲突环节,对于门禁设计而言,进入这个函数最大的需要在于,这个函数的返回,是ic卡的UID。

/
// 防冲撞
// pSnr[out]:卡片UID,4字节
/ 
char PcdAnticoll(unsigned char *pSnr)
{ 
   
    char status;
    unsigned char i,snr_check=0;
    unsigned int  unLen;
    unsigned char ucComMF522Buf[MAXRLEN]; 
    

    ClearBitMask(Status2Reg,0x08);
    WriteRawRC(BitFramingReg,0x00);
    ClearBitMask(CollReg,0x80);
 
    ucComMF522Buf[0] = PICC_ANTICOLL1;
    ucComMF522Buf[1] = 0x20;

    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

    if (status == MI_OK)
    { 
   
    	 for (i=0; i<4; i++)
         { 
      
             *(pSnr+i)  = ucComMF522Buf[i];
             snr_check ^= ucComMF522Buf[i];
         }
         if (snr_check != ucComMF522Buf[i])
         { 
      status = MI_ERR;    }
    }
    
    SetBitMask(CollReg,0x80);
    return status;
}

当这个函数执行了后,所传入的pSnr参数就会被传入UID。
剩下的就是

if (UID == predict)

调试

使用UART进行调试有两种方法,一、上位机软件调试(开发板),二、串口调试,适用于打卡系统,可以直接与后端交互

一、开发板调试

我将其浓缩为三个步骤

1、将522模块连接上开发板(按照上文管教解释连接)。

2、打开串口调试助手

在这里插入图片描述

3、在串口发送区,输入 A 点击发送,为自动寻卡模式;若输入F 点击发送则为单次寻卡模式。将卡片放到读卡模块上,则可以看到读出卡的 ID 号。

二、串口调试

具体点应该叫做,代码版串口调试,或无需开发板版调试,hhh。
这种方法有个前提:你已经学会了怎么读取卡片的UID。
那我们的方法就很简单了,通过sbuf串口把我们接受到的UID发送出去。

void UART_send_byte(unsigned char dat)
{ 
   
	SBUF = dat;
	while (TI == 0);
	TI   = 0;
}
// 发送一个字符串
ART_send_string(unsigned char *buf)
{ 
   
	while (*buf != '\0')
	{ 
   
		UART_send_byte(*buf++);
	}
}

如果有小伙伴在尝试这种方法,并将这个UID通过ETH-01网络模块发送给服务器,相信会发现一个很有趣的事情,评论区见。
这里我补充一个函数

void  u16ToString(uchar Volume[], char *hexStr, uint u) { 
       /* hexStr Ϊת»»ºóµÄ×Ö·û´® XXXX*/
  	uint  j,k;
  	char  strlist[] = "0123456789ABCDEF";   /*16½øÖÆ×Ö·û±í£¬Óòé±í·¨¸ßЧ¿ìËÙ*/
	for(j=0;j<u;j++){ 
   
		if(Volume[j] != '\0'){ 
   
		  	for(k=0;k<2;k++){ 
   
				hexStr[j*2+k] = strlist[Volume[j] & 0x0f];        /*Volume & 0x0f£ºÈ¡µÃ ¸ÃλµÄ16½øÖÆÖµ£¬¶ÔÓ¦µÄ¾ÍÊÇstrÊý×éµÄasciiÂë*/
				Volume[j] = Volume[j] >> 4;
			} 
		}
		else{ 
   break;}
	}

}

分享到这里就结束了,我们评论区见~,最后附上代码。

百度云
链接: https://pan.baidu.com/s/14u8R8tpNyBmoxiftK0BCSA
提取码: u4x8

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159338.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python调用数组里某一个元素_python中数组用法

    python调用数组里某一个元素_python中数组用法##Python数组注意:Python不具有对数组的内置支持,但是可以使用[Python列表](https://www.w3schools.com/python/python_lists.asp)代替。注意:此页面显示了如何将LISTS用作数组,但是,要在Python中使用数组,您必须导入一个库,例如[NumPylibrary](https://www.w3schools.com/python…

    2022年8月13日
    11
  • java前端提示反射型xss_解决反射型XSS漏洞攻击「建议收藏」

    java前端提示反射型xss_解决反射型XSS漏洞攻击「建议收藏」1/*2*Copyright(C),2001-2019,xiaoi机器人3*Author:han.sun4*Date:2019/2/2811:395*History:6*7*作者姓名修改时间版本号描述8*/9package…

    2022年6月11日
    91
  • php用哪个版本_php什么版本好

    php用哪个版本_php什么版本好一. PHP5.2、5.3、5.4、5.5、5.6版本区别对比以及新功能详解1.php5.2以前1.1autoload的使用;当在代码中使用一个未定义的类的时候,该函数就会被调用

    2022年8月2日
    5
  • vue深拷贝与浅拷贝_vue深拷贝与浅拷贝

    vue深拷贝与浅拷贝_vue深拷贝与浅拷贝先说说1.栈内存,它的存取速度比较快,仅此于寄存器,栈中的数据还可以共享。其缺点表现在,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。使用完毕会被“隐式”回收2.堆内存,这和数据类型就有关系了,举个简单的例子leta=1,leta=b,你复制a,b会开辟新的栈内存,动态地分配内存大小,可以“按需分配”,其生存期也不必事先告诉编译器,在使用完毕后,Java的垃圾收集器会自动收走这些不再使用的内存块。其缺点为,由于要在运动时才动态分配内存,相比于栈内存,它的存取速度较慢。然后修改a

    2022年9月30日
    5
  • ❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】

    ❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】文章目录操作系统的发展史UnixMinixLinux操作系统的发展Minix没有火起来的原因Linux介绍Linux内核&发行版Linux内核版本Linux发行版本类Unix系统目录结构Linux目录用户目录命令行基本操作命令使用方法查看帮助文档helpman(manual)tab键自动补全history游览历史命令行中的ctrl组合键Linux命令权限管理列出目录的内容:ls显示inode的内容:stat文件访问权限修改文件权限:chmod修改文件所有者:chown修改文件所属组:chgrp文件.

    2022年6月1日
    25
  • 手把手教你制作机房三维场景(3D效果图)

    手把手教你制作机房三维场景(3D效果图)前言:随着信息技术的不断发展,大量数据中心机房的建设、监控软件已经成为机房管理者的重要武器,特别是机房效果图这一块,从简易的CAD到现在的3D效果图,从静态到三维动态的改进,机房监控软件基本上可以说是从无到有的一个过程,下面本文跟大家分享机房高大上的数据中心三维可视化管理软件的三维场景制作过程(俗称:3D效果图的制作过程)。以前的机房效果图现在的机房3D效果图数据中心可三维可视化管理软件,通过对现

    2022年6月2日
    147

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号