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

📄 mf_rc500.c

📁 RC500 Mifare Chip for 8051 code
💻 C
📖 第 1 页 / 共 3 页
字号:

        RC_SetTmod(tmod_6ms);    

        ResetInfo(MInfo);   
        memcpy(SerBuffer,_data,16);
        MInfo.nBytesToSend   = 16;
        status = RC_Command(PCD_TRANSCEIVE,
                            SerBuffer,
                            &MInfo);
        
        if (status & 0x80)   
        {
           status = MI_NOTAGERR;
        }
        else
        {
         
           if (MInfo.nBitsReceived != 4) 
           {
              status = MI_BITCOUNTERR;
           }
           else                  
           {
              SerBuffer[0] &= 0x0f; 
              if ((SerBuffer[0] & 0x0a) == 0)
              {
                 status = MI_WRITEERR;
              }
              else
              {
                 if (SerBuffer[0] == 0x0a)
                 {
                    status = MI_OK;
                 }
                 else 
                 {
                    status = MI_CODEERR;
                 }
              }     
           }
        }        
        RC_SetTmod(tmod_1ms);  
     }
  return status;
}

void MF_RfReset(unsigned char ms)
{
   if(ms)
   {
     RC_ClearBit(RegTxControl,0x03); 
     delay_1ms(4);                
     RC_SetBit(RegTxControl,0x03); 
   }
  else
     RC_ClearBit(RegTxControl,0x03);  
}

void delay_50us(unsigned char _50us)
{
	while(_50us--)
	{
	WDG=!WDG;
      	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    	}
}
void delay_1ms(uchar _1ms)
{
  while (_1ms--)
  {	
  	WDG=!WDG;
	delay_50us(25);
  }
}

void delay_10ms(uchar _10ms)
{              
            while (_10ms--)
            {
            		WDG=!WDG;
                     delay_1ms(10);
            }
}

//RC500 operation interrupt server rount
void RC_Interrupt(void) interrupt 0 using 1    
{
   static unsigned char idata irqBits;
   static unsigned char idata irqMask;            
   static unsigned char idata nbytes;
   static unsigned char idata cnt;
	
   IE0 = 0; 	
   RC_WriteRawData(0,0x80);
   if (MpIsrInfo && MpIsrOut)                                          
   {
      while( RC_ReadRawData(RegPrimaryStatus) & 0x08) 
      {
         irqMask = RC_ReadRawData(RegInterruptEn);
         irqBits = RC_ReadRawData(RegInterruptRq) & irqMask;
         MpIsrInfo->irqSource |= irqBits; 
         if (irqBits & 0x01)   
         {  
            nbytes = 64 - RC_ReadRawData(RegFIFOLength);
            if ((MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent) <= nbytes)
            {
               nbytes = MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent;
               RC_WriteRawData(RegInterruptEn,0x01);
            }
            for ( cnt = 0;cnt < nbytes;cnt++)
            {
               RC_WriteRawData(RegFIFOData,MpIsrOut[MpIsrInfo->nBytesSent]);
               MpIsrInfo->nBytesSent++;
            }
            RC_WriteRawData(RegInterruptRq,0x01);  
         }      
         if (irqBits & 0x10)    
         {
            RC_WriteRawData(RegInterruptRq,0x10);    
            RC_WriteRawData(RegInterruptEn,0x82);   
            if (MpIsrInfo->cmd == PICC_ANTICOLL1) 	
	    {                                        
               RC_WriteRC(RegChannelRedundancy,0x02);
               RC_WriteRawData(0,0x80);
	    }	
         }

         if (irqBits & 0x0E) 
         {
            nbytes = RC_ReadRawData(RegFIFOLength);
            for ( cnt = 0; cnt < nbytes; cnt++)               
            {
               MpIsrOut[MpIsrInfo->nBytesReceived] = RC_ReadRawData(RegFIFOData);
               MpIsrInfo->nBytesReceived++;
            }
            RC_WriteRawData(RegInterruptRq,0x0A & irqBits); 
         }   
   
         if (irqBits & 0x04) 
         {
            RC_WriteRawData(RegInterruptEn,0x20); 
            RC_WriteRawData(RegInterruptRq,0x20); 
            irqBits &= ~0x20; 
            MpIsrInfo->irqSource &= ~0x20;
            RC_WriteRawData(RegInterruptRq,0x04);
         }
         if (irqBits & 0x20)     
         {
            RC_WriteRawData(RegInterruptRq,0x20); 
            MpIsrInfo->status = MI_NOTAGERR; 
         }        
      }
   }
}
//com interrupt server route frandy
void serial_interrupt() interrupt 4 using 1
{   
	if(RI)
 		{
		RI=0;
		com_tmr_rx=5;
		com_r_busy=1;
		datas[com_r_index++]=SBUF;
  		if(com_r_index>=34)
   			com_r_index=0;
			
		if(datas[0]!='B')
				com_r_index=0;
		}

	if(TI)
		{       
    		TI=0;
    		TX_RX=0;
   		if(com_t_index<com_t_length)  
   			{
   			TX_RX=1;
      			SBUF=datas[com_t_index++];     		
      			}
   		else   			
			{
			com_t_index=com_t_length=0; 
			TX_RX=0;
			}
			
			
   		}

} 

void Sys_Init(void)
{
     
	RC500CS = 0;
	RC500RST=0;	   
	IE=0x00;
	PCON &= ~0x80;                
	SCON = 0x50;          //mode 1,ren=1              
	
	TMOD=0x21;            //timer 0 is 16 bit
	TH1   = BAUD_9600;
	TL1   = BAUD_9600;
	TR1   = 1;             

	TH0 = TH0_20ms;       //0x2800 time is 60ms
	TL0 = TL0_20ms;
	TR0 = 1;                 //timer 1 run
	ET0 = 1;    
	ET1 = 0;
	ES = 1;    
	EX0=1;
	IT0 = 1;	
    size=0;
    sec_num=block_num/4;     
	EA=1;  
	TX_RX=0;
}

void timer0_int(void) interrupt 1 using 2
{
	TR0=0;
	TH0=TH0_20ms;
	TL0=TL0_20ms;
	if(com_tmr_rx)	com_tmr_rx--;
	TR0=1;	   
}

void  watch_dog()
{
     WDG=~WDG;
}

void  sound(uchar n)
{
   uchar i,j;
   watch_dog();
   for(i=0;i<n;i++)
   {
     watch_dog();
      SPK=0;   /* enable sound */  
      /*  the 'OK' LED display */
	  
      for(j=0;j<5;j++)
        { 
        GLED=0;
		RLED=1;
        delay_10ms(8);              /*delay for 0.5s*/
        watch_dog();
        }
      SPK=1;   /* disable sound */
      for(j=0;j<5;j++)  
      	{
		GLED=1;
		RLED=0;
        delay_10ms(8);  
        watch_dog();
        }              
   }                         
 
}

uchar exec_cmd(uchar cmd_code)
{      
	uchar i;		
	switch(cmd_code)
	{
		case CMD_READ_SN:     		
			for (i=0;i<5;i++)
			{
				watch_dog();
				if (MF_Request(ALL, tt)!=0)             continue;			 
				if (MF_Conflict(0,card_snr)!=0)         continue;
				break;
			}  
			if (i==5)  return 0xff;                        //不成功   
			send(cmd_code); 			
			break;		
		case CMD_READ_BLOCK:   
			for (i=0;i<10;i++)
			{
				watch_dog();				
				if (MF_Request(ALL, tt)!=0)             continue;			 
				if (MF_Conflict(0,card_snr)!=0)         continue;
				if (MF_Select(card_snr,&size)!=0)	continue;
				if (MF_AuthKey(KEYA,card_snr,&datas[3],datas[2])!=0) continue;
				if (MF_ReadCard(datas[2], datas)!=0)   continue;  
				MF_Halt();
				break;
			}
			if (i==10)  return 0xff;			
			send(cmd_code);
			break;			
		
	        case CMD_WRITE_BLOCK:    
	        case CMD_WRITE_PASSWD:   
	        	for (i=0;i<5;i++)
			{
				if (MF_Request(ALL, tt)!=0)             continue;			 
				if (MF_Conflict(0,card_snr)!=0)         continue;
				if (MF_Select(card_snr,&size)!=0)	continue;
				if (MF_AuthKey(KEYA,card_snr,&datas[3],datas[2])!=0) continue;								
				if (MF_WriteCard(datas[2], &datas[15])!=0)   continue; 
				MF_Halt();
				break;  
			}
			if (i==5)  return 0xff;
			send(cmd_code);
			break;	   
	        default: break;
	}    
    return 0;   
}           

void send(uchar cmd_code)
{    
	uchar sum=0,i;  
	watch_dog();   
	
	switch(cmd_code)
	{
		case CMD_READ_SN:     
		{	 
			datas[0]='B';
			datas[1]=5;
			datas[2]=card_snr[0];
			datas[3]=card_snr[1];
			datas[4]=card_snr[2];
			datas[5]=card_snr[3];
		 	for (i=2,sum=0;i<6;i++)
			 	sum += datas[i];			 
			datas[6]=sum;
			com_t_index=0;
			com_t_length=7;
			TX_RX=1;
			TI=1;
			break;
		}

		case CMD_READ_BLOCK:   
		{       
			SPK=0;   
			for (i=16,sum=0;i>0;i--)
			{
				watch_dog();
				datas[i+1]=datas[i-1];
				sum += datas[i-1];
			}            
			datas[0]='B';
			datas[1]=17;
			datas[18]=sum%256;		
			
			com_t_index=0;
			com_t_length=19;
			TX_RX=1;
			watch_dog();
			TI=1;				
			break;
		}
		case CMD_WRITE_BLOCK:		
		case CMD_WRITE_PASSWD:  
		{
			datas[0]='B';
			datas[1]=1;
			datas[2]='Y';
			com_t_index=0;
			com_t_length=3;
			TX_RX=1;
			TI=1;
			break;
		}         
		default: break;

	}
	
}


void main(void)
{ 	
   
    uchar i;
    uchar idata cs_sum;
	RLED=1;   
	GLED=1;
	WP=1;
	SPK=1;
	WDG = 0;
	WDG = 1;
	RC500CS=0;
	block_num=BLOCK_NUM_SET;
	sec_num=BLOCK_NUM_SET/4;     /*block_num/4;*/
	
   	Sys_Init(); 
	
    watch_dog();
	MF_Config();
	SPK=0;
	delay_10ms(10);
	SPK=1;
   
    for (i=0;i<5;i++)  
		datas[i]=0x10+i;
	com_t_index=0;
	com_t_length=5;	
	TI=1;
   	while (1)
   	{ 	    
		watch_dog();
		if(com_r_busy&&!com_tmr_rx)
		{	
		com_r_busy=com_r_index=0;		
		if (datas[1]==1&&datas[2]=='Y')	
			cmd_code=CMD_READ_SN;
		else if(datas[1]==14||datas[1]==30||datas[1]==26)
			{
			for(i=2,cs_sum=0;i<datas[1]+1;i++)
				cs_sum+=datas[i];	
			if(datas[datas[1]+1]==cs_sum%256)					
				{
				if(datas[1]==14) cmd_code=CMD_READ_BLOCK;
				if(datas[1]==30) cmd_code=CMD_WRITE_BLOCK;
				if(datas[1]==26) cmd_code=CMD_WRITE_PASSWD;						
				}
			else
				{
				cmd_code=0;
				sound(2);	
				}
			}		
		}			

	    if (cmd_code)  
		{
		if (exec_cmd(cmd_code)==0)  				
			sound(1);
		cmd_code=0;
		}  
	}
}

⌨️ 快捷键说明

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