⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wrrc500.c

📁 门禁系统原代码,KEIL开发环境,完整门禁协议,基于MFRC500和51单片机
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <absacc.h>
#include <reg51.h>
#include <intrins.h>


#include "MfErrNo.h"
#include "Rc500.h"
#include "Rc500reg.h"
#include "time.h"


sfr      AUXR                    = 0x8E;
sfr     WDTC = 0xC0;
sfr	    WDTD = 0x85;

#define uchar unsigned char
#define  inf_NACK    0x08    //Tag card error 

sbit     S_INT = P3^3;
sbit     S_RST = P1^0;
sbit     RS485_DE = P1^4;

unsigned int  MRC500_CNT;  //Delay  Counter
unsigned char code keya[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsigned char code writeblock6[16]={0x06,0x72,0x10,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x00,} ;
unsigned char code writeblock8[16]={0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x00,} ;
unsigned char  data snr[4];
unsigned char  data databuf[16]; 
unsigned char  receive_len,send_num,send_len;//串口接收字节长度
unsigned char  receive_buf[20];
unsigned char  send_buf[20];
unsigned char  data cardnum[4];
int data j,k,m,n,l;
bit first_receive;
bit send_status;
bit receive_status;
bit read_status;
main()
{
    unsigned char tt[2]; 
    int data i;

    AUXR        = 0x0;  /*EXTRAM=1*/
	TMOD = 0x21;
	TCON = 0x40;
	TH1 = 0xF4;//2400
	//TH1 = 0xFD;//9600
	TH0 = 0xD0;
	PCON = 0x00;//SMOD=0;
	SCON = 0x50;
	RS485_DE=0;
	IE = 0x92;//turn on EA,ES,ET0
	//EA=0;
	TR1 = 1;
	TR0 = 0;
	WDTC = 0x09;//
	WDTD = 0xDD;//
	WDTC = WDTC|0x02;//

	send_len=0;
	receive_status = 0;//一串数据接收成功标志 1-成功
	read_status = 0;

	for(i=0;i<16;i++)
	{
		databuf[i]=i;
	}

	WDTD = 0xDD;
	WDTC = WDTC|0x02;
    S_RST=0;
    for(i=0;i<3000;i++);
    S_RST=1;
	WDTD = 0xDD;
	WDTC = WDTC|0x02;
    for(i=0;i<3000;i++);
    S_RST=0;
	WDTD = 0xDD;
	WDTC = WDTC|0x02;
    for(i=0;i<3000;i++);


		        MCRReset_1();
		
				WDTD = 0xDD;
				WDTC = WDTC|0x02;
				Mf500PcdConfig(); 
				WDTD = 0xDD;
				WDTC = WDTC|0x02;
			  	MRC500LoadKey1(keya) ;
			
					WDTD = 0xDD;
					WDTC = WDTC|0x02;
	while(1)
				{
			
					if(Mf500PiccCommonRequest(0x52, tt)!=MI_OK) continue;
					WDTD = 0xDD;
					WDTC = WDTC|0x02;
					j=15;
			    	if(Mf500PiccCascAnticoll(snr)!=MI_OK) continue;
						WDTD = 0xDD;
						WDTC = WDTC|0x02;
						k=25;
					if(Mf500PiccCascSelect(snr)!=MI_OK) continue;
					
						WDTD = 0xDD;
						WDTC = WDTC|0x02;
						m=35;
						cardnum[0]=snr[0];
						cardnum[1]=snr[1];
						cardnum[2]=snr[2];
						cardnum[3]=snr[3];
					  
					if(MRC500PiccAuthentication( PICC_AUTHENT1A, snr,8)!=MI_OK) continue;
								n=45;
								WDTD = 0xDD;
								WDTC = WDTC|0x02;
					 //if(Mf500PiccWrite(8,writeblock6)!=MI_OK)  continue;
					     	    //WDTD = 0xDD;
								//WDTC = WDTC|0x02;								
					 if(Mf500PiccRead(8,databuf)!=MI_OK)  continue;
								l=55;
						read_status=1;  
						
			WDTD = 0xDD;
			WDTC = WDTC|0x02;
			
				delay_1ms(1);
				send_buf[0] = 0x70;
				send_buf[1] = 0x0A;
 				send_buf[2] = 0x0A;
				if(read_status==1) //有卡
				{
					send_buf[3]  = databuf[0];//取电卡性质
					send_buf[4]  = databuf[1];//楼栋号
					send_buf[5]  = databuf[2];//楼层号
					send_buf[6]  = databuf[3];//房间号
					send_buf[7]  = databuf[4];//卡号1
					send_buf[8]  = databuf[5];//卡号2
					send_buf[9]  = databuf[6];//卡号3
					send_buf[10] = databuf[7];//卡号4
					//set_checksum(11,send_buf);//加校验码
					send_len = 11;
				}
				else	//无卡
				{ 
					send_buf[3] = 0x00;
					send_buf[4] = 0x00;
					send_buf[5] = 0x00;
					send_buf[6] = 0x00;
					//set_checksum(7,send_buf);//加校验码
					send_len =9;
				}
				send_num = 1;
				send_status = 1;
	
		receive_status = 0;
//	}

//	rc500_status = MCRReset_1();
	read_status =0;
             // Mf500PiccHalt() ;
}


} 



///////////////////////////////////////////////////////////////////////
//      M I F A R E   M O D U L E   C O N F I G U R A T I O N
///////////////////////////////////////////////////////////////////////

void Mf500PcdConfig(void)
{
     RegClockQControl=0x0;
     RegClockQControl=0x40;

     MRC500_CNT=0;
     while(MRC500_CNT <= 10000){MRC500_CNT+=1;} //About 20 ms

     RegClockQControl = RegClockQControl &  (~0x40);

     // The following values for RegBitPhase and
     // RegRxThreshold represents an optimal
     // value for our demo package. For user
     // implementation some changes could be
     // necessary
     // initialize bit phase
     RegBitPhase=0xAD;

     // initialize minlevel
     RegRxThreshold=0xFF;
     // disable auto power down
     RegRxControl2=1;

     // Depending on the processing speed of the
     // operation environment, the waterlevel
     // can be adapted. (not very critical for
     // mifare applications)
     // initialize waterlevel to value 4
     RegFIFOLevel=0x1A; // initialize to 26d

     //Timer Konfiguration
     RegTimerControl=0x02;  // TStopRxEnd=0,TStopRxBeg=0,
                                   // TStartTxEnd=1,TStartTxBeg=0
                                   // timer must be stopped manually

     RegIRqPinConfig=0x3; // interrupt active low enable

     PcdRfReset(1);            // Rf - reset and enable output driver

}
//////////////////////////////////////////////////////////////////////
//            RF  R E S E T
///////////////////////////////////////////////////////////////////////
void PcdRfReset(unsigned char ms)
{
   RegTxControl = RegTxControl &  (~0x03);
   if (ms > 0)
   {
      MRC500_CNT=0;
      while(MRC500_CNT <=10000){MRC500_CNT+=1;}
      RegTxControl = RegTxControl | 0x03;
   }
}

///////////////////////////////////////////////////////////////////////
//         S e t   T i m e o u t   L E N G T H
///////////////////////////////////////////////////////////////////////
void PcdSetTmo(unsigned char tmoLength)
{
   switch(tmoLength)
   {  // timer clock frequency 13,56 MHz
      case 1:                         // short timeout (1,0 ms)
         RegTimerClock=0x07; // TAutoRestart=0,TPrescale=128
         RegTimerReload=0x6a;// TReloadVal = 'h6a =106(dec)
         break;
      case 2:                       // medium timeout (1,5 ms)
         RegTimerClock=0x07; // TAutoRestart=0,TPrescale=128
         RegTimerReload=0xa0;// TReloadVal = 'ha0 =160(dec)
         break;
      case 3:                       // long timeout (6 ms)
         RegTimerClock=0x09; // TAutoRestart=0,TPrescale=4*128
         RegTimerReload=0xa0;// TReloadVal = 'ha0 =160(dec)
         break;
      case 4:                       // long timeout (9.6 ms)
         RegTimerClock=0x09; // TAutoRestart=0,TPrescale=4*128
         RegTimerReload=0xff;// TReloadVal = 'ff =255(dec)
         break;
      default:                       // short timeout (1,0 ms)
         RegTimerClock=0x07; // TAutoRestart=0,TPrescale=128
         RegTimerReload=tmoLength;// TReloadVal = tmoLength
         break;
   }
}
//-------------------------------------------------------------
char MCRReset_1(void)
{

	char i;
    while((RegCommand & 0x3F));
	RegPage=0;//0x80;//WriteRawRC(RegPage,0x80); // Dummy access in order to determine the bus
                    // configuration
      // necessary read access
      // after first write access, the returned value
      // should be zero ==> interface recognized

	if (RegCommand != 0x00)//if (ReadRawRC(RegCommand) != 0x00)
	{
		i = MI_INTERFACEERR;
	}
	else
	{
		i = MI_OK;   // sequence is ok
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -