一、實驗簡介
非接觸式IC卡又稱射頻卡,由IC芯片、感應天線組成,常被用于智能儀表和便攜式手持設備中,如“三表”(水表、電表、燃氣表)應用。其射頻卡技術,將射頻識別技術和IC卡技術結合,結束了無源(卡中無電源)和免接觸這一難題,為電子器件領域帶來突破。卡片在一定距離范圍(通常為5—10cm)靠近讀寫器表面,通過無線電波的傳遞來完成數據的讀寫操作。
二、實驗器材
本實驗使用到了CW32-48F大學計劃開發板、TTS語音播報模塊、RC522刷卡模塊、IC鑰匙扣卡及Keil5開發環境。
CW32-48F大學計劃板
TTS語音播報模塊
RC522刷卡模塊
IC鑰匙扣卡
實物圖
【RC522刷卡模塊與單片機接線】:
3.3V -- 3.3V
RST -- PB15
GND -- GND
IRQ 懸空
MISO -- PB14
MOSI -- PB13
SCK -- PB12
SDA -- PA6
(注:采用SPI通信方式)
【TTS語音播報模塊與單片機接線】:
黑線 -- GND
紅線 -- 3.3V
黃線 -- PA9
白線 -- PA10
三、原理簡介
RC522模塊(射頻讀寫器)向IC卡發一組固定頻率的電磁波,卡片內有一個LC串聯諧振電路,其頻率與讀寫器發射的頻率相同,這樣在電磁波激勵下,LC諧振電路產生共振,從而使電容內有了電荷;在這個電荷的另一端,接有一個單向導通的電子泵,將電容內的電荷送到另一個電容內存儲,當所積累的電荷達到2V時,此電容可作為電源為其它電路提供工作電壓,將卡內數據發射出去或接受讀寫器的數據。
非接觸性IC卡與讀卡器之間通過無線電波來完成讀寫操作。二者之間的通訊頻率為13.56MHZ。非接觸性IC卡本身是無源卡,當讀寫器對卡進行讀寫操作時,讀寫器發出的信號由兩部分疊加組成:一部分是電源信號,該信號由卡接收后,與本身的L/C產生一個瞬間能量來供給芯片工作。另一部分則是指令和數據信號,指揮芯片完成數據的讀取、修改、儲存等,并返回信號給讀寫器,完成一次讀寫操作。
四、核心代碼
main.c:
#include "main.h"
#include "Uart.h"
#include "stdio.h"
#include "Delay.h"
#include "RC522.h"
#include "Buzzer.h"
#include "Lcd_Driver.h"
#include "LCD_calculate.h"
#define MONRY 100 //IC卡初始金額
uint8_t RecPcd[2]={0}; //存放IC卡類型
uint8_t uid[4]={0}; //存放IC唯一序列號
uint8_t read[16]={0}; //存放讀出的數據
uint8_t write[16]={0}; //存放寫入的數據
uint8_t DefaultKey[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//密鑰(出廠默認)
void Card_Refresh(void) //刷新卡的余額,僅在第一次使用IC卡或者IC金額刷光后使用
{
write[0]=MONRY; //將初始金額存進要寫入IC卡的數組中
RC522_PcdWrite(0x01,write);//將數據寫入塊1
}
int main()
{
char str[16]=""; //存放顯示在屏幕上的字符串
Lcd_Init(); //TFT屏幕初始化
UART3_Init(); //串口3初始化,通過串口進行語音播報
Buzzer_Init(); //初始化板載蜂鳴器
RC522_Init(); //初始化RC522刷卡模塊
Gui_DrawFont_GBK16(0,0,BLUE,WHITE," BUS "); //顯示界面
TFTShowString(2,0,"price: 1 RMB "); //單次刷卡金額
while(1)
{
TFTShowString(4,0,"Waiting card...");
if(RC522_PcdRequest(PICC_REQALL,RecPcd)==MI_OK) //尋卡,有卡就認
{
GPIO_WritePin(CW_GPIOB,GPIO_PIN_3,GPIO_Pin_SET); //尋卡成功則蜂鳴器發出“滴”的一聲
Delay_ms(100);
GPIO_WritePin(CW_GPIOB,GPIO_PIN_3,GPIO_Pin_RESET);
if(RC522_PcdAnticoll(uid)==MI_OK)//防沖突,應對同時有多張卡的情況,將被選中卡片的序列號保存到uid中
{
if(RC522_PcdSelect(uid)==MI_OK) //選定序列號為uid的卡片
{
if(RC522_PcdAuthState(PICC_AUTHENT1A,0x01,DefaultKey,uid)==MI_OK)//驗證該卡片第一扇區A密鑰
{
// Card_Refresh(); //刷新卡的余額
if(RC522_PcdRead(0x01,read)==MI_OK) //1.讀取塊1(16字節)數據
{
write[0]=read[0]-1; //2.讀出數據的第一字節減去(車)票價,存到寫入數據的第一字節中
if(RC522_PcdWrite(0x01,write)==MI_OK) //3.寫入數據到塊1
{
if(RC522_PcdRead(0x01,read)==MI_OK) //4.讀出刷卡后塊1的數據,進行播報和顯示
{
printf("刷卡成功");//語音播報刷卡成功
TFTShowString(4,0,"Brushing card...");
sprintf(str," balance:%d",read[0]);
TFTShowString(6,0,str);//顯示卡中余額
}
}
}
}
}
}
}
Delay_s(1); //刷卡間隔
TFTShowString(6,0," "); //覆蓋余額顯示
}
}
五、效果演示
B站演示視頻 :https://www.bilibili.com/video/BV1mG411C7FE/?spm_id_from=333.999.0.0
*附件:基于CW32的RC522刷卡模塊的應用源碼.zip
審核編輯:湯梓紅
-
單片機
+關注
關注
6043文章
44622瀏覽量
638556 -
模塊
+關注
關注
7文章
2733瀏覽量
47748 -
射頻卡
+關注
關注
0文章
60瀏覽量
20954 -
CW32
+關注
關注
1文章
218瀏覽量
735
發布評論請先 登錄
相關推薦
評論