RC500读卡单片机源程序

发布时间:2022-12-26  

#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{ SBUF=RevBuffer[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

文章来源于:电子工程世界    原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>