×
单片机 > 单片机程序设计 > 详情

51单片机读写RC522卡(LCD12864)RFID开发程序与原理图

发布时间:2021-01-22 发布时间:
|

RFID RC522程序及原理

单片机源程序如下:

#include "reg52.h"

#include "main.h"

#include "mfrc522.h"        

#include "LCD12864.h"

#include

#include


sbit BEEP=P0^1        ;

#define SET_BEEP  BEEP = 0

#define CLR_BEEP         BEEP = 1


//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令

//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反 

unsigned char code data2[4]  = {0x12,0,0,0};

unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 

//unsigned char g_ucTempbuf[20];    

unsigned char idata MLastSelectedSnr[4];

unsigned char idata RevBuffer[30];  

//unsigned char data SerBuffer[20]; 

bit CmdValid;                            


unsigned char code ASCII_NUM[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

unsigned char idata LastKeyA[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//NO.2卡

unsigned char idata NewKeyA[6]={0x19,0x84,0x07,0x15,0x76,0x14};//NO.2卡

unsigned char idata NewKey[16]={0x19,0x84,0x07,0x15,0x76,0x14,

                                0xff,0x07,0x80,0x69,

                                0x19,0x84,0x07,0x15,0x76,0x14};


unsigned char idata Read_Data[16]={0x00};


//unsigned char idata RevBuffer[30];

//unsigned char idata MLastSelectedSnr[4];

unsigned char data OperationCard;


uchar data bWarn,bPass;



#define        REGCARD                        0xa1

#define        CONSUME                        0xa2

#define READCARD                0xa3

#define ADDMONEY                0xa4


void KeyScan(void)

{

                if(REGCARDBTN == 0)//注册

                {

                                delay_10ms(1);

                                if(REGCARDBTN == 0 )

                                                OperationCard = REGCARD;        

                                LCD_PutString(0,3,"注册:");

                }

                if(CONSUMEBTN == 0)//消费

                {

                                delay_10ms(1);

                                if(CONSUMEBTN == 0 )

                                                OperationCard = CONSUME;

                                LCD_PutString(0,3,"消费:      ");        

                }

                if(ADDMONEYBTN == 0)//充值

                {

                                delay_10ms(1);

                                if(ADDMONEYBTN == 0 )

                                                OperationCard = ADDMONEY;        

                                LCD_PutString(0,3,"充值:      ");

                }

                if(READCARDBTN == 0)//读卡信息

                {

                                delay_10ms(1);

                                if(READCARDBTN == 0 )

                                                OperationCard = READCARD;        

                                LCD_PutString(0,3,"查询:      ");

                }

}


/*

void delay(void)

{

        uint i ;

        for(i=0;i++;i<100)

        ;

}


void ShortBeep(void)

{

        uint i;

        for(i=0;i<3;i++)

        {

                SET_BEEP;            

                delay_10ms(3);

                CLR_BEEP;

                delay();

        }

}


void LongBeep(void)

{

        uint i;

        for(i=0;i<20;i++)

        {

                SET_BEEP;            

                delay_10ms(5);

                CLR_BEEP;

                delay();

        }

}

*/

void Warn(void)

{         

  uchar data ii;

  for(ii=0;ii<3;ii++)

  {

    SET_BEEP;//ShortBeep();如果是有源蜂鸣器就一句SET_BEEP就ok了

    delay_10ms(5);

    CLR_BEEP;

    delay_10ms(5);

  }         

}


void Pass(void)

{        

  SET_BEEP;//LongBeep();如果是有源蜂鸣器就一句SET_BEEP就ok了

  delay_10ms(30);

  CLR_BEEP;

}

void CtrlProcess(void)

{

        //        unsigned char idata Write_First_Data[16];

          char string[]="           ";

                unsigned char idata Write_Consume_Data[16];

          

                signed long money_value;

          float f_money_value;

          unsigned char ii;

          char status;


          status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节


          if(status!=MI_OK)

                          return;

                

                for(ii=0;ii<2;ii++)

                {

                                string[2*ii]   = ASCII_NUM[(RevBuffer[ii]>>4)&0x0f];

                                string[2*ii+1] = ASCII_NUM[RevBuffer[ii]&0x0f];

                }

                string[4] = '';

                LCD_PutString(3,1,string);//LCD显示卡类型


                status=PcdAnticoll(&RevBuffer[2]);//防冲撞,返回卡的序列号 4字节

                 

                if(status!=MI_OK)

              return;


          memcpy(MLastSelectedSnr,&RevBuffer[2],4);//4字节序列号 放到MLastSelectedSnr

                for(ii=0;ii<4;ii++)

                {

                                string[2*ii]   = ASCII_NUM[(MLastSelectedSnr[ii]>>4)&0x0f];

                                string[2*ii+1] = ASCII_NUM[MLastSelectedSnr[ii]&0x0f];



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于STM32单片机秒中断源和闹钟中断源的解决方案