#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可以从资料调用过来自己的工程。