51单片机驱动RC522模块

2020-08-26 18:41发布

  • 最近在某宝上买了一块RC522模块,试玩了下,读写卡正常。想学习使用新的东西时,有必要了解它的工作原理和工作过程,不清楚或者不知道的可以参考相关数据手册和参考文献,在这里为了节省自己的时间,我只对我的51程序做一个小小的笔记~~
    想要驱动RC522模块对IC卡(这里用的是M1卡型号是S50)进行读写操作,一定要有以下5个步骤:
    一、寻卡
    二、防冲突
    三、选择卡
    四、验证扇区密码(每个扇区都有密匙A和密匙B,验证正确才能对该扇区的某块进行读写)
    五、读/写

在这里插入图片描述

  • 硬件方面与单片机I/O口连好,使用SPI通信的时候NSS就是SDA引脚,IRQ悬空。
  • 主程序如下:
  • #include "reg52.h" 
    #include "mfrc522.h" 
    #include "intrins.h"
    #include 
    #include "stdio.h" 
    #define u8 unsigned char 
    #define u32 unsigned int 
    #define FOSC 12000000L //System frequency 
    #define BAUD 2400 //UART baudrate 
    sbit P11=P1^1;//作为一个辅助LED灯而已 
    bit CmdValid=0; 
    u8 status; u8 pTagType[2]; 
    u8 code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //配带的那张白卡的扇区密码 
    u8 idata MLastSelectedSnr[4];//这个用来存放卡片的序列号,4个字节 
    u8 idata RevBuffer[16]; 
    u8 me[16]={1,1,1,4,4,4,5,5,5,10,10,10,3,13,5,15};//想在块一写入 
    void ANT_INIT(); //定时器只是用来做波特率发生器 //使用定时器/计数器2的时候记得要在REG52.h头文件里添加:sfr T2CON = 0xC8; //否则会报错 
    
    void Timer2Init(void)	//100微秒@12.000MHz 
    { 
    T2MOD = 0;	//初始化模式寄存器 
    T2CON = 0x34; //Timer2 start run 
    TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vaule 
    TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8; 
    TR2 = 1;	//定时器2开始计时 
    } 
    
    void main() { 
    Timer2Init(); 
    P11=1; 
    SCON = 0x50; //8-bit variable UART 
    ES = 1; //Enable UART interrupt 
    EA = 1; //Open master interrupt switch 
    CmdValid=0; 
    PcdReset();	//以下三条是天线的初始化,必须 
    PcdAntennaOff(); 
    PcdAntennaOn(); //	
    delay_10ms(250); 
    M500PcdConfigISOType( 'A' );//工作模式“A” 
    while(1) 
    { 
    ANT_INIT(); 
    } 
    } 
    
    void ANT_INIT() 
    { 
    PcdHalt(); 
    PcdRequest(PICC_REQALL,&pTagType);//寻卡成功 
    status=PcdAnticoll(&MLastSelectedSnr);//防冲撞成功 
    PcdSelect(MLastSelectedSnr); 
    PcdAuthState(0x60,1,DefaultKey,MLastSelectedSnr); //
    status=PcdWrite(1,me);	//这是写,使用时可以先注释掉下面一行代码 //
    status=PcdRead(1,RevBuffer);//这是读,使用时可以先注释掉上面一行代码 
    if(status==0) SBUF=MLastSelectedSnr[0];//触发串口中断 
    else TI=0; 
    } 
    
    /*---------------------------- UART interrupt service routine ----------------------------*/ 
    void Uart_Isr() interrupt 4 using 1 
    {	
    static unsigned char i=0;	//白卡序列号 : BA A5 EF 0A 
    if(TI==1) 
    { 
    TI=0; 
    for(i=1;i<4;i++) 
    {
     SBUF=MLastSelectedSnr[i]; 
    while(!TI); 
    TI=0; 
    } 
    } 
    }
 

另外mfrc522.h和RC522.c可以从资料调用过来自己的工程。