找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3344|回复: 1
打印 上一主题 下一主题
收起左侧

基于STC89C52的MF RC522门禁卡 代码

[复制链接]
跳转到指定楼层
楼主
ID:398765 发表于 2018-12-16 23:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <intrins.h>
  2. #include "reg52.h"
  3. #include "main.h"
  4. #include "mfrc522.h"
  5. #include <string.h>
  6. #define MAXRLEN 18                        
  7. /////////////////////////////////////////////////////////////////////
  8. //功    能:寻卡
  9. //参数说明: req_code[IN]:寻卡方式
  10. //                0x52 = 寻感应区内所有符合14443A标准的卡
  11. //                0x26 = 寻未进入休眠状态的卡
  12. //          pTagType[OUT]:卡片类型代码
  13. //                0x4400 = Mifare_UltraLight
  14. //                0x0400 = Mifare_One(S50)
  15. //                0x0200 = Mifare_One(S70)
  16. //                0x0800 = Mifare_Pro(X)
  17. //                0x4403 = Mifare_DESFire
  18. //返    回: 成功返回MI_OK
  19. /////////////////////////////////////////////////////////////////////
  20. char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  21. {
  22.    char status;  
  23.    unsigned int  unLen;
  24.    unsigned char ucComMF522Buf[MAXRLEN];
  25. // unsigned char xTest ;
  26.    ClearBitMask(Status2Reg,0x08);
  27.    WriteRawRC(BitFramingReg,0x07);
  28. // xTest = ReadRawRC(BitFramingReg);
  29. // if(xTest == 0x07 )
  30. // { LED_GREEN  =0 ;}
  31. // else {LED_GREEN =1 ;while(1){}}
  32.    SetBitMask(TxControlReg,0x03);
  33.    ucComMF522Buf[0] = req_code;
  34.    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  35. // if(status  == MI_OK )
  36. // { LED_GREEN  =0 ;}
  37. // else {LED_GREEN =1 ;}
  38.    if ((status == MI_OK) && (unLen == 0x10))
  39.    {   
  40.        *pTagType     = ucComMF522Buf[0];
  41.        *(pTagType+1) = ucComMF522Buf[1];
  42.    }
  43.    else
  44.    {   status = MI_ERR;   }
  45.    return status;
  46. }

  47. /////////////////////////////////////////////////////////////////////
  48. //功    能:防冲撞
  49. //参数说明: pSnr[OUT]:卡片序列号,4字节
  50. //返    回: 成功返回MI_OK
  51. /////////////////////////////////////////////////////////////////////  
  52. char PcdAnticoll(unsigned char *pSnr)
  53. {
  54.     char status;
  55.     unsigned char i,snr_check=0;
  56.     unsigned int  unLen;
  57.     unsigned char ucComMF522Buf[MAXRLEN];
  58.    

  59.     ClearBitMask(Status2Reg,0x08);
  60.     WriteRawRC(BitFramingReg,0x00);
  61.     ClearBitMask(CollReg,0x80);
  62.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  63.     ucComMF522Buf[1] = 0x20;
  64.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
  65.     if (status == MI_OK)
  66.     {
  67.              for (i=0; i<4; i++)
  68.          {   
  69.              *(pSnr+i)  = ucComMF522Buf[i];
  70.              snr_check ^= ucComMF522Buf[i];
  71.          }
  72.          if (snr_check != ucComMF522Buf[i])
  73.          {   status = MI_ERR;    }
  74.     }
  75.     SetBitMask(CollReg,0x80);
  76.     return status;
  77. }
  78. /////////////////////////////////////////////////////////////////////
  79. //功    能:选定卡片
  80. //参数说明: pSnr[IN]:卡片序列号,4字节
  81. //返    回: 成功返回MI_OK
  82. /////////////////////////////////////////////////////////////////////
  83. char PcdSelect(unsigned char *pSnr)
  84. {
  85.     char status;
  86.     unsigned char i;
  87.     unsigned int  unLen;
  88.     unsigned char ucComMF522Buf[MAXRLEN];   
  89.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  90.     ucComMF522Buf[1] = 0x70;
  91.     ucComMF522Buf[6] = 0;
  92.     for (i=0; i<4; i++)
  93.     {
  94.             ucComMF522Buf[i+2] = *(pSnr+i);
  95.             ucComMF522Buf[6]  ^= *(pSnr+i);
  96.     }
  97.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  98.     ClearBitMask(Status2Reg,0x08);
  99.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);  
  100.     if ((status == MI_OK) && (unLen == 0x18))
  101.     {   status = MI_OK;  }
  102.     else
  103.     {   status = MI_ERR;    }
  104.     return status;
  105. }

  106. /////////////////////////////////////////////////////////////////////
  107. //功    能:验证卡片密码
  108. //参数说明: auth_mode[IN]: 密码验证模式
  109. //                 0x60 = 验证A密钥
  110. //                 0x61 = 验证B密钥
  111. //          addr[IN]:块地址
  112. //          pKey[IN]:密码
  113. //          pSnr[IN]:卡片序列号,4字节
  114. //返    回: 成功返回MI_OK
  115. /////////////////////////////////////////////////////////////////////               
  116. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  117. {
  118.     char status;
  119.     unsigned int  unLen;
  120.     unsigned char i,ucComMF522Buf[MAXRLEN];
  121.     ucComMF522Buf[0] = auth_mode;
  122.     ucComMF522Buf[1] = addr;
  123.     for (i=0; i<6; i++)
  124.     {    ucComMF522Buf[i+2] = *(pKey+i);   }
  125.     for (i=0; i<6; i++)
  126.     {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  127. //   memcpy(&ucComMF522Buf[2], pKey, 6);
  128. //   memcpy(&ucComMF522Buf[8], pSnr, 4);  
  129.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  130.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  131.     {   status = MI_ERR;   }  
  132.     return status;
  133. }

  134. /////////////////////////////////////////////////////////////////////
  135. //功    能:读取M1卡一块数据
  136. //参数说明: addr[IN]:块地址
  137. //          pData[OUT]:读出的数据,16字节
  138. //返    回: 成功返回MI_OK
  139. /////////////////////////////////////////////////////////////////////
  140. char PcdRead(unsigned char addr,unsigned char *pData)
  141. {
  142.     char status;
  143.     unsigned int  unLen;
  144.     unsigned char i,ucComMF522Buf[MAXRLEN];
  145.     ucComMF522Buf[0] = PICC_READ;
  146.     ucComMF522Buf[1] = addr;
  147.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);  
  148.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  149.     if ((status == MI_OK) && (unLen == 0x90))
  150. //   {   memcpy(pData, ucComMF522Buf, 16);   }
  151.     {
  152.         for (i=0; i<16; i++)
  153.         {    *(pData+i) = ucComMF522Buf[i];   }
  154.     }
  155.     else
  156.     {   status = MI_ERR;   }   
  157.     return status;
  158. }

  159. /////////////////////////////////////////////////////////////////////
  160. //功    能:写数据到M1卡一块
  161. //参数说明: addr[IN]:块地址
  162. //          pData[IN]:写入的数据,16字节
  163. //返    回: 成功返回MI_OK
  164. /////////////////////////////////////////////////////////////////////                  
  165. char PcdWrite(unsigned char addr,unsigned char *pData)
  166. {
  167.     char status;
  168.     unsigned int  unLen;
  169.     unsigned char i,ucComMF522Buf[MAXRLEN];   
  170.     ucComMF522Buf[0] = PICC_WRITE;
  171.     ucComMF522Buf[1] = addr;
  172.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  173.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  174.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  175.     {   status = MI_ERR;   }     
  176.     if (status == MI_OK)
  177.     {
  178.         //memcpy(ucComMF522Buf, pData, 16);
  179.         for (i=0; i<16; i++)
  180.         {    ucComMF522Buf[i] = *(pData+i);   }
  181.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
  182.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  183.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  184.         {   status = MI_ERR;   }
  185.     }   
  186.     return status;
  187. }
  188. /////////////////////////////////////////////////////////////////////
  189. //功    能:命令卡片进入休眠状态
  190. //返    回: 成功返回MI_OK
  191. /////////////////////////////////////////////////////////////////////
  192. char PcdHalt(void)
  193. {
  194.     char status;
  195.     unsigned int  unLen;
  196.     unsigned char ucComMF522Buf[MAXRLEN];
  197.     ucComMF522Buf[0] = PICC_HALT;
  198.     ucComMF522Buf[1] = 0;
  199.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  200.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  201.     return MI_OK;
  202. }

  203. /////////////////////////////////////////////////////////////////////
  204. //用MF522计算CRC16函数
  205. /////////////////////////////////////////////////////////////////////
  206. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  207. {
  208.     unsigned char i,n;
  209.     ClearBitMask(DivIrqReg,0x04);
  210.     WriteRawRC(CommandReg,PCD_IDLE);
  211.     SetBitMask(FIFOLevelReg,0x80);
  212.     for (i=0; i<len; i++)
  213.     {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
  214.     WriteRawRC(CommandReg, PCD_CALCCRC);
  215.     i = 0xFF;
  216.     do
  217.     {
  218.         n = ReadRawRC(DivIrqReg);
  219.         i--;
  220.     }
  221.     while ((i!=0) && !(n&0x04));
  222.     pOutData[0] = ReadRawRC(CRCResultRegL);
  223.     pOutData[1] = ReadRawRC(CRCResultRegM);
  224. }

  225. /////////////////////////////////////////////////////////////////////
  226. //功    能:复位RC522
  227. //返    回: 成功返回MI_OK
  228. /////////////////////////////////////////////////////////////////////
  229. char PcdReset(void)
  230. {
  231.     MF522_RST=1;
  232.     _nop_();
  233.     MF522_RST=0;
  234.     _nop_();
  235.     MF522_RST=1;
  236.      _nop_();
  237.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  238.     _nop_();
  239.    
  240.     WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
  241.     WriteRawRC(TReloadRegL,30);           
  242.     WriteRawRC(TReloadRegH,0);
  243.     WriteRawRC(TModeReg,0x8D);
  244.     WriteRawRC(TPrescalerReg,0x3E);
  245.     WriteRawRC(TxAutoReg,0x40);     
  246.     return MI_OK;
  247. }
  248. //////////////////////////////////////////////////////////////////////
  249. //设置RC632的工作方式
  250. //////////////////////////////////////////////////////////////////////
  251. char M500PcdConfigISOType(unsigned char type)
  252. {
  253.    if (type == 'A')                     //ISO14443_A
  254.    {
  255.        ClearBitMask(Status2Reg,0x08);

  256. /*     WriteRawRC(CommandReg,0x20);    //as default   
  257.        WriteRawRC(ComIEnReg,0x80);     //as default
  258.        WriteRawRC(DivlEnReg,0x0);      //as default
  259.            WriteRawRC(ComIrqReg,0x04);     //as default
  260.            WriteRawRC(DivIrqReg,0x0);      //as default
  261.            WriteRawRC(Status2Reg,0x0);//80    //trun off temperature sensor
  262.            WriteRawRC(WaterLevelReg,0x08); //as default
  263.        WriteRawRC(ControlReg,0x20);    //as default
  264.            WriteRawRC(CollReg,0x80);    //as default
  265. */
  266.        WriteRawRC(ModeReg,0x3D);//3F
  267. /*           WriteRawRC(TxModeReg,0x0);      //as default???
  268.            WriteRawRC(RxModeReg,0x0);      //as default???
  269.            WriteRawRC(TxControlReg,0x80);  //as default???

  270.            WriteRawRC(TxSelReg,0x10);      //as default???
  271.    */
  272.        WriteRawRC(RxSelReg,0x86);//84
  273. //      WriteRawRC(RxThresholdReg,0x84);//as default
  274. //      WriteRawRC(DemodReg,0x4D);      //as default

  275. //      WriteRawRC(ModWidthReg,0x13);//26
  276.        WriteRawRC(RFCfgReg,0x7F);   //4F
  277.         /*   WriteRawRC(GsNReg,0x88);        //as default???
  278.            WriteRawRC(CWGsCfgReg,0x20);    //as default???
  279.        WriteRawRC(ModGsCfgReg,0x20);   //as default???
  280. */
  281.               WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
  282.            WriteRawRC(TReloadRegH,0);
  283.        WriteRawRC(TModeReg,0x8D);
  284.            WriteRawRC(TPrescalerReg,0x3E);
  285.            

  286.   //     PcdSetTmo(106);
  287.                             delay_10ms(1);
  288.        PcdAntennaOn();
  289.    }
  290.    else{ return -1; }
  291.    
  292.    return MI_OK;
  293. }
  294. /////////////////////////////////////////////////////////////////////
  295. //功    能:读RC632寄存器
  296. //参数说明:Address[IN]:寄存器地址
  297. //返    回:读出的值
  298. /////////////////////////////////////////////////////////////////////
  299. unsigned char ReadRawRC(unsigned char Address)
  300. {
  301.      unsigned char i, ucAddr;
  302.      unsigned char ucResult=0;

  303.      MF522_SCK = 0;
  304.      MF522_NSS = 0;
  305.      ucAddr = ((Address<<1)&0x7E)|0x80;

  306.      for(i=8;i>0;i--)
  307.      {
  308.          MF522_SI = ((ucAddr&0x80)==0x80);
  309.          MF522_SCK = 1;
  310.          ucAddr <<= 1;
  311.          MF522_SCK = 0;
  312.      }

  313.      for(i=8;i>0;i--)
  314.      {
  315.          MF522_SCK = 1;
  316.          ucResult <<= 1;
  317.          ucResult|=(bit)MF522_SO;
  318.          MF522_SCK = 0;
  319.      }

  320.      MF522_NSS = 1;
  321.      MF522_SCK = 1;
  322.      return ucResult;
  323. }

  324. /////////////////////////////////////////////////////////////////////
  325. //功    能:写RC632寄存器
  326. //参数说明:Address[IN]:寄存器地址
  327. //          value[IN]:写入的值
  328. /////////////////////////////////////////////////////////////////////
  329. void WriteRawRC(unsigned char Address, unsigned char value)
  330. {  
  331.     unsigned char i, ucAddr;

  332.     MF522_SCK = 0;
  333.     MF522_NSS = 0;
  334.     ucAddr = ((Address<<1)&0x7E);

  335.     for(i=8;i>0;i--)
  336.     {
  337.         MF522_SI = ((ucAddr&0x80)==0x80);
  338.         MF522_SCK = 1;
  339.         ucAddr <<= 1;
  340.         MF522_SCK = 0;
  341.     }

  342.     for(i=8;i>0;i--)
  343.     {
  344.         MF522_SI = ((value&0x80)==0x80);
  345.         MF522_SCK = 1;
  346.         value <<= 1;
  347.         MF522_SCK = 0;
  348.     }
  349.     MF522_NSS = 1;
  350.     MF522_SCK = 1;
  351. }

  352. /////////////////////////////////////////////////////////////////////
  353. //功    能:置RC522寄存器位
  354. //参数说明:reg[IN]:寄存器地址
  355. //          mask[IN]:置位值
  356. /////////////////////////////////////////////////////////////////////
  357. void SetBitMask(unsigned char reg,unsigned char mask)  
  358. {
  359.     char tmp = 0x0;
  360.     tmp = ReadRawRC(reg);
  361.     WriteRawRC(reg,tmp | mask);  // set bit mask
  362. }

  363. /////////////////////////////////////////////////////////////////////
  364. //功    能:清RC522寄存器位
  365. //参数说明:reg[IN]:寄存器地址
  366. //          mask[IN]:清位值
  367. /////////////////////////////////////////////////////////////////////
  368. void ClearBitMask(unsigned char reg,unsigned char mask)  
  369. {
  370.     char tmp = 0x0;
  371.     tmp = ReadRawRC(reg);
  372.     WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  373. }

  374. /////////////////////////////////////////////////////////////////////
  375. //功    能:通过RC522和ISO14443卡通讯
  376. //参数说明:Command[IN]:RC522命令字
  377. //          pInData[IN]:通过RC522发送到卡片的数据
  378. //          InLenByte[IN]:发送数据的字节长度
  379. //          pOutData[OUT]:接收到的卡片返回数据
  380. //          *pOutLenBit[OUT]:返回数据的位长度
  381. /////////////////////////////////////////////////////////////////////
  382. char PcdComMF522(unsigned char Command,
  383.                  unsigned char *pInData,
  384.                  unsigned char InLenByte,
  385.                  unsigned char *pOutData,
  386.                  unsigned int  *pOutLenBit)
  387. {
  388.     char status = MI_ERR;
  389.     unsigned char irqEn   = 0x00;
  390.     unsigned char waitFor = 0x00;
  391.     unsigned char lastBits;
  392.     unsigned char n;
  393.     unsigned int i;
  394.     switch (Command)
  395.     {
  396.        case PCD_AUTHENT:
  397.           irqEn   = 0x12;
  398.           waitFor = 0x10;
  399.           break;
  400.        case PCD_TRANSCEIVE:
  401.           irqEn   = 0x77;
  402.           waitFor = 0x30;
  403.           break;
  404.        default:
  405.          break;
  406.     }
  407.    
  408.     WriteRawRC(ComIEnReg,irqEn|0x80);
  409.     ClearBitMask(ComIrqReg,0x80);
  410.     WriteRawRC(CommandReg,PCD_IDLE);
  411.     SetBitMask(FIFOLevelReg,0x80);
  412.    
  413.     for (i=0; i<InLenByte; i++)
  414.     {   WriteRawRC(FIFODataReg, pInData[i]);    }
  415.     WriteRawRC(CommandReg, Command);
  416.    
  417.    
  418.     if (Command == PCD_TRANSCEIVE)
  419.     {    SetBitMask(BitFramingReg,0x80);  }
  420.    
  421. //    i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
  422. i = 2000;
  423.     do
  424.     {
  425.          n = ReadRawRC(ComIrqReg);
  426.          i--;
  427.     }
  428.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  429.     ClearBitMask(BitFramingReg,0x80);
  430.               
  431.     if (i!=0)
  432.     {   
  433.          if(!(ReadRawRC(ErrorReg)&0x1B))
  434.          {
  435.              status = MI_OK;
  436.              if (n & irqEn & 0x01)
  437.              {   status = MI_NOTAGERR;   }
  438.              if (Command == PCD_TRANSCEIVE)
  439.              {
  440.                        n = ReadRawRC(FIFOLevelReg);
  441.                       lastBits = ReadRawRC(ControlReg) & 0x07;
  442.                 if (lastBits)
  443.                 {   *pOutLenBit = (n-1)*8 + lastBits;   }
  444.                 else
  445.                 {   *pOutLenBit = n*8;   }
  446.                 if (n == 0)
  447.                 {   n = 1;    }
  448.                 if (n > MAXRLEN)
  449.                 {   n = MAXRLEN;   }
  450.                 for (i=0; i<n; i++)
  451.                 {   pOutData[i] = ReadRawRC(FIFODataReg);    }
  452.             }
  453.          }
  454.          else
  455.          {   status = MI_ERR;   }
  456.         
  457.    }
  458.    

  459.    SetBitMask(ControlReg,0x80);           // stop timer now
  460.    WriteRawRC(CommandReg,PCD_IDLE);
  461.    return status;
  462. }


  463. /////////////////////////////////////////////////////////////////////
  464. //开启天线  
  465. //每次启动或关闭天险发射之间应至少有1ms的间隔
  466. /////////////////////////////////////////////////////////////////////
  467. void PcdAntennaOn()
  468. {
  469.     unsigned char i;
  470.     i = ReadRawRC(TxControlReg);
  471.     if (!(i & 0x03))
  472.     {
  473.         SetBitMask(TxControlReg, 0x03);
  474.     }
  475. }


  476. /////////////////////////////////////////////////////////////////////
  477. //关闭天线
  478. /////////////////////////////////////////////////////////////////////
  479. void PcdAntennaOff()
  480. {
  481.     ClearBitMask(TxControlReg, 0x03);
  482. }


  483. /////////////////////////////////////////////////////////////////////
  484. //功    能:扣款和充值
  485. //参数说明: dd_mode[IN]:命令字
  486. //               0xC0 = 扣款
  487. //               0xC1 = 充值
  488. //          addr[IN]:钱包地址
  489. //          pValue[IN]:4字节增(减)值,低位在前
  490. //返    回: 成功返回MI_OK
  491. /////////////////////////////////////////////////////////////////////                 
  492. char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
  493. {
  494.     char status;
  495.     unsigned int  unLen;
  496.     unsigned char ucComMF522Buf[MAXRLEN];
  497.    
  498.     ucComMF522Buf[0] = dd_mode;
  499.     ucComMF522Buf[1] = addr;
  500.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  501.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  502.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  503.     {   status = MI_ERR;   }
  504.         
  505.     if (status == MI_OK)
  506.     {
  507.         memcpy(ucComMF522Buf, pValue, 4);
  508. //       for (i=0; i<16; i++)
  509. //       {    ucComMF522Buf[i] = *(pValue+i);   }
  510.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
  511.         unLen = 0;
  512.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  513.         if (status != MI_ERR)
  514.         {    status = MI_OK;    }
  515.     }
  516.    
  517.     if (status == MI_OK)
  518.     {
  519.         ucComMF522Buf[0] = PICC_TRANSFER;
  520.         ucComMF522Buf[1] = addr;
  521.         CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  522.    
  523.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  524.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  525.         {   status = MI_ERR;   }
  526.     }
  527.     return status;
  528. }

  529. /////////////////////////////////////////////////////////////////////
  530. //功    能:备份钱包
  531. //参数说明: sourceaddr[IN]:源地址
  532. //          goaladdr[IN]:目标地址
  533. //返    回: 成功返回MI_OK
  534. /////////////////////////////////////////////////////////////////////
  535. char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
  536. {
  537.     char status;
  538.     unsigned int  unLen;
  539.     unsigned char ucComMF522Buf[MAXRLEN];

  540.     ucComMF522Buf[0] = PICC_RESTORE;
  541.     ucComMF522Buf[1] = sourceaddr;
  542.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  543.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  544.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  545.     {   status = MI_ERR;   }
  546.    
  547.     if (status == MI_OK)
  548.     {
  549.         ucComMF522Buf[0] = 0;
  550.         ucComMF522Buf[1] = 0;
  551.         ucComMF522Buf[2] = 0;
  552.         ucComMF522Buf[3] = 0;
  553.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

  554.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  555.         if (status != MI_ERR)
  556.         {    status = MI_OK;    }
  557.     }
  558.    
  559.     if (status != MI_OK)
  560.     {    return MI_ERR;   }
  561.    
  562.     ucComMF522Buf[0] = PICC_TRANSFER;
  563.     ucComMF522Buf[1] = goaladdr;

  564.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  565.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  566.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  567.     {   status = MI_ERR;   }

  568.     return status;
  569. }


  570. ///////////////////////////////////////////////////////////////////////
  571. // Delay 10ms
  572. ///////////////////////////////////////////////////////////////////////
  573. void delay_10ms(unsigned int _10ms)
  574. {
  575. #ifndef NO_TIMER2
  576.     RCAP2LH = RCAP2_10ms;
  577.     T2LH    = RCAP2_10ms;
  578.    
  579.     TR2 = TRUE;
  580.     while (_10ms--)
  581.     {
  582.             while (!TF2);
  583.             TF2 = FALSE;
  584.     }
  585.     TR2 = FALSE;
  586. #else
  587.     while (_10ms--)
  588.     {
  589.             delay_50us(19);
  590.             if (CmdValid)
  591.                 return;
  592.             delay_50us(20);
  593.             if (CmdValid)
  594.                 return;
  595.             delay_50us(20);
  596.             if (CmdValid)
  597.                 return;
  598.             delay_50us(20);
  599.             if (CmdValid)
  600.                 return;
  601.             delay_50us(20);
  602.             if (CmdValid )
  603.                 return;
  604.             delay_50us(20);
  605.             if (CmdValid)
  606.                 return;
  607.             delay_50us(20);
  608.             if (CmdValid)
  609.                 return;
  610.             delay_50us(20);
  611.             if (CmdValid)
  612.                 return;
  613.             delay_50us(20);
  614.             if (CmdValid)
  615.                 return;
  616.             delay_50us(19);
  617.             if (CmdValid)
  618.                 return;
  619.     }
  620. #endif
  621. }
复制代码


RFID门禁刷卡识别源代码.zip

260.63 KB, 下载次数: 62, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:125704 发表于 2019-3-14 23:27 | 只看该作者
感谢楼主分享,最近需要
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表