日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

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

發布時間:2023/12/15 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 单片机_MFRC522射频模块使用方法(含代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 != '
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++);
}
}

')
{

UART_send_byte(*buf++);
}
}

如果有小伙伴在嘗試這種方法,并將這個UID通過ETH-01網絡模塊發送給服務器,相信會發現一個很有趣的事情,評論區見。
這里我補充一個函數

void  u16ToString(uchar Volume[], char *hexStr, uint u) { 
       /* hexStr ?a×a??oóμ?×?·?′? XXXX*/
  	uint  j,k;
  	char  strlist[] = "0123456789ABCDEF";   /*16????×?·?±í£?ó?2é±í·¨??D§?ì?ù*/
	for(j=0;j<u;j++){ 
   
		if(Volume[j] != '
void  u16ToString(uchar Volume[], char *hexStr, uint u) { 
    /* hexStr ?a×a??oóμ?×?·?′? XXXX*/
uint  j,k;
char  strlist[] = "0123456789ABCDEF";   /*16????×?·?±í£?ó?2é±í·¨??D§?ì?ù*/
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£oè?μ? ????μ?16?????μ£???ó|μ??íê?strêy×éμ?ascii??*/
Volume[j] = Volume[j] >> 4;
} 
}
else{ 
break;}
}
}

'){

for(k=0;k<2;k++){

hexStr[j*2+k] = strlist[Volume[j] & 0x0f]; /*Volume & 0x0f£oè?μ? ????μ?16?????μ£???ó|μ??íê?strêy×éμ?ascii??*/
Volume[j] = Volume[j] >> 4;
}
}
else{
break;}
}

}

分享到這里就結束了,我們評論區見~,最后附上代碼。

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

總結

以上是生活随笔為你收集整理的单片机_MFRC522射频模块使用方法(含代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。