久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2011|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32單片機(jī)NFC門禁系統(tǒng)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1090286 發(fā)表于 2023-10-20 12:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

  1. /*   RFID_RC522門禁系統(tǒng)  */

  2. /*   接線: RC522模塊:RST接PB11;MISO接PB10; MOSI接PB1;SCK接PB0;SDA接PA7;
  3.                               0.96寸OLED:scl接PB8,sda接PB9
  4.                         有源蜂鳴器:I/O接PA3
  5.                         180度舵機(jī):信號(hào)線接PA1(5V電源驅(qū)動(dòng))
  6.                         按鍵1:PB12; 按鍵2:PB14;按鍵3:PA9;按鍵4:PA12;   
  7. */

  8. /*         
  9. 具體功能描述:
  10.          讀模式:        上電后默認(rèn)為讀模式,按下2鍵后進(jìn)入寫模式,按下3鍵進(jìn)入刪模式
  11.          寫模式: 在寫模式下將靠近感應(yīng)區(qū)即可寫成功,已錄入的不能重復(fù)錄入,在寫模式下按下1鍵進(jìn)入尋模式,按下3鍵進(jìn)入刪模式
  12.          刪模式: 在刪`模式下按下1鍵或2鍵選擇要?jiǎng)h除的,按下3鍵確認(rèn)刪除,按下4鍵返回到讀模式。
  13. */
  14. #include "stm32f10x.h"                  // Device header
  15. #include "RC522.H"                       

  16. uint8_t UID[4],Temp[4];

  17. uint8_t UI0[4]={0xFF,0xFF,0xFF,0xFF};                         //0ID號(hào)
  18. uint8_t UI1[4]={0xFF,0xFF,0xFF,0xFF};                         //1ID號(hào)
  19. uint8_t UI2[4]={0xFF,0xFF,0xFF,0xFF};                        //2ID號(hào)
  20. uint8_t UI3[4]={0xFF,0xFF,0xFF,0xFF};                        //3ID號(hào)

  21. //RC522端口定義
  22. void PcdInit()
  23. {
  24.           GPIO_InitTypeDef  GPIO_InitStructure;

  25.           /* Enable the GPIO Clock */
  26.           RCC_APB2PeriphClockCmd(MF522_RST_CLK, ENABLE);

  27.           /* Configure the GPIO pin */
  28.           GPIO_InitStructure.GPIO_Pin = MF522_RST_PIN;
  29.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  30.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

  31.           GPIO_Init(MF522_RST_PORT, &GPIO_InitStructure);

  32.           /* Enable the GPIO Clock */
  33.           RCC_APB2PeriphClockCmd(MF522_MISO_CLK, ENABLE);

  34.           /* Configure the GPIO pin */
  35.           GPIO_InitStructure.GPIO_Pin = MF522_MISO_PIN;
  36.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  37.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

  38.           GPIO_Init(MF522_MISO_PORT, &GPIO_InitStructure);

  39.           /* Enable the GPIO Clock */
  40.           RCC_APB2PeriphClockCmd(MF522_MOSI_CLK, ENABLE);

  41.           /* Configure the GPIO pin */
  42.           GPIO_InitStructure.GPIO_Pin = MF522_MOSI_PIN;
  43.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  44.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

  45.           GPIO_Init(MF522_MOSI_PORT, &GPIO_InitStructure);

  46.           /* Enable the GPIO Clock */
  47.           RCC_APB2PeriphClockCmd(MF522_SCK_CLK, ENABLE);

  48.           /* Configure the GPIO pin */
  49.           GPIO_InitStructure.GPIO_Pin = MF522_SCK_PIN;
  50.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  51.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

  52.           GPIO_Init(MF522_SCK_PORT, &GPIO_InitStructure);

  53.           /* Enable the GPIO Clock */
  54.           RCC_APB2PeriphClockCmd(MF522_NSS_CLK, ENABLE);

  55.           /* Configure the GPIO pin */
  56.           GPIO_InitStructure.GPIO_Pin = MF522_NSS_PIN;
  57.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  58.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

  59.           GPIO_Init(MF522_NSS_PORT, &GPIO_InitStructure);
  60. }


  61. ///////////////////////以下為RC522驅(qū)動(dòng)函數(shù)/////////////////////////
  62. ///////////////////////以下為RC522驅(qū)動(dòng)函數(shù)/////////////////////////
  63. ///////////////////////以下為RC522驅(qū)動(dòng)函數(shù)/////////////////////////

  64. //功    能:尋
  65. //參數(shù)說明: req_code[IN]:尋方式
  66. //                0x52 = 尋感應(yīng)區(qū)內(nèi)所有符合14443A標(biāo)準(zhǔn)的
  67. //                0x26 = 尋未進(jìn)入休眠狀態(tài)的
  68. //                    pTagType[OUT]:片類型代碼
  69. //                0x4400 = Mifare_UltraLight
  70. //                0x0400 = Mifare_One(S50)
  71. //                0x0200 = Mifare_One(S70)
  72. //                0x0800 = Mifare_Pro(X)
  73. //                0x4403 = Mifare_DESFire
  74. //返    回: 成功返回MI_OK
  75. char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  76. {
  77.    char status;  
  78.    unsigned int  unLen;
  79.    unsigned char ucComMF522Buf[MAXRLEN];
  80. //  unsigned char xTest ;
  81.    ClearBitMask(Status2Reg,0x08);
  82.    WriteRawRC(BitFramingReg,0x07);

  83. //  xTest = ReadRawRC(BitFramingReg);
  84. //  if(xTest == 0x07 )
  85. //   { LED_GREEN  =0 ;}
  86. // else {LED_GREEN =1 ;while(1){}}
  87.    SetBitMask(TxControlReg,0x03);

  88.    ucComMF522Buf[0] = req_code;

  89.    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  90. //     if(status  == MI_OK )
  91. //   { LED_GREEN  =0 ;}
  92. //   else {LED_GREEN =1 ;}
  93.    if ((status == MI_OK) && (unLen == 0x10))
  94.    {   
  95.        *pTagType     = ucComMF522Buf[0];
  96.        *(pTagType+1) = ucComMF522Buf[1];
  97.    }
  98.    else
  99.    {   status = MI_ERR;   }

  100.    return status;
  101. }

  102. //功    能:防沖撞
  103. //參數(shù)說明: pSnr[OUT]:片序列號(hào),4字節(jié)
  104. //返    回: 成功返回MI_OK
  105. char PcdAnticoll(unsigned char *pSnr)
  106. {
  107.     char status;
  108.     unsigned char i,snr_check=0;
  109.     unsigned int  unLen;
  110.     unsigned char ucComMF522Buf[MAXRLEN];


  111.     ClearBitMask(Status2Reg,0x08);
  112.     WriteRawRC(BitFramingReg,0x00);
  113.     ClearBitMask(CollReg,0x80);

  114.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  115.     ucComMF522Buf[1] = 0x20;

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

  117.     if (status == MI_OK)
  118.     {
  119.              for (i=0; i<4; i++)
  120.          {   
  121.              *(pSnr+i)  = ucComMF522Buf[ i];
  122.              snr_check ^= ucComMF522Buf[ i];
  123.          }
  124.          if (snr_check != ucComMF522Buf[ i])
  125.          {   status = MI_ERR;    }
  126.     }

  127.     SetBitMask(CollReg,0x80);
  128.     return status;
  129. }

  130. //功    能:選定片
  131. //參數(shù)說明: pSnr[IN]:片序列號(hào),4字節(jié)
  132. //返    回: 成功返回MI_OK
  133. char PcdSelect(unsigned char *pSnr)
  134. {
  135.     char status;
  136.     unsigned char i;
  137.     unsigned int  unLen;
  138.     unsigned char ucComMF522Buf[MAXRLEN];

  139.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  140.     ucComMF522Buf[1] = 0x70;
  141.     ucComMF522Buf[6] = 0;
  142.     for (i=0; i<4; i++)
  143.     {
  144.             ucComMF522Buf[i+2] = *(pSnr+i);
  145.             ucComMF522Buf[6]  ^= *(pSnr+i);
  146.     }
  147.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);

  148.     ClearBitMask(Status2Reg,0x08);

  149.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);

  150.     if ((status == MI_OK) && (unLen == 0x18))
  151.     {   status = MI_OK;  }
  152.     else
  153.     {   status = MI_ERR;    }

  154.     return status;
  155. }

  156. //功    能:驗(yàn)證片密碼
  157. //參數(shù)說明: auth_mode[IN]: 密碼驗(yàn)證模式
  158. //                 0x60 = 驗(yàn)證A密鑰
  159. //                 0x61 = 驗(yàn)證B密鑰
  160. //          addr[IN]:塊地址
  161. //          pKey[IN]:密碼
  162. //          pSnr[IN]:片序列號(hào),4字節(jié)
  163. //返    回: 成功返回MI_OK      
  164. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  165. {
  166.     char status;
  167.     unsigned int  unLen;
  168.     unsigned char i,ucComMF522Buf[MAXRLEN];

  169.     ucComMF522Buf[0] = auth_mode;
  170.     ucComMF522Buf[1] = addr;
  171.     for (i=0; i<6; i++)
  172.     {    ucComMF522Buf[i+2] = *(pKey+i);   }
  173.     for (i=0; i<6; i++)
  174.     {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  175. //   memcpy(&ucComMF522Buf[2], pKey, 6);
  176. //   memcpy(&ucComMF522Buf[8], pSnr, 4);

  177.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  178.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  179.     {   status = MI_ERR;   }

  180.     return status;
  181. }

  182. //功    能:讀取M1一塊數(shù)據(jù)
  183. //參數(shù)說明: addr[IN]:塊地址
  184. //          pData[OUT]:讀出的數(shù)據(jù),16字節(jié)
  185. //返    回: 成功返回MI_OK
  186. char PcdRead(unsigned char addr,unsigned char *pData)
  187. {
  188.     char status;
  189.     unsigned int  unLen;
  190.     unsigned char i,ucComMF522Buf[MAXRLEN];

  191.     ucComMF522Buf[0] = PICC_READ;
  192.     ucComMF522Buf[1] = addr;
  193.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  194.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  195.     if ((status == MI_OK) && (unLen == 0x90))
  196. //   {   memcpy(pData, ucComMF522Buf, 16);   }
  197.     {
  198.         for (i=0; i<16; i++)
  199.         {    *(pData+i) = ucComMF522Buf[ i];   }
  200.     }
  201.     else
  202.     {   status = MI_ERR;   }

  203.     return status;
  204. }

  205. //功    能:寫數(shù)據(jù)到M1一塊
  206. //參數(shù)說明: addr[IN]:塊地址
  207. //          pData[IN]:寫入的數(shù)據(jù),16字節(jié)
  208. //返    回: 成功返回MI_OK         
  209. char PcdWrite(unsigned char addr,unsigned char *pData)
  210. {
  211.     char status;
  212.     unsigned int  unLen;
  213.     unsigned char i,ucComMF522Buf[MAXRLEN];

  214.     ucComMF522Buf[0] = PICC_WRITE;
  215.     ucComMF522Buf[1] = addr;
  216.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

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

  220.     if (status == MI_OK)
  221.     {
  222.         //memcpy(ucComMF522Buf, pData, 16);

  223.         for (i=0; i<16; i++)
  224.         {    ucComMF522Buf[ i] = *(pData+i);   }
  225.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  226.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  227.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  228.         {   status = MI_ERR;   }
  229.     }

  230.     return status;
  231. }

  232. //功    能:命令片進(jìn)入休眠狀態(tài)
  233. //返    回: 成功返回MI_OK
  234. char PcdHalt(void)
  235. {
  236.     unsigned int  unLen;
  237.     unsigned char ucComMF522Buf[MAXRLEN];

  238.     ucComMF522Buf[0] = PICC_HALT;
  239.     ucComMF522Buf[1] = 0;
  240.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  241.     PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  242.     return MI_OK;
  243. }

  244. //用MF522計(jì)算CRC16函數(shù)
  245. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  246. {
  247.     unsigned char i,n;
  248.     ClearBitMask(DivIrqReg,0x04);
  249.     WriteRawRC(CommandReg,PCD_IDLE);
  250.     SetBitMask(FIFOLevelReg,0x80);
  251.     for (i=0; i<len; i++)
  252.     {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
  253.     WriteRawRC(CommandReg, PCD_CALCCRC);
  254.     i = 0xFF;
  255.     do
  256.     {
  257.         n = ReadRawRC(DivIrqReg);
  258.         i--;
  259.     }
  260.     while ((i!=0) && !(n&0x04));
  261.     pOutData[0] = ReadRawRC(CRCResultRegL);
  262.     pOutData[1] = ReadRawRC(CRCResultRegM);
  263. }

  264. //功    能:復(fù)位RC522
  265. //返    回: 成功返回MI_OK
  266. char PcdReset(void)
  267. {
  268.     RST_H;
  269.     delay_10ms(1);
  270.     RST_L;
  271.     delay_10ms(1);
  272.     RST_H;
  273.           delay_10ms(10);
  274.         
  275.                 if(ReadRawRC(0x02) == 0x80)
  276.                 {
  277.                 }

  278.     WriteRawRC(CommandReg,PCD_RESETPHASE);

  279.     WriteRawRC(ModeReg,0x3D);            //和Mifare通訊,CRC初始值0x6363
  280.     WriteRawRC(TReloadRegL,30);           
  281.     WriteRawRC(TReloadRegH,0);
  282.     WriteRawRC(TModeReg,0x8D);
  283.     WriteRawRC(TPrescalerReg,0x3E);
  284.     WriteRawRC(TxAutoReg,0x40);     
  285.     return MI_OK;
  286. }

  287. //設(shè)置RC632的工作方式
  288. char M500PcdConfigISOType(unsigned char type)
  289. {
  290.    if (type == 'A')                     //ISO14443_A
  291.    {
  292.        ClearBitMask(Status2Reg,0x08);

  293. /*     WriteRawRC(CommandReg,0x20);    //as default   
  294.        WriteRawRC(ComIEnReg,0x80);     //as default
  295.        WriteRawRC(DivlEnReg,0x0);      //as default
  296.            WriteRawRC(ComIrqReg,0x04);     //as default
  297.            WriteRawRC(DivIrqReg,0x0);      //as default
  298.            WriteRawRC(Status2Reg,0x0);//80    //trun off temperature sensor
  299.            WriteRawRC(WaterLevelReg,0x08); //as default
  300.        WriteRawRC(ControlReg,0x20);    //as default
  301.            WriteRawRC(CollReg,0x80);    //as default
  302. */
  303.        WriteRawRC(ModeReg,0x3D);//3F
  304. /*           WriteRawRC(TxModeReg,0x0);      //as default???
  305.            WriteRawRC(RxModeReg,0x0);      //as default???
  306.            WriteRawRC(TxControlReg,0x80);  //as default???
  307.            WriteRawRC(TxSelReg,0x10);      //as default???
  308.    */
  309.        WriteRawRC(RxSelReg,0x86);//84
  310. //      WriteRawRC(RxThresholdReg,0x84);//as default
  311. //      WriteRawRC(DemodReg,0x4D);      //as default

  312. //      WriteRawRC(ModWidthReg,0x13);//26
  313.        WriteRawRC(RFCfgReg,0x7F);   //4F
  314.         /*   WriteRawRC(GsNReg,0x88);        //as default???
  315.            WriteRawRC(CWGsCfgReg,0x20);    //as default???
  316.        WriteRawRC(ModGsCfgReg,0x20);   //as default???
  317. */
  318.               WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
  319.            WriteRawRC(TReloadRegH,0);
  320.        WriteRawRC(TModeReg,0x8D);
  321.            WriteRawRC(TPrescalerReg,0x3E);
  322.            

  323.   //     PcdSetTmo(106);
  324.            delay_10ms(1);
  325.        PcdAntennaOn();
  326.    }
  327.    else{ return (char)-1; }

  328.    return MI_OK;
  329. }

  330. //功    能:讀RC632寄存器
  331. //參數(shù)說明:Address[IN]:寄存器地址
  332. //返    回:讀出的值
  333. unsigned char ReadRawRC(unsigned char Address)
  334. {
  335.      unsigned char i, ucAddr;
  336.      unsigned char ucResult=0;

  337.      NSS_L;
  338.      ucAddr = ((Address<<1)&0x7E)|0x80;

  339.      for(i=8;i>0;i--)
  340.      {
  341.          SCK_L;
  342.                   if(ucAddr&0x80)
  343.                  MOSI_H;
  344.                  else
  345.                                  MOSI_L;
  346.          SCK_H;
  347.          ucAddr <<= 1;
  348.      }

  349.      for(i=8;i>0;i--)
  350.      {
  351.          SCK_L;
  352.          ucResult <<= 1;
  353.          SCK_H;
  354.                  if(READ_MISO == 1)
  355.                  ucResult |= 1;
  356.      }

  357.      NSS_H;
  358.      SCK_H;
  359.      return ucResult;
  360. }

  361. //功    能:寫RC632寄存器
  362. //參數(shù)說明:Address[IN]:寄存器地址
  363. //          value[IN]:寫入的值
  364. void WriteRawRC(unsigned char Address, unsigned char value)
  365. {  
  366.     unsigned char i, ucAddr;

  367.     SCK_L;
  368.     NSS_L;
  369.     ucAddr = ((Address<<1)&0x7E);

  370.     for(i=8;i>0;i--)
  371.     {
  372.                 if(ucAddr&0x80)
  373.                 MOSI_H;
  374.                 else
  375.                         MOSI_L;
  376.         SCK_H;
  377.         ucAddr <<= 1;
  378.         SCK_L;
  379.     }

  380.     for(i=8;i>0;i--)
  381.     {
  382.                 if(value&0x80)
  383.                 MOSI_H;
  384.                 else
  385.                         MOSI_L;
  386.         SCK_H;
  387.         value <<= 1;
  388.         SCK_L;
  389.     }
  390.     NSS_H;
  391.     SCK_H;
  392. }

  393. //功    能:置RC522寄存器位
  394. //參數(shù)說明:reg[IN]:寄存器地址
  395. //          mask[IN]:置位值
  396. void SetBitMask(unsigned char reg,unsigned char mask)  
  397. {
  398.     char tmp = 0x0;
  399.     tmp = ReadRawRC(reg);
  400.     WriteRawRC(reg,tmp | mask);  // set bit mask
  401. }

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

  411. //功    能:通過RC522和ISO14443通訊
  412. //參數(shù)說明:Command[IN]:RC522命令字
  413. //          pInData[IN]:通過RC522發(fā)送到片的數(shù)據(jù)
  414. //          InLenByte[IN]:發(fā)送數(shù)據(jù)的字節(jié)長(zhǎng)度
  415. //          pOutData[OUT]:接收到的片返回?cái)?shù)據(jù)
  416. //          *pOutLenBit[OUT]:返回?cái)?shù)據(jù)的位長(zhǎng)度
  417. char PcdComMF522(unsigned char Command,
  418.                  unsigned char *pInData,
  419.                  unsigned char InLenByte,
  420.                  unsigned char *pOutData,
  421.                  unsigned int  *pOutLenBit)
  422. {
  423.     char status = MI_ERR;
  424.     unsigned char irqEn   = 0x00;
  425.     unsigned char waitFor = 0x00;
  426.     unsigned char lastBits;
  427.     unsigned char n;
  428.     unsigned int i;
  429.     switch (Command)
  430.     {
  431.        case PCD_AUTHENT:
  432.           irqEn   = 0x12;
  433.           waitFor = 0x10;
  434.           break;
  435.        case PCD_TRANSCEIVE:
  436.           irqEn   = 0x77;
  437.           waitFor = 0x30;
  438.           break;
  439.        default:
  440.          break;
  441.     }

  442.     WriteRawRC(ComIEnReg,irqEn|0x80);
  443.     ClearBitMask(ComIrqReg,0x80);
  444.     WriteRawRC(CommandReg,PCD_IDLE);
  445.     SetBitMask(FIFOLevelReg,0x80);

  446.     for (i=0; i<InLenByte; i++)
  447.     {   WriteRawRC(FIFODataReg, pInData[ i]);    }
  448.     WriteRawRC(CommandReg, Command);


  449.     if (Command == PCD_TRANSCEIVE)
  450.     {    SetBitMask(BitFramingReg,0x80);  }

  451. //    i = 600;//根據(jù)時(shí)鐘頻率調(diào)整,操作M1最大等待時(shí)間25ms
  452. i = 2000;
  453.     do
  454.     {
  455.          n = ReadRawRC(ComIrqReg);
  456.          i--;
  457.     }
  458.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  459.     ClearBitMask(BitFramingReg,0x80);
  460.               
  461.     if (i!=0)
  462.     {   
  463.          if(!(ReadRawRC(ErrorReg)&0x1B))
  464.          {
  465.              status = MI_OK;
  466.              if (n & irqEn & 0x01)
  467.              {   status = MI_NOTAGERR;   }
  468.              if (Command == PCD_TRANSCEIVE)
  469.              {
  470.                        n = ReadRawRC(FIFOLevelReg);
  471.                       lastBits = ReadRawRC(ControlReg) & 0x07;
  472.                 if (lastBits)
  473.                 {   *pOutLenBit = (n-1)*8 + lastBits;   }
  474.                 else
  475.                 {   *pOutLenBit = n*8;   }
  476.                 if (n == 0)
  477.                 {   n = 1;    }
  478.                 if (n > MAXRLEN)
  479.                 {   n = MAXRLEN;   }
  480.                 for (i=0; i<n; i++)
  481.                 {   pOutData[ i] = ReadRawRC(FIFODataReg);    }
  482.             }
  483.          }
  484.          else
  485.          {   status = MI_ERR;   }

  486.    }


  487.    SetBitMask(ControlReg,0x80);           // stop timer now
  488.    WriteRawRC(CommandReg,PCD_IDLE);
  489.    return status;
  490. }

  491. //開啟天線  
  492. //每次啟動(dòng)或關(guān)閉天險(xiǎn)發(fā)射之間應(yīng)至少有1ms的間隔
  493. void PcdAntennaOn()
  494. {
  495.     unsigned char i;
  496.     i = ReadRawRC(TxControlReg);
  497.     if (!(i & 0x03))
  498.     {
  499.         SetBitMask(TxControlReg, 0x03);
  500.     }
  501. }

  502. //關(guān)閉天線
  503. void PcdAntennaOff()
  504. {
  505.     ClearBitMask(TxControlReg, 0x03);
  506. }

  507. //等待離開
  508. void WaitCardOff(void)
  509. {
  510.         char          status;
  511.   unsigned char        TagType[2];

  512.         while(1)
  513.         {
  514.                 status = PcdRequest(REQ_ALL, TagType);
  515.                 if(status)
  516.                 {
  517.                         status = PcdRequest(REQ_ALL, TagType);
  518.                         if(status)
  519.                         {
  520.                                 status = PcdRequest(REQ_ALL, TagType);
  521.                                 if(status)
  522.                                 {
  523.                                         return;
  524.                                 }
  525.                         }
  526.                 }
  527.                 delay_10ms(10);
  528.         }
  529. }

  530. // Delay 10ms
  531. void delay_10ms(unsigned int _10ms)
  532. {
  533.         unsigned int i, j;

  534.         for(i=0; i<_10ms; i++)
  535.         {
  536.                 for(j=0; j<60000; j++);
  537.         }
  538. }

  539. ///////////////////////以上為RC522驅(qū)動(dòng)函數(shù)/////////////////////////
  540. ///////////////////////以上為RC522驅(qū)動(dòng)函數(shù)/////////////////////////
  541. ///////////////////////以上為RC522驅(qū)動(dòng)函數(shù)/////////////////////////


  542. //RFID模塊初始化
  543. void RFID_Init(void)                                                                        
  544. {
  545.         PcdInit();                                                                                                //RC522端口定義
  546.     PcdReset();                                                                                                //復(fù)位RC522
  547.     PcdAntennaOff();                                                                                  //關(guān)天線                 
  548.     PcdAntennaOn();                                                                                  //開天線
  549.         M500PcdConfigISOType('A');
  550. }

  551. //獲取編號(hào)函數(shù),返回編號(hào)1-3,非系統(tǒng)錄入返回0,沒有識(shí)別到返回5或6
  552. uint8_t Rc522Test(void)                                                                                
  553. {
  554.         uint8_t cardno;
  555.         if (PcdRequest(REQ_ALL, Temp) == MI_OK)//尋
  556.         {
  557.                 if (PcdAnticoll(UID) == MI_OK)//防沖撞
  558.                 {
  559.                         cardno=0;        
  560.                         if(UID[0]==UI0[0]&&UID[1]==UI0[1]&&UID[2]==UI0[2]&&UID[3]==UI0[3])
  561.                         {
  562.                                 cardno=1;
  563.                         }
  564.                         else if(UID[0]==UI1[0]&&UID[1]==UI1[1]&&UID[2]==UI1[2]&&UID[3]==UI1[3])
  565.                         {
  566.                                 cardno=2;
  567.                         }
  568.                         else if(UID[0]==UI2[0]&&UID[1]==UI2[1]&&UID[2]==UI2[2]&&UID[3]==UI2[3])
  569.                         {
  570.                                 cardno=3;
  571.                         }
  572.                         else if(UID[0]==UI3[0]&&UID[1]==UI3[1]&&UID[2]==UI3[2]&&UID[3]==UI3[3])
  573.                         {
  574.                                 cardno=4;
  575.                         }
  576.                         else cardno = 0;
  577.                 }
  578.                 else cardno = 5;
  579.         }
  580.         else cardno = 6;
  581.         return cardno;
  582. }
復(fù)制代碼


原理圖: 無
仿真: 無
代碼: NFC門禁系統(tǒng).zip (332.47 KB, 下載次數(shù): 19)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久伊人影院 | 亚洲综合久久网 | 欧美日韩精品在线一区 | 红桃成人在线 | 久久精品二区 | 久久免费精品 | 久久久精品一区二区三区 | 国产中文字幕网 | 成人在线观看网址 | 久久青青| 亚洲国产成人精品久久 | 99热成人在线| 欧美成人手机视频 | 国产精品99久久久久久动医院 | av在线播放不卡 | 欧美三级成人理伦 | 久久久一二三区 | 久久精品国产免费一区二区三区 | 久久天堂| 日本一区二区影视 | 中国黄色在线视频 | 992人人草 | 久热久草 | 午夜男人的天堂 | 欧美日韩在线一区二区 | 欧美一区二不卡视频 | 久久国产精品色av免费观看 | 超碰97免费 | 完全免费在线视频 | 亚洲一区二区三 | 午夜av电影 | 日日干日日操 | 99福利视频 | 最新超碰| 国产免费黄网 | 中文字幕在线观看一区二区 | 久久免费高清视频 | 亚洲入口| 国产免费播放视频 | 色综合久| 韩国主播午夜大尺度福利 |