#define __MAIN_H
#include "main.h"
#undef __MAIN_H
#include #include #include #include #include "AT89S52.h" #include "RICReg.H" #include "m500a.H" #include "PICCCmdConst.h" #include "MfErrNo.h" #define uchar unsigned char #define uint unsigned int //#define DataPort P0 // 并行数据接口 //pin define mcu 引脚定义 sbit RC500RST = P1^0; //复位 rc500 sbit RC500CS = P1^1; //rc500片选 sbit CARD_LED = P1^2; //系统LED灯 sbit SPEAKER = P1^3; //扬声器 bit bcard; /////////////////////////////////////////////////////////////////////// // main /////////////////////////////////////////////////////////////////////// void main(void) { //波特率 uchar baud; InitSystem(); //系统初始化 delay_10ms(5); //延时 while (1) { delay_10ms(5); if (bCmd) //判断执行命令标志位 { bCmd = FALSE; //命令执行标志位清零 if(RevBuffer[0]==0x10) //RevBuffer[0]为0x10 { RevBuffer[2]=RevBuffer[1]; cmd_ok(); SPEAKER=1; CARD_LED=ON; delay_10ms(RevBuffer[2]); //闪灯并鸣笛 SPEAKER=0; CARD_LED=OFF; } else if(RevBuffer[0]==0x11) //RevBuffer[0]为0x11 { 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_19200; break; } cmd_ok(); delay_10ms(5); TR1 = 0; TH1 = baud; TL1 = TH1; delay_10ms(2); TR1 = TRUE; } else uart_process(); //调用串口处理函数 } } } /////////////////////////////////////////////////////////////////////// // 系统初始化 /////////////////////////////////////////////////////////////////////// void InitSystem(void) { RC500CS=0; //选通RC500 RC500RST=0; //复位 ET2 = FALSE; // 定时器2关中断 T2CON = 0x04; //TR2=1,TIMER2,auto reload PCON = 0x80; SCON = 0x70; // SMOD = 1; TMOD = 0x21; //TMOD = 0x22; TH1 = BAUD_19200; //定时器1产生波特率 TL1 = TH1; TR1 = TRUE; // HT1 ET1=FALSE; IT0 =TRUE; // Config ext0 as edge trigger for RC500 EX0 =TRUE; // Enable ext0 interrupt for RC500 EA = TRUE; // Enable all interrupts TR2=FALSE; //Close T2 IP=0x10; //interrupt priority ES = TRUE; bCmd=FALSE; // beep(1); // splash(1); MfConfig(); //配置RC500 } /////////////////////////////////////////////////////////////////////// // uart 中断服务程序 /////////////////////////////////////////////////////////////////////// void Uart_ISR(void) interrupt 4 using 1 { uchar len, i; uint j=0; if(RI) //如果是接收中断 { len=SBUF; //读取接收到的数据 RI=0; //清除接收中断标志 for(i=0;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; // 循环缓冲区环回 bCmd=TRUE; //命令标志位bCmd置位 } } else if(!RI && TI) //如果 RI=0,TI=1 { TI=0; //清除发送中断标志位 len=RevBuffer[0]; //发送RevBuffer长度个数据 for(i=0;i while(!TI) ; TI=0; } REN=1; } } /////////////////////////////////////////////////////////////////////// // uart process routine /////////////////////////////////////////////////////////////////////// void uart_process(void) { uchar cmd; uchar status; cmd = RevBuffer[0]; switch(cmd) { case 0x20: // Request ,? status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]); if(status!=0) { status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]); if(status!=0) { RevBuffer[0]=1; RevBuffer[1]=status; break; } } if(RevBuffer[2]==2) cardtype=mifare1S70; // Mifare1 S70 else if(RevBuffer[2]==4) cardtype=mifare1S50; // Mifare1 S50 else if(RevBuffer[2]==16) cardtype=mifarelight; // Mifare Light else cardtype=unknowncard; RevBuffer[0]=3; // RevBuffer[1]=status; break; case 0x21: //CardSnr status = M500PiccCascAnticoll(0,&RevBuffer[2]); if(status!=0) //ア? { RevBuffer[0]=1; RevBuffer[1]=status; break; } memcpy(CardSnr,&RevBuffer[2],4); RevBuffer[0]=5; RevBuffer[1]=status; break; case 0x22: // Select Card status=M500PiccCascSelect(CardSnr,&RevBuffer[2]); if(status!=MI_OK) { RevBuffer[0]=1; RevBuffer[1]=status; break; } RevBuffer[0]=3; RevBuffer[1]=status; break; case 0x23: // Key loading into the MF RC500's EEPROM status=M500PiccAuthE2(RevBuffer[1],CardSnr,RevBuffer[2],RevBuffer[3]); RevBuffer[0]=1; RevBuffer[1]=status; break; case 0x24: // Key loading into the MF RC500's EEPROM status=M500PcdLoadKeyE2(RevBuffer[1],RevBuffer[2],&RevBuffer[3]); RevBuffer[0]=1; RevBuffer[1]=status; break; case 0x25: // Read the mifare card status=M500PiccRead(RevBuffer[1],&RevBuffer[2]); if(status==0) { if(cardtype==mifare1S50||cardtype==mifare1S70) RevBuffer[0]=17; else if(cardtype==1) RevBuffer[0]=9; else RevBuffer[0]=16; } else 文章来源于:电子工程世界 原文链接