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

📄 duxiexitongrc500.c

📁 #include <stc12c2052AD.H>// 标准库的头文件 #include <intrins.h> #include <absacc.h> #d
💻 C
📖 第 1 页 / 共 4 页
字号:
	 temp1=temp1&0x1f;
	 break;
 case 6:
	 temp=temp&0xc0;
	 temp1=temp1&0x3f;
	 break;
 case 7:
	 temp=temp&0x80;
	 temp1=temp1&0x7f;
	 break;
	 default:
	 break;
    }
	 buffer[0]=temp;
	 UID[row-1]=temp1|temp;
	 
	 for(i=1;i<length;i++)
	    { 
	      UID[row-1+i]=buffer[i];
      
	    } 
	 }
}

/****************************************************************/
/*名称: Check_UID */
/*功能: 该函数实现对收到的卡片的序列号的判断 */
/*输出: TRUE: 序列号正确 */
/* FALSE: 序列号错误 */
/****************************************************************/
uchar Check_UID(void)
{
 uchar temp;
 uchar i;
 temp=0x00;
 for(i=0;i<5;i++)
   {
   temp=temp^UID[i];
   }
   if (temp==0)
   {//sen(0x66);
   return TRUE;
   }
   return FALSE;
}
/////////////////////////////////////////////////////////待发送数据的字节数
void Set_BitFraming(uchar row,uchar col)
{
switch (row)
{
case 0:
buffer[1] = 0x20;
break;
case 1:
buffer[1] = 0x30;
break;
case 2:
buffer[1] = 0x40;
break;
case 3:
buffer[1] = 0x50;
break;
case 4:
buffer[1] = 0x60;
break;
default:
break;
}
switch(col)
{
case 0:
Bit_Frame = 0x00;
break;
case 1:
Bit_Frame = 0x11;
buffer[1] = (buffer[1] | 0x01);
break;
case 2:
Bit_Frame = 0x22;
buffer[1] = (buffer[1] | 0x02);
break;
case 3:
Bit_Frame = 0x33;
buffer[1] = (buffer[1] | 0x03);
break;
case 4:
Bit_Frame = 0x44;
buffer[1] = (buffer[1] | 0x04);
break;
case 5:
Bit_Frame = 0x55;
buffer[1] = (buffer[1] | 0x05);
break;
case 6:
Bit_Frame = 0x66;
buffer[1] = (buffer[1] | 0x06);
break;
case 7:
Bit_Frame = 0x77;
buffer[1] = (buffer[1] | 0x07);
break;
default:
break;
}
}
///////////////////////////////////////////////////////卡片的防冲突检测
uchar AntiColl(void)
{
uchar temp;
uchar i;
uchar row,col;
uchar pre_row;
row = 0;
col = 0;
pre_row = 0;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
//ModConductance = 0x3f;
buffer[0] = RF_CMD_ANTICOL;
buffer[1] = 0x20;
ChannelRedundancy = 0x03; //关闭CRC,打开奇偶校验
temp=Command_Send(2, buffer, Transceive);
while(1)
{
  if(temp==FALSE)
  {
  return(RC500_NOTAGERR);
  }
temp = ErrorFlag;
// if((temp & 0x02)==0x02)
// return(RC500_PARITYERR);
// if((temp & 0x04)==0x04)
// return(RC500_FRAMINGERR);
temp=FIFO_Length;
//sen(temp);
   if (temp==0)
   {
//sen(0x30);
   return RC500_BYTECOUNTERR;//
   }
Read_FIFO(buffer);//05
Save_UID(row, col, temp); //将收到的UID放入UID数组中
temp = ErrorFlag;         //判断接収数据是否出错
temp = temp & 0x01;
  if(temp == 0x00)
  {
    temp = Check_UID(); //校验收到的UID
  if(temp == FALSE)
      {
//sen(0x30);
      return(RC500_SERNRERR);
      }
  //sen(0x03);
  return(RC500_OK);
      }
else
  {

temp = CollPos; //读取冲突检测寄存器
//sen(0x30);
row = temp / 8;
col = temp % 8;
buffer[0] = RF_CMD_ANTICOL;
Set_BitFraming(row + pre_row, col); //设置待发送数据的字节数
pre_row = pre_row + row;
for(i = 0; i < pre_row + 1; i++)
    {
   buffer[i + 2] = UID[i];
    }
   if(col != 0x00)
      {
       row = pre_row + 1;
       }
   else
      {
      row = pre_row;
      }
     temp = Command_Send(row + 2, buffer, Transceive);
      }
   }
}
/****************************************************************/
/*名称: powerdown */
/*功能: 该函数实现RC500处于软件掉电模式  */
/***************************************************************/
/*uchar Powerdown(void)
{  
 
  CRCPresetLSB=0x63;
  CWConductance=0x3f;
  ChannelRedundancy=0x03;
  MFOUTSelect=0x02;//调整输出功率以及电流消耗和操作距离.
  TxControl=0x50;//TX2/1上的输出信号能量载波
  Control=0x10;
  DelayMS(200);
   //Control=0x10;
  DelayMS(1000);
   //NCS = 1;//guanpianxuan
  CardStatus=0x01;
  return(CardStatus);
 

  }*/

/****************************************************************/
/*名称: MIF_Halt */
/*功能: 该函数实现暂停MIFARE卡 */
/*输出: RC500_OK: 应答正确 */
/* RC500_PARITYERR: 奇偶校验错 */
/* RC500_CRCERR: CRC校验错 */
/* RC500_NOTAGERR: 无卡 */
/****************************************************************/
uchar MIF_Halt(void)
   { 
   uchar temp;
   uint i;
  CRCPresetLSB=0x63;
  CWConductance=0x3f;
  ChannelRedundancy=0x03;
  *buffer=RF_CMD_HALT;
  *(buffer+1)=0x00;
  temp=Command_Send(2,buffer,Transmit);
 if
    (temp==TRUE)
    { 
     for(i=0;i<0x50;i++)
       {
    	_nop_();
       }	
	  //sen(0x01);
      return RC500_OK;
	   }
	 else
	 {
	    //sen(temp);
		//sen(0x10);
        temp=ErrorFlag;
	 if((temp&0x02)==0x02)
    	{ 
	   return RC500_PARITYERR;
		}
	    if((temp&0x04)==0x04)
        {
         return RC500_FRAMINGERR;
		 }
		 return RC500_NOTAGERR;
         }
}
////////////////////////////////////////////////////////
uchar Select_Card(void)
{  
   uchar temp,i;
   CRCPresetLSB=0x63;
   CWConductance=0x3f;
   buffer[0] =RF_CMD_SELECT;//0x93
   buffer[1]=0x70;
   for(i=0;i<5;i++)
   {
   buffer[i+2]=UID[i];
   //sen(buffer[i+2]);
    }
   //Bit_Frame=0x07;
   ChannelRedundancy=0x0f;//对发送数据进行CRC/接收帧的最后字节被解释为CRC 
temp=Command_Send(7,buffer,Transceive);
    if(temp==FALSE)
    {
//sen(0x40);
	return(RC500_NOTAGERR);
     }
else
    {
	temp=ErrorFlag;
	//sen(ErrorFlag);//40
    if((temp&0x02)==0x02)
    //return(RC500_PARITYERR);//卡片奇偶校验错误

    if((temp&0x04)==0x04)
	//sen(RC500_FRAMINGERR);
    return (RC500_FRAMINGERR);//FM1715帧错误
    if((temp&0x08)==0x08)
    return (RC500_CRCERR);    //卡片CRC校验错误
	temp=FIFO_Length;
	//sen(FIFO_Length);
    if(temp!=1)
return(RC500_BYTECOUNTERR);////从卡片接收到的字节数错误
     Read_FIFO(buffer);//01
     temp=*buffer;
     //sen(temp);   //08
if((temp==0x08)||(temp==0x88)||(temp==0x53))
      { 
	  //sen(0x04);
	  return(RC500_OK);
	  }
else  {
//sen(0x40);
	return(RC500_SELERR);
	}
   }
}
//////////////////////////////////////////////////////
uchar RC500_Bus_Sel(void)  //zhong线选择;通过
  {
	 uchar i;
	 Page_Sel=0x80;
	 for(i=0;i<RF_TimeOUT;i++)
	 {
	   if(Command ==0x00)
	    {
		Page_Sel=0x00;
              //for (j=0;j<5;j++)
              //sen(tongxunceshixinxi[j]);
		//sen(0x99);
            return TRUE;
       }
      }
	   return FALSE;
         //for (j=0;j<5;j++)
         // sen(cuowufanhui[i]);
    }
////////////////////////////////////////////////////////////密码认证的过程
uchar mimarenzhen(uchar idata *UID,uchar SecNR,uchar mode)
{
uchar idata i;
uchar idata temp,temp1;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
//ModConductance = 0x3f;
temp1 = Control;
     //sen(temp1);  //00
temp1 = temp1 & 0xf7;
Control = temp1;
CardStatus=0; 
if (mode == 1)   
buffer[0] = RF_CMD_AUTH_LB;
else
//sen(0x06);
buffer[0] = RF_CMD_AUTH_LA;
buffer[1] = SecNR * 4 + 3;//2008年4月26日改SECNR为块号原先为扇区号!                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
for (i = 0; i < 4; i++)
 {
buffer[2 + i] = UID[i];
/////sen(buffer[2 + i]);
}
ChannelRedundancy = 0x0f; //开启CRC,奇偶校验校验
temp = Command_Send(6, buffer, Authent1);//验证命令认证过程第1步
////sen(temp);//01
if (temp == FALSE)
{//sen(0x60);
CardStatus=0; 
return RC500_NOTAGERR;
}
temp = ErrorFlag;
//sen(ErrorFlag);//40//00
if ((temp & 0x02) == 0x02)
return RC500_PARITYERR;//
if((temp & 0x04) == 0x04)
return RC500_FRAMINGERR;//
if ((temp & 0x08) == 0x08)
return RC500_CRCERR;
//for (i = 0; i < 4; i++)
// {
//buffer[2 + i] = 0x00;}
temp = Command_Send(0, buffer, Authent2); //验证命令认证过程第2步
if(temp == FALSE)
{CardStatus=0; 
// P13=1;
 //P14=1;
return RC500_NOTAGERR;
}
temp = ErrorFlag;
//sen(ErrorFlag);//00
if ((temp & 0x02) == 0x02)
return RC500_PARITYERR;
if((temp & 0x04) == 0x04)
return RC500_FRAMINGERR;
if ((temp & 0x08) == 0x08)
return RC500_CRCERR;
temp1 = Control;
temp1 = temp1 & 0x08; //Crypto1on=1验证通过
if (temp1 == 0x08)
{
CardStatus=0x01; 
return RC500_OK;
}
CardStatus=0; 
return RC500_AUTHERR;
}
/****************************************************************/
/*名称: Load_keyE2 */
/*功能: 该函数实现把修改后的密码存入FM1715的keybuffer中 */
/*输入: Secnr: EE起始地址 */
/*输出: True: 密钥装载成功 */
/* False: 密钥装载失败 */
/****************************************************************/
/*uchar Load_keyE2_CPY(uchar Secnr,uchar Mode)
{
uchar temp;
uchar msb = 0;
uchar lsb = 0;
temp = Secnr * 12;
if (Mode == 0)
{
sen(temp);//84
  if (temp >= 0x80) //计算密码存放地址
    {
 lsb = temp - 0x80;//0x04
 msb = 0x01;
    }
else
    {
msb = 0x00;
lsb = temp + 0x80;
    }
 }
else
 {
msb = 0x01;
lsb = temp + 0x40;//0x80
}
buffer[0] = lsb;
buffer[1] = msb;
temp =Command_Send(2, buffer, LoadKeyE2);

temp = ErrorFlag & 0x40;
if (temp == 0x40)
{
return FALSE;
}
return TRUE;
}*/

uchar Load_keyE2_CPY(uchar Secnr,uchar Mode)
{
uchar temp;
uint i;
uchar msb = 0;
uchar lsb = 0;
CardStatus=0; 
//sen(0x05);
//sen(Secnr);//06

⌨️ 快捷键说明

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