找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20033|回復: 38
打印 上一主題 下一主題
收起左側

單片機RFID-RC522做的密碼鎖 仿真 電路 程序代碼都有

  [復制鏈接]
跳轉到指定樓層
樓主
ID:114320 發(fā)表于 2016-4-18 20:01 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式




stc51單片機和RFID-RC522做的密碼鎖仿真圖,仿真文件請下載本帖附件

部分文檔:








以上所有資料打包下載 STC89C52單片機RFID-RC522.zip (10.79 MB, 下載次數(shù): )




51單片機RFID-RC522密碼鎖部分程序代碼:
  1. #include <intrins.h>
  2. #include "STC12C54xx.h"
  3. #include "mfrc522.h"

  4. #define MAXRLEN 18
  5. void Sent_Byte(unsigned char Sdata);
  6.                               
  7. /////////////////////////////////////////////////////////////////////
  8. //功    能:尋卡
  9. //參數(shù)說明: req_code[IN]:尋卡方式
  10. //                0x52 = 尋感應區(qū)內所有符合14443A標準的卡
  11. //                0x26 = 尋未進入休眠狀態(tài)的卡
  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.    ClearBitMask(Status2Reg,0x08);
  26.    WriteRawRC(BitFramingReg,0x07);
  27.    SetBitMask(TxControlReg,0x03);

  28.    ucComMF522Buf[0] = req_code;

  29.    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  30.    
  31.    if ((status == MI_OK) && (unLen == 0x10))
  32.    {   
  33.        *pTagType     = ucComMF522Buf[0];
  34.        *(pTagType+1) = ucComMF522Buf[1];
  35.    }
  36.    else
  37.    {   status = MI_ERR;   }
  38.    
  39.    return status;
  40. }

  41. /////////////////////////////////////////////////////////////////////
  42. //功    能:防沖撞
  43. //參數(shù)說明: pSnr[OUT]:卡片序列號,4字節(jié)
  44. //返    回: 成功返回MI_OK
  45. /////////////////////////////////////////////////////////////////////  
  46. char PcdAnticoll(unsigned char *pSnr)
  47. {
  48.     char status;
  49.     unsigned char i,snr_check=0;
  50.     unsigned int  unLen;
  51.     unsigned char ucComMF522Buf[MAXRLEN];
  52.    

  53.     ClearBitMask(Status2Reg,0x08);
  54.     WriteRawRC(BitFramingReg,0x00);
  55.     ClearBitMask(CollReg,0x80);

  56.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  57.     ucComMF522Buf[1] = 0x20;

  58.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

  59.     if (status == MI_OK)
  60.     {
  61.              for (i=0; i<4; i++)
  62.          {   
  63.              *(pSnr+i)  = ucComMF522Buf[i];
  64.              snr_check ^= ucComMF522Buf[i];
  65.          }
  66.          if (snr_check != ucComMF522Buf[i])
  67.          {   status = MI_ERR;    }
  68.     }
  69.    
  70.     SetBitMask(CollReg,0x80);
  71.     return status;
  72. }

  73. /////////////////////////////////////////////////////////////////////
  74. //功    能:選定卡片
  75. //參數(shù)說明: pSnr[IN]:卡片序列號,4字節(jié)
  76. //返    回: 成功返回MI_OK
  77. /////////////////////////////////////////////////////////////////////
  78. char PcdSelect(unsigned char *pSnr)
  79. {
  80.     char status;
  81.     unsigned char i;
  82.     unsigned int  unLen;
  83.     unsigned char ucComMF522Buf[MAXRLEN];
  84.    
  85.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  86.     ucComMF522Buf[1] = 0x70;
  87.     ucComMF522Buf[6] = 0;
  88.     for (i=0; i<4; i++)
  89.     {
  90.             ucComMF522Buf[i+2] = *(pSnr+i);
  91.             ucComMF522Buf[6]  ^= *(pSnr+i);
  92.     }
  93.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  94.   
  95.     ClearBitMask(Status2Reg,0x08);

  96.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  97.    
  98.     if ((status == MI_OK) && (unLen == 0x18))
  99.     {   status = MI_OK;  }
  100.     else
  101.     {   status = MI_ERR;    }

  102.     return status;
  103. }

  104. /////////////////////////////////////////////////////////////////////
  105. //功    能:驗證卡片密碼
  106. //參數(shù)說明: auth_mode[IN]: 密碼驗證模式
  107. //                 0x60 = 驗證A密鑰
  108. //                 0x61 = 驗證B密鑰
  109. //          addr[IN]:塊地址
  110. //          pKey[IN]:密碼
  111. //          pSnr[IN]:卡片序列號,4字節(jié)
  112. //返    回: 成功返回MI_OK
  113. /////////////////////////////////////////////////////////////////////               
  114. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  115. {
  116.     char status;
  117.     unsigned int  unLen;
  118.     unsigned char i,ucComMF522Buf[MAXRLEN];

  119.     ucComMF522Buf[0] = auth_mode;
  120.     ucComMF522Buf[1] = addr;
  121.     for (i=0; i<6; i++)
  122.     {    ucComMF522Buf[i+2] = *(pKey+i);   }
  123.     for (i=0; i<6; i++)
  124.     {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  125. //   memcpy(&ucComMF522Buf[2], pKey, 6);
  126. //   memcpy(&ucComMF522Buf[8], pSnr, 4);
  127.    
  128.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  129.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  130.     {   status = MI_ERR;   }   
  131.     return status;
  132. }

  133. /////////////////////////////////////////////////////////////////////
  134. //功    能:讀取M1卡一塊數(shù)據(jù)
  135. //參數(shù)說明: addr[IN]:塊地址
  136. //          pData[OUT]:讀出的數(shù)據(jù),16字節(jié)
  137. //返    回: 成功返回MI_OK
  138. /////////////////////////////////////////////////////////////////////
  139. char PcdRead(unsigned char addr,unsigned char *pData)
  140. {
  141.     char status;
  142.     unsigned int  unLen;
  143.     unsigned char i,ucComMF522Buf[MAXRLEN];

  144.     ucComMF522Buf[0] = PICC_READ;
  145.     ucComMF522Buf[1] = addr;
  146.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  147.    
  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.    
  158.     return status;
  159. }

  160. /////////////////////////////////////////////////////////////////////
  161. //功    能:寫數(shù)據(jù)到M1卡一塊
  162. //參數(shù)說明: addr[IN]:塊地址
  163. //          pData[IN]:寫入的數(shù)據(jù),16字節(jié)
  164. //返    回: 成功返回MI_OK
  165. /////////////////////////////////////////////////////////////////////                  
  166. /*char PcdWrite(unsigned char addr,unsigned char *pData)
  167. {
  168.     char status;
  169.     unsigned int  unLen;
  170.     unsigned char i,ucComMF522Buf[MAXRLEN];
  171.    
  172.     ucComMF522Buf[0] = PICC_WRITE;
  173.     ucComMF522Buf[1] = addr;
  174.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  176.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  177.     {   status = MI_ERR;   }
  178.         
  179.     if (status == MI_OK)
  180.     {
  181.         //memcpy(ucComMF522Buf, pData, 16);
  182.         for (i=0; i<16; i++)
  183.         {    ucComMF522Buf[i] = *(pData+i);   }
  184.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  185.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  186.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  187.         {   status = MI_ERR;   }
  188.     }
  189.    
  190.     return status;
  191. }
  192. */
  193. /////////////////////////////////////////////////////////////////////
  194. //功    能:扣款和充值
  195. //參數(shù)說明: dd_mode[IN]:命令字
  196. //               0xC0 = 扣款
  197. //               0xC1 = 充值
  198. //          addr[IN]:錢包地址
  199. //          pValue[IN]:4字節(jié)增(減)值,低位在前
  200. //返    回: 成功返回MI_OK
  201. /////////////////////////////////////////////////////////////////////                 
  202. /*char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
  203. {
  204.     char status;
  205.     unsigned int  unLen;
  206.     unsigned char i,ucComMF522Buf[MAXRLEN];
  207.    
  208.     ucComMF522Buf[0] = dd_mode;
  209.     ucComMF522Buf[1] = addr;
  210.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  212.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  213.     {   status = MI_ERR;   }
  214.         
  215.     if (status == MI_OK)
  216.     {
  217.        // memcpy(ucComMF522Buf, pValue, 4);
  218.         for (i=0; i<16; i++)
  219.         {    ucComMF522Buf[i] = *(pValue+i);   }
  220.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
  221.         unLen = 0;
  222.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  223.         if (status != MI_ERR)
  224.         {    status = MI_OK;    }
  225.     }
  226.    
  227.     if (status == MI_OK)
  228.     {
  229.         ucComMF522Buf[0] = PICC_TRANSFER;
  230.         ucComMF522Buf[1] = addr;
  231.         CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  232.    
  233.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  234.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  235.         {   status = MI_ERR;   }
  236.     }
  237.     return status;
  238. }
  239. */
  240. /////////////////////////////////////////////////////////////////////
  241. //功    能:備份錢包
  242. //參數(shù)說明: sourceaddr[IN]:源地址
  243. //          goaladdr[IN]:目標地址
  244. //返    回: 成功返回MI_OK
  245. /////////////////////////////////////////////////////////////////////
  246. /*char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
  247. {
  248.     char status;
  249.     unsigned int  unLen;
  250.     unsigned char ucComMF522Buf[MAXRLEN];

  251.     ucComMF522Buf[0] = PICC_RESTORE;
  252.     ucComMF522Buf[1] = sourceaddr;
  253.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  255.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  256.     {   status = MI_ERR;   }
  257.    
  258.     if (status == MI_OK)
  259.     {
  260.         ucComMF522Buf[0] = 0;
  261.         ucComMF522Buf[1] = 0;
  262.         ucComMF522Buf[2] = 0;
  263.         ucComMF522Buf[3] = 0;
  264.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

  265.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  266.         if (status != MI_ERR)
  267.         {    status = MI_OK;    }
  268.     }
  269.    
  270.     if (status != MI_OK)
  271.     {    return MI_ERR;   }
  272.    
  273.     ucComMF522Buf[0] = PICC_TRANSFER;
  274.     ucComMF522Buf[1] = goaladdr;

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

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

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

  279.     return status;
  280. }
  281. */

  282. /////////////////////////////////////////////////////////////////////
  283. //功    能:命令卡片進入休眠狀態(tài)
  284. //返    回: 成功返回MI_OK
  285. /////////////////////////////////////////////////////////////////////
  286. char PcdHalt(void)
  287. {
  288.     char status;
  289.     unsigned int  unLen;
  290.     unsigned char ucComMF522Buf[MAXRLEN];

  291.     ucComMF522Buf[0] = PICC_HALT;
  292.     ucComMF522Buf[1] = 0;
  293.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  295.     return MI_OK;
  296. }

  297. /////////////////////////////////////////////////////////////////////
  298. //用MF522計算CRC16函數(shù)
  299. /////////////////////////////////////////////////////////////////////
  300. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  301. {
  302.     unsigned char i,n;
  303.     ClearBitMask(DivIrqReg,0x04);
  304.     WriteRawRC(CommandReg,PCD_IDLE);
  305.     SetBitMask(FIFOLevelReg,0x80);
  306.     for (i=0; i<len; i++)
  307.     {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
  308.     WriteRawRC(CommandReg, PCD_CALCCRC);
  309.     i = 0xFF;
  310.     do
  311.     {
  312.         n = ReadRawRC(DivIrqReg);
  313.         i--;
  314.     }
  315.     while ((i!=0) && !(n&0x04));
  316.     pOutData[0] = ReadRawRC(CRCResultRegL);
  317.     pOutData[1] = ReadRawRC(CRCResultRegM);
  318. }

  319. /////////////////////////////////////////////////////////////////////
  320. //功    能:復位RC522
  321. //返    回: 成功返回MI_OK
  322. /////////////////////////////////////////////////////////////////////
  323. char PcdReset(void)
  324. {
  325.     MF522_RST=1;
  326.     _nop_();
  327.     MF522_RST=0;
  328.     _nop_();
  329.     MF522_RST=1;
  330.      _nop_();
  331.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  332.     _nop_();
  333.    
  334.     WriteRawRC(ModeReg,0x3D);            //和Mifare卡通訊,CRC初始值0x6363
  335.     WriteRawRC(TReloadRegL,30);           
  336.     WriteRawRC(TReloadRegH,0);
  337.     WriteRawRC(TModeReg,0x8D);
  338.     WriteRawRC(TPrescalerReg,0x3E);
  339.     WriteRawRC(TxAskReg,0x40);
  340.    
  341.     return MI_OK;
  342. }

  343. /////////////////////////////////////////////////////////////////////
  344. //功    能:讀RC632寄存器
  345. //參數(shù)說明:Address[IN]:寄存器地址
  346. //返    回:讀出的值
  347. /////////////////////////////////////////////////////////////////////
  348. unsigned char ReadRawRC(unsigned char Address)
  349. {
  350.      unsigned char i, ucAddr;
  351.      unsigned char ucResult=0;

  352.      MF522_SCK = 0;
  353.      MF522_NSS = 0;
  354.      ucAddr = ((Address<<1)&0x7E)|0x80;

  355.      for(i=8;i>0;i--)
  356.      {
  357.          MF522_SI = ((ucAddr&0x80)==0x80);
  358.          MF522_SCK = 1;
  359.          ucAddr <<= 1;
  360.          MF522_SCK = 0;
  361.      }

  362.      for(i=8;i>0;i--)
  363.      {
  364.          MF522_SCK = 1;
  365.          ucResult <<= 1;
  366.          ucResult|=(bit)MF522_SO;
  367.          MF522_SCK = 0;
  368.      }

  369.      MF522_NSS = 1;
  370.      MF522_SCK = 1;
  371.      return ucResult;
  372.      
  373. }

  374. /////////////////////////////////////////////////////////////////////
  375. //功    能:寫RC632寄存器
  376. //參數(shù)說明:Address[IN]:寄存器地址
  377. //          value[IN]:寫入的值
  378. /////////////////////////////////////////////////////////////////////
  379. void WriteRawRC(unsigned char Address, unsigned char value)
  380. {  
  381.     unsigned char i, ucAddr;

  382.     MF522_SCK = 0;
  383.     MF522_NSS = 0;
  384.     ucAddr = ((Address<<1)&0x7E);

  385.     for(i=8;i>0;i--)
  386.     {
  387.         MF522_SI = ((ucAddr&0x80)==0x80);
  388.         MF522_SCK = 1;
  389.         ucAddr <<= 1;
  390.         MF522_SCK = 0;
  391.     }

  392.     for(i=8;i>0;i--)
  393.     {
  394.         MF522_SI = ((value&0x80)==0x80);
  395.         MF522_SCK = 1;
  396.         value <<= 1;
  397.         MF522_SCK = 0;
  398.     }
  399.     MF522_NSS = 1;
  400.     MF522_SCK = 1;
  401. }

  402. /////////////////////////////////////////////////////////////////////
  403. //功    能:置RC522寄存器位
  404. //參數(shù)說明:reg[IN]:寄存器地址
  405. //          mask[IN]:置位值
  406. /////////////////////////////////////////////////////////////////////
  407. void SetBitMask(unsigned char reg,unsigned char mask)  
  408. {
  409.     char tmp = 0x0;
  410.     tmp = ReadRawRC(reg);
  411.     WriteRawRC(reg,tmp | mask);  // set bit mask
  412. }

  413. /////////////////////////////////////////////////////////////////////
  414. //功    能:清RC522寄存器位
  415. //參數(shù)說明:reg[IN]:寄存器地址
  416. //          mask[IN]:清位值
  417. /////////////////////////////////////////////////////////////////////
  418. void ClearBitMask(unsigned char reg,unsigned char mask)  
  419. {
  420.     char tmp = 0x0;
  421.     tmp = ReadRawRC(reg);
  422.     WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  423. }

  424. /////////////////////////////////////////////////////////////////////
  425. //功    能:通過RC522和ISO14443卡通訊
  426. //參數(shù)說明:Command[IN]:RC522命令字
  427. //          pInData[IN]:通過RC522發(fā)送到卡片的數(shù)據(jù)
  428. //          InLenByte[IN]:發(fā)送數(shù)據(jù)的字節(jié)長度
  429. //          pOutData[OUT]:接收到的卡片返回數(shù)據(jù)
  430. //          *pOutLenBit[OUT]:返回數(shù)據(jù)的位長度
  431. /////////////////////////////////////////////////////////////////////
  432. char PcdComMF522(unsigned char Command,
  433.                  unsigned char *pInData,
  434.                  unsigned char InLenByte,
  435.                  unsigned char *pOutData,
  436.                  unsigned int  *pOutLenBit)
  437. {
  438.     char status = MI_ERR;
  439.     unsigned char irqEn   = 0x00;
  440.     unsigned char waitFor = 0x00;
  441.     unsigned char lastBits;
  442.     unsigned char n;
  443.     unsigned int i;
  444.     switch (Command)
  445.     {
  446.        case PCD_AUTHENT:
  447.           irqEn   = 0x12;
  448.           waitFor = 0x10;
  449.           break;
  450.        case PCD_TRANSCEIVE:
  451.           irqEn   = 0x77;
  452.           waitFor = 0x30;
  453.           break;
  454.        default:
  455.          break;
  456.     }
  457.    
  458.     WriteRawRC(ComIEnReg,irqEn|0x80);
  459.     ClearBitMask(ComIrqReg,0x80);
  460.     WriteRawRC(CommandReg,PCD_IDLE);
  461.     SetBitMask(FIFOLevelReg,0x80);
  462.    
  463.     for (i=0; i<InLenByte; i++)
  464.     {   WriteRawRC(FIFODataReg, pInData[i]);    }
  465.     WriteRawRC(CommandReg, Command);
  466.    
  467.    
  468.     if (Command == PCD_TRANSCEIVE)
  469.     {    SetBitMask(BitFramingReg,0x80);  }
  470.    
  471.     i = 600;//根據(jù)時鐘頻率調整,操作M1卡最大等待時間25ms
  472.     do
  473.     {
  474.          n = ReadRawRC(ComIrqReg);
  475.          i--;
  476.     }
  477.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  478.     ClearBitMask(BitFramingReg,0x80);
  479.              
  480.     if (i!=0)
  481.     {   
  482.          if(!(ReadRawRC(ErrorReg)&0x1B))
  483.          {
  484.              status = MI_OK;
  485.              if (n & irqEn & 0x01)
  486.              {   status = MI_NOTAGERR;   }
  487.              if (Command == PCD_TRANSCEIVE)
  488.              {
  489.                        n = ReadRawRC(FIFOLevelReg);
  490.                       lastBits = ReadRawRC(ControlReg) & 0x07;

  491.                        
  492.                 if (lastBits)
  493.                 {   *pOutLenBit = (n-1)*8 + lastBits;   }
  494.                 else
  495.                 {   *pOutLenBit = n*8;   }
  496.                 if (n == 0)
  497.                 {   n = 1;    }
  498.                 if (n > MAXRLEN)
  499.                 {   n = MAXRLEN;   }
  500.                 for (i=0; i<n; i++)
  501.                 {   pOutData[i] = ReadRawRC(FIFODataReg);    }
  502.             }
  503.          }
  504.          else
  505.          {   status = MI_ERR;   }
  506.         
  507.    }
  508.    

  509.    SetBitMask(ControlReg,0x80);           // stop timer now
  510.    WriteRawRC(CommandReg,PCD_IDLE);
  511.    return status;
  512. }


  513. /////////////////////////////////////////////////////////////////////
  514. //開啟天線  
  515. //每次啟動或關閉天險發(fā)射之間應至少有1ms的間隔
  516. /////////////////////////////////////////////////////////////////////
  517. void PcdAntennaOn()
  518. {
  519.     unsigned char i;
  520.     i = ReadRawRC(TxControlReg);
  521.     if (!(i & 0x03))
  522.     {
  523.         SetBitMask(TxControlReg, 0x03);
  524.     }
  525. }


  526. /////////////////////////////////////////////////////////////////////
  527. //關閉天線
  528. /////////////////////////////////////////////////////////////////////
  529. void PcdAntennaOff()
  530. {
  531.     ClearBitMask(TxControlReg, 0x03);
  532. }
復制代碼
  1. //////////////////////////////////
  2. //端口定義
  3. /////////////////////////////////////////////////////////////////////
  4. //MFRC522

  5. sbit     MF522_NSS  =    P2^2;
  6. sbit     MF522_SCK  =    P2^1;
  7. sbit     MF522_SI   =    P2^0;
  8. sbit     MF522_SO   =    P2^3;
  9. sbit         RW                        =         P2^6;

  10. //sbit    relay          =P1^0;//繼電器控制

  11. //水控端口定義,以下需要根據(jù)硬件映射
  12. sbit     MF522_RST  =    P2^4;              //RC522片選,根據(jù)硬件需要修改,p3.3
  13. sbit     beep       =    P1^7;              //蜂鳴器p3.5
  14. sbit     LED        =    P1^6;              //綠色計費指示燈p3.4
  15. //sbit    on_off      =    P3^2;              //按鍵開關  P3^2

  16. void LCD_init   (void);
  17. void LCD_clr        (void);
  18. void LCD_printc (unsigned char x, unsigned char y, unsigned char c);
  19. void LCD_prints(unsigned char x, unsigned char y, unsigned char *s);
  20. bit JudgeCard(uchar *CardID,uchar n);
  21. uchar JudgeCards(uchar *CardID);
  22. void x16tochar(uchar s,uchar *ch);
  23. /////////////////////////////////////////////////////////////////////
  24. //函數(shù)原型
  25. /////////////////////////////////////////////////////////////////////
  26. void Sent_Byte(unsigned char Sdata);
  27. char PcdReset(void);
  28. void PcdAntennaOn(void);
  29. void PcdAntennaOff(void);
  30. char PcdRequest(unsigned char req_code,unsigned char *pTagType);   
  31. char PcdAnticoll(unsigned char *pSnr);
  32. char PcdSelect(unsigned char *pSnr);         
  33. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr);     
  34. char PcdRead(unsigned char addr,unsigned char *pData);     
  35. char PcdWrite(unsigned char addr,unsigned char *pData);   
  36. char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue);   
  37. char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr);                                 
  38. char PcdHalt(void);

  39. char PcdComMF522(unsigned char Command,
  40.                  unsigned char *pInData,
  41.                  unsigned char InLenByte,
  42.                  unsigned char *pOutData,
  43.                  unsigned int  *pOutLenBit);

  44. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData);
  45. void WriteRawRC(unsigned char Address,unsigned char value);
  46. unsigned char ReadRawRC(unsigned char Address);
  47. void SetBitMask(unsigned char reg,unsigned char mask);
  48. void ClearBitMask(unsigned char reg,unsigned char mask);

  49. /////////////////////////////////////////////////////////////////////
  50. //串口緩沖區(qū)長度及常用宏定義
  51. /////////////////////////////////////////////////////////////////////
  52. #define REC_BUFFER_SIZE        32
  53. #define OK                0
  54. #define FAIL        1
  55. #define ERROR        1

  56. /////////////////////////////////////////////////////////////////////
  57. //MF522命令字
  58. /////////////////////////////////////////////////////////////////////
  59. #define PCD_IDLE              0x00               //取消當前命令
  60. #define PCD_AUTHENT           0x0E               //驗證密鑰
  61. #define PCD_RECEIVE           0x08               //接收數(shù)據(jù)
  62. #define PCD_TRANSMIT          0x04               //發(fā)送數(shù)據(jù)
  63. #define PCD_TRANSCEIVE        0x0C               //發(fā)送并接收數(shù)據(jù)
  64. #define PCD_RESETPHASE        0x0F               //復位
  65. #define PCD_CALCCRC           0x03               //CRC計算

  66. /////////////////////////////////////////////////////////////////////
  67. //Mifare_One卡片命令字
  68. /////////////////////////////////////////////////////////////////////
  69. #define PICC_REQIDL           0x26               //尋天線區(qū)內未進入休眠狀態(tài)
  70. #define PICC_REQALL           0x52               //尋天線區(qū)內全部卡
  71. #define PICC_ANTICOLL1        0x93               //防沖撞
  72. #define PICC_ANTICOLL2        0x95               //防沖撞
  73. #define PICC_AUTHENT1A        0x60               //驗證A密鑰
  74. #define PICC_AUTHENT1B        0x61               //驗證B密鑰
  75. #define PICC_READ             0x30               //讀塊
  76. #define PICC_WRITE            0xA0               //寫塊
  77. #define PICC_DECREMENT        0xC0               //扣款
  78. #define PICC_INCREMENT        0xC1               //充值
  79. #define PICC_RESTORE          0xC2               //調塊數(shù)據(jù)到緩沖區(qū)
  80. #define PICC_TRANSFER         0xB0               //保存緩沖區(qū)中數(shù)據(jù)
  81. #define PICC_HALT             0x50               //休眠

  82. /////////////////////////////////////////////////////////////////////
  83. //MF522 FIFO長度定義
  84. /////////////////////////////////////////////////////////////////////
  85. #define DEF_FIFO_LENGTH            64                 //FIFO size=64byte

  86. /////////////////////////////////////////////////////////////////////
  87. //MF522寄存器定義
  88. /////////////////////////////////////////////////////////////////////
  89. // PAGE 0
  90. #define     RFU00                 0x00   
  91. #define     CommandReg            0x01   
  92. #define     ComIEnReg             0x02   
  93. #define     DivlEnReg             0x03   
  94. #define     ComIrqReg             0x04   
  95. #define     DivIrqReg             0x05
  96. #define     ErrorReg              0x06   
  97. #define     Status1Reg            0x07   
  98. #define     Status2Reg            0x08   
  99. #define     FIFODataReg           0x09
  100. #define     FIFOLevelReg          0x0A
  101. #define     WaterLevelReg         0x0B
  102. #define     ControlReg            0x0C
  103. #define     BitFramingReg         0x0D
  104. #define     CollReg               0x0E
  105. #define     RFU0F                 0x0F
  106. // PAGE 1     
  107. #define     RFU10                 0x10
  108. #define     ModeReg               0x11
  109. #define     TxModeReg             0x12
  110. #define     RxModeReg             0x13
  111. #define     TxControlReg          0x14
  112. #define     TxAskReg              0x15
  113. #define     TxSelReg              0x16
  114. #define     RxSelReg              0x17
  115. #define     RxThresholdReg        0x18
  116. #define     DemodReg              0x19
  117. #define     RFU1A                 0x1A
  118. #define     RFU1B                 0x1B
  119. #define     MifareReg             0x1C
  120. #define     RFU1D                 0x1D
  121. #define     RFU1E                 0x1E
  122. #define     SerialSpeedReg        0x1F
  123. // PAGE 2   
  124. #define     RFU20                 0x20  
  125. #define     CRCResultRegM         0x21
  126. #define     CRCResultRegL         0x22
  127. #define     RFU23                 0x23
  128. #define     ModWidthReg           0x24
  129. #define     RFU25                 0x25
  130. #define     RFCfgReg              0x26
  131. #define     GsNReg                0x27
  132. #define     CWGsCfgReg            0x28
  133. #define     ModGsCfgReg           0x29
  134. #define     TModeReg              0x2A
  135. #define     TPrescalerReg         0x2B
  136. #define     TReloadRegH           0x2C
  137. #define     TReloadRegL           0x2D
  138. #define     TCounterValueRegH     0x2E
  139. #define     TCounterValueRegL     0x2F
  140. // PAGE 3      
  141. #define     RFU30                 0x30
  142. #define     TestSel1Reg           0x31
  143. #define     TestSel2Reg           0x32
  144. #define     TestPinEnReg          0x33
  145. #define     TestPinValueReg       0x34
  146. #define     TestBusReg            0x35
  147. #define     AutoTestReg           0x36
  148. #define     VersionReg            0x37
  149. #define     AnalogTestReg         0x38
  150. #define     TestDAC1Reg           0x39  
  151. #define     TestDAC2Reg           0x3A   
  152. #define     TestADCReg            0x3B   
  153. #define     RFU3C                 0x3C   
  154. #define     RFU3D                 0x3D   
  155. #define     RFU3E                 0x3E   
  156. #define     RFU3F                          0x3F

  157. /////////////////////////////////////////////////////////////////////
  158. //和MF522通訊時返回的錯誤代碼
  159. /////////////////////////////////////////////////////////////////////
  160. #define MI_OK                          0
  161. #define MI_NOTAGERR                    (-1)
  162. #define MI_ERR                         (-2)
復制代碼




評分

參與人數(shù) 3黑幣 +9 收起 理由
15613875202 + 3 共享資料的黑幣獎勵!
ASA啦啦啦 + 5
天邊的污云 + 1 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:122029 發(fā)表于 2016-5-19 20:21 | 只看該作者
畢業(yè)設計就是做RFID,這么多資料,謝謝了
回復

使用道具 舉報

板凳
ID:69982 發(fā)表于 2016-7-5 12:01 | 只看該作者
謝謝分享,下載下來學習。
回復

使用道具 舉報

地板
ID:134242 發(fā)表于 2016-7-20 16:20 | 只看該作者
供應13.56M非接芯片,兼容CV520,RC522,RC523,F(xiàn)M17520,F(xiàn)M17522.具有絕對成本優(yōu)勢。有意者可加QQ458231727
回復

使用道具 舉報

5#
ID:135219 發(fā)表于 2016-7-27 14:29 | 只看該作者
這個要好好學習
回復

使用道具 舉報

6#
ID:137960 發(fā)表于 2016-8-30 17:38 | 只看該作者

 謝謝分享,下載下來學習。
回復

使用道具 舉報

7#
ID:68727 發(fā)表于 2016-10-3 00:12 來自手機 | 只看該作者
正需要Rc522資料這個能用嗎
回復

使用道具 舉報

8#
ID:148474 發(fā)表于 2016-11-17 15:24 | 只看該作者
謝謝分享。
回復

使用道具 舉報

9#
ID:148358 發(fā)表于 2016-11-22 16:20 | 只看該作者
芯片使用的是stc12
回復

使用道具 舉報

10#
ID:110866 發(fā)表于 2016-12-1 23:15 | 只看該作者
非常有幫助,感謝
回復

使用道具 舉報

11#
ID:185990 發(fā)表于 2017-4-4 13:45 | 只看該作者
好流弊的教程!學習了,等我黑必夠了再來下載
回復

使用道具 舉報

12#
ID:187454 發(fā)表于 2017-4-8 15:49 | 只看該作者
h很需要這個,畢設關于她
回復

使用道具 舉報

13#
ID:112693 發(fā)表于 2017-4-17 09:45 | 只看該作者
謝謝樓主,學習了,就是沒有圖片資料
回復

使用道具 舉報

14#
ID:197537 發(fā)表于 2017-5-6 22:56 | 只看該作者
謝謝樓主,我是找這個RC522模塊仿真弄很久了,就是不怎么會,還好發(fā)現(xiàn)了你,我現(xiàn)在才開始接觸單片機,感覺真的有點沒頭緒,幸好發(fā)現(xiàn)了這個論壇
回復

使用道具 舉報

15#
ID:197537 發(fā)表于 2017-5-7 13:02 | 只看該作者
dragon19790000 發(fā)表于 2017-4-17 09:45
謝謝樓主,學習了,就是沒有圖片資料

請問你將資料下了嗎,我想看看,但是我的黑幣不夠
回復

使用道具 舉報

16#
ID:186474 發(fā)表于 2017-6-5 17:15 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

17#
ID:106195 發(fā)表于 2017-9-1 17:57 | 只看該作者
感謝分享,支持一下。
回復

使用道具 舉報

18#
ID:248011 發(fā)表于 2017-11-10 23:13 | 只看該作者
啊啊啊啊啊這個驅動程序咋用的呢,,怎么實現(xiàn)用c51來控制這個東東呀,,,看了好多不同的資料,頭好暈
回復

使用道具 舉報

19#
ID:247161 發(fā)表于 2017-12-14 20:36 | 只看該作者
謝謝樓主分享,一直在找這方面的資料,
回復

使用道具 舉報

20#
ID:313960 發(fā)表于 2018-4-22 19:24 | 只看該作者
小白表示好困難。。。。。。。。。
回復

使用道具 舉報

21#
ID:265703 發(fā)表于 2018-5-31 12:41 | 只看該作者
東西不錯,51黑有你更精彩!!!
回復

使用道具 舉報

22#
ID:342334 發(fā)表于 2018-5-31 17:27 | 只看該作者
好貼
回復

使用道具 舉報

23#
ID:342348 發(fā)表于 2018-5-31 17:52 | 只看該作者
課程設計看見這么資料可以參考謝謝了
回復

使用道具 舉報

24#
ID:354020 發(fā)表于 2018-6-21 21:07 | 只看該作者
仰望前輩
回復

使用道具 舉報

25#
ID:420517 發(fā)表于 2018-11-4 15:19 | 只看該作者
在做一個51單片機的門禁 剛好可以做資料
回復

使用道具 舉報

26#
ID:356526 發(fā)表于 2018-11-17 22:54 | 只看該作者
好流弊的教程!學習了,等我黑必夠了再來下載
回復

使用道具 舉報

27#
ID:428656 發(fā)表于 2019-3-6 09:05 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

28#
ID:277614 發(fā)表于 2019-3-7 12:10 | 只看該作者
贊一個
回復

使用道具 舉報

29#
ID:488123 發(fā)表于 2019-3-10 20:22 | 只看該作者
哇,我好想要啊

評分

參與人數(shù) 1黑幣 +10 收起 理由
jinsheng7533967 + 10 為了不讓你留遺憾,打償你10個黑幣

查看全部評分

回復

使用道具 舉報

30#
ID:21069 發(fā)表于 2019-3-11 10:45 | 只看該作者
很好的例子,謝謝分享,51黑有你更精彩!期待有更作品好的!
回復

使用道具 舉報

31#
ID:125704 發(fā)表于 2019-3-15 20:36 | 只看該作者
謝謝分享,下載下來學習。
回復

使用道具 舉報

32#
ID:437764 發(fā)表于 2019-4-2 10:47 來自手機 | 只看該作者
高質量
回復

使用道具 舉報

33#
ID:503766 發(fā)表于 2019-4-3 02:20 | 只看該作者
真棒,非常好
回復

使用道具 舉報

34#
ID:236645 發(fā)表于 2019-4-3 08:52 | 只看該作者
我也想要QAQ
回復

使用道具 舉報

35#
ID:513300 發(fā)表于 2019-4-22 09:47 | 只看該作者
謝謝分享
回復

使用道具 舉報

36#
ID:526832 發(fā)表于 2020-1-21 14:53 | 只看該作者
RC522 跟FM17520區(qū)別在哪?編程方面
回復

使用道具 舉報

37#
ID:732034 發(fā)表于 2020-4-18 14:30 | 只看該作者
學習一下, 謝謝分享
回復

使用道具 舉報

38#
ID:302325 發(fā)表于 2020-5-13 12:46 | 只看該作者
很好的資料  感謝分享      
回復

使用道具 舉報

39#
ID:508129 發(fā)表于 2020-5-27 23:17 | 只看該作者
代碼main()是空的,生成不了hex
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表