RFID RC522程序及原理
RC522原理圖1.png (165.44 KB, 下載次數(shù): 99)
下載附件
2018-1-2 14:58 上傳
單片機源程序如下:
- #include "reg52.h"
- #include "main.h"
- #include "mfrc522.h"
- #include "LCD12864.h"
- #include <string.h>
- #include <stdio.h>
- sbit BEEP=P0^1 ;
- #define SET_BEEP BEEP = 0
- #define CLR_BEEP BEEP = 1
- //M1卡的某一塊寫為如下格式,則該塊為錢包,可接收扣款和充值命令
- //4字節(jié)金額(低字節(jié)在前)+4字節(jié)金額取反+4字節(jié)金額+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
- 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]);//尋天線區(qū)內(nèi)未進入休眠狀態(tài)的卡,返回卡片類型 2字節(jié)
- 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] = '\0';
- LCD_PutString(3,1,string);//LCD顯示卡類型
- status=PcdAnticoll(&RevBuffer[2]);//防沖撞,返回卡的序列號 4字節(jié)
-
- if(status!=MI_OK)
- return;
- memcpy(MLastSelectedSnr,&RevBuffer[2],4);//4字節(jié)序列號 放到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];
- }
- string[9] = '\0';
- LCD_PutString(3,2,string);// LCD顯示序列號
-
- status=PcdSelect(MLastSelectedSnr);//選卡
- if(status!=MI_OK)
- return;
-
- if(OperationCard==REGCARD)//注冊
- {
- status=PcdAuthState(PICC_AUTHENT1A,7,LastKeyA,MLastSelectedSnr);//
- //DelayNS(1);
- if(status!=MI_OK)
- {
- bWarn=1;
- return;
- }
- status=PcdWrite(7,&NewKey[0]);
-
- if(status!=MI_OK)
- {
- bWarn=1;
- return;
- }
- for(ii=0;ii<16;ii++)
- {
- Write_Consume_Data[ii]=0xaa;//Write_First_Data
- }
- memset( Write_Consume_Data, 0, sizeof(Write_Consume_Data) );//Write_First_Data Write_First_Data
- money_value = 5000;
- memcpy( Write_Consume_Data, ( uchar * )&money_value, 4 ); //Write_First_Data
-
- status=PcdWrite(4,&Write_Consume_Data[0]);//Write_First_Data
- if(status!=MI_OK)
- {
- bWarn=1;
- return;
- }
- LCD_PutString(0,3,"注冊: 成功");
- bPass=1;
- PcdHalt();
- }
- else if(OperationCard==READCARD)//讀卡
- {
- status=PcdAuthState(PICC_AUTHENT1A,7,NewKeyA,MLastSelectedSnr);//????KUAI4?
-
- if(status!=MI_OK)
- return;
-
- status=PcdRead(4,Read_Data);
-
- if(status!=MI_OK)
- {
- bWarn=1;
- return;
- }
- memcpy( (uchar *)&money_value, Read_Data, 4 );
-
- LCD_PutString(0,3,"查詢: ");
- f_money_value = money_value * 1.0/100;
- sprintf(string,"%5.2f",f_money_value);
- LCD_PutString(3,4,string);
- //ShowFloat816( 4, 5, ( f_money_value >= 0 ) ? ( ( f_money_value+0.5 )/100 ) : ( ( f_money_value-0.5 )/100 ) );
- if(f_money_value<0)
- bWarn=1;
- bPass=1;
- PcdHalt();
- }
- else if(OperationCard==CONSUME)//消費
- {
- status=PcdAuthState(PICC_AUTHENT1A,7,NewKeyA,MLastSelectedSnr);//
-
- if(status!=MI_OK)
- return;
-
- status=PcdRead(4,Read_Data);
- if(status!=MI_OK)
- {
- bWarn=1;
- return;
- }
- memcpy( (uchar *)&money_value, Read_Data, 4 );
- if(money_value<-10000)
- money_value=-10000;
- if(money_value<0)
- money_value+=10000;
- money_value=money_value-258;
- memcpy( Write_Consume_Data, (uchar *)&money_value, 4 );
- status=PcdWrite(4,&Write_Consume_Data[0]);
-
- if(status!=MI_OK)
- {
- bWarn=1;
- return;
- }
- //ShowFloat816(2,5,2.58);
- LCD_PutString(0,3,"消費: 2.58 ");
- f_money_value = money_value * 1.0/100;
- sprintf(string,"%5.2f",f_money_value);
- LCD_PutString(3,4,string);
- //ShowFloat816(4,5,( f_money_value >= 0 ) ? ( ( f_money_value+0.5 )/100 ) : ( ( f_money_value-0.5 )/100 ));
- if(money_value<0)
- bWarn=1;
- else
- bPass=1;
- PcdHalt();
- }
- else if(OperationCard==ADDMONEY)//充值
- {
- status=PcdAuthState(PICC_AUTHENT1A,7,NewKeyA,MLastSelectedSnr);//????KUAI4?
-
- if(status!=MI_OK)
- return;
- status=PcdRead(4,Read_Data);
- if(status!=MI_OK)
- {
- bWarn=1;
- return;
- }
- memcpy( (uchar *)&money_value, Read_Data, 4 );
- if(money_value<-10000)
- money_value=-10000;
- if(money_value<0)
- money_value+=10000;
- money_value=money_value+5000;
- memcpy( Write_Consume_Data, (uchar *)&money_value, 4 );
- status=PcdWrite(4,&Write_Consume_Data[0]);
-
- if(status!=MI_OK)
- {
- bWarn=1;
- return;
- }
-
- //ShowFloat816(2,5,50.00);
- LCD_PutString(0,3,"充值: 50.00 ");
- f_money_value = money_value * 1.0/100;
- sprintf(string,"%5.2f",f_money_value);
- LCD_PutString(3,4,string);
- //ShowFloat816(4,5,( f_money_value >= 0 ) ? ( ( f_money_value+0.5 )/100 ) : ( ( f_money_value-0.5 )/100 ));
- bPass=1;
- PcdHalt();
- }
- OperationCard = 0;
- }
- void iccardcode()
- {
- unsigned char cmd;
- unsigned char status;
-
- cmd = RevBuffer[0];
- switch(cmd)
- {
- case 1: // Halt the card //終止卡的操作
- status= PcdHalt();;
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 2: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
- // 尋卡,防沖突,選擇卡 返回卡類型(2 bytes)+ 卡系列號(4 bytes)
- status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
- if(status!=0)
- {
- status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
- if(status!=0)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- }
- RevBuffer[0]=3;
- RevBuffer[1]=status;
- break;
-
- case 3: // 防沖突 讀卡的系列號 MLastSelectedSnr
- status = PcdAnticoll(&RevBuffer[2]);
- if(status!=0)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- memcpy(MLastSelectedSnr,&RevBuffer[2],4);
- RevBuffer[0]=5;
- RevBuffer[1]=status;
- break;
- case 4: // 選擇卡 Select Card
- status=PcdSelect(MLastSelectedSnr);
- if(status!=MI_OK)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- RevBuffer[0]=3;
- RevBuffer[1]=status;
- break;
- case 5: // Key loading into the MF RC500's EEPROM
- status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校驗卡密碼
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 6:
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 7:
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 8: // Read the mifare card
- // 讀卡
- status=PcdRead(RevBuffer[1],&RevBuffer[2]);
- if(status==0)
- {RevBuffer[0]=17;}
- else
- {RevBuffer[0]=1;}
- RevBuffer[1]=status;
- break;
- case 9: // Write the mifare card
- // 寫卡 下載密碼
- status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 10:
- PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 12: // 參數(shù)設(shè)置
- PcdBakValue(RevBuffer[1], RevBuffer[2]);
- RevBuffer[0]=1; //contact
- RevBuffer[1]=0;
- break;
- }
- }
- /////////////////////////////////////////////////////////////////////
- //系統(tǒng)初始化
- /////////////////////////////////////////////////////////////////////
- void InitializeSystem()
- {
- P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;
- ET2 = 0;
- T2CON = 0x04; //TR2=1 LYF
- PCON = 0x00;//0x80;
- SCON = 0x70;//SMO SM1= 0 1 方式1,對于方式1,SM2=1,接收到有效的停止位時,將RI置1,REN置1時允許接收數(shù)據(jù)
- TMOD = 0x21;//TMOD = 0x22; TIMER1:C/T=0,定時器,M1M0=10,T1為工作模式2,即8位自動重裝載模式
- //TIMER0: C/T=0,定時器,M1M0=01,16位計數(shù)器
- TH1 = BAUD_2400;
- TL1 = TH1;
- TR1 = 1; // T1 作為波特率發(fā)生器
- TH0 = 0x60;
- TL0 = 0x60;
- TR0 = 0;
-
- ET0=0;
- ET1=0;
- EA=1;
- //EX0=1;
- //IT0 = 1;
- TR2=0;
- ES = 1;
- CmdValid=0;
- LED_GREEN = 1;
- PcdReset();
- PcdAntennaOff();
- PcdAntennaOn();
- M500PcdConfigISOType( 'A' );
- LED_GREEN = 0;
- delay_10ms(10);
- LED_GREEN = 1;
- delay_10ms(10);
- LED_GREEN = 0;
- }
- /////////////////////////////////////////////////////////////////////
- //用T2做延時子程序
- /////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- // 接收和發(fā)送中斷
- ///////////////////////////////////////////////////////////////////////
- void isr_UART(void) interrupt 4 using 1
- {
- unsigned char len, i;
- unsigned int j=0;
-
- if(RI)
- {
- len=SBUF;
- RI=0;
- for(i=0;i<len;i++)
- {
- while(!RI)
- {
- j++;
- if(j>1000)
- {
- break;
- }
- }
- if(j<1000)
- {
- RevBuffer[i]=SBUF;
- RI=0;
- j=0;
- }
- else
- {
- break;
- }
- }
- if(i==len)
- {
- REN=0;
- CmdValid=1;
- }
- }
- else if(!RI && TI)
- {
- TI=0;
- len=RevBuffer[0];
- for(i=0;i<len+1;i++)
- {
- SBUF=RevBuffer[i];
- while(!TI);
- TI=0;
- }
- REN=1;
- }
- }
- void UartProcess(void)
- {
- unsigned char baud;
- if(RevBuffer[0]==11) //為了加快相應(yīng)速度 測試風鳴器
- {
- RevBuffer[2]=RevBuffer[1];
- RevBuffer[0]=1; //contact
- RevBuffer[1]=0;
- CALL_isr_UART();
- LED_GREEN = 1;
- delay_10ms(RevBuffer[2]);
- LED_GREEN = 0;
- }
- else if(RevBuffer[0]==13) //設(shè)置通訊波特率
- {
- switch(RevBuffer[1])
- {
- case 0:
- baud=BAUD_9600;
- break;
- case 1:
- baud=BAUD_14400;
- break;
- case 2:
- baud=BAUD_19200;
- break;
- case 3:
- baud=BAUD_28800;
- break;
- case 4:
- baud=BAUD_38400;
- break;
- case 5:
- baud=BAUD_57600;
- break;
- case 6:
- baud=BAUD_115200;
- break;
- default:
- baud=BAUD_9600;
- break;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
6-51讀寫卡程序(LCD12864).rar
(98.49 KB, 下載次數(shù): 373)
2018-1-2 14:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|