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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

金龍STM32F107 RFID MFRC522源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:391361 發表于 2019-1-25 12:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
RFID MFRC522資料

單片機源程序如下:
  1. #include "rc522.h"
  2. #include "SPI.h"
  3. #include "stm32f10x.h"
  4. #include "delay.h"
  5. #include <string.h>
  6. #include <stdio.h> //sprintf頭文件
  7. #include "hw_config.h"

  8.                                                                                                          /*************************************
  9.                                                                                                          *  使用SPI與RC522通信
  10.                                                                                                          *
  11.                                                                                                          *
  12.                                                                                                          **************************************/

  13. /********************************************************************************
  14. *函數功能:SPI發送數據
  15. *參數:待發送的數據
  16. *返回值:無
  17. *
  18. **********************************************************************************/
  19. void RC522_Send(u8 byte)
  20. {
  21.     u8 counter;

  22.     for(counter=0;counter<8;counter++)
  23.     {     
  24.                         if ( byte & 0x80 )
  25.                                         RC522_MOSI_H();
  26.                         else
  27.                                         RC522_MOSI_L();
  28.                         Delay_us(200);
  29.                         RC522_SCK_L();
  30.                         Delay_us(200);
  31.                         RC522_SCK_H();
  32.       Delay_us(200);
  33.                         byte <<= 1;
  34.     }
  35. }
  36. /*******************************************************************************************
  37. *函數功能:SPI讀函數
  38. *參數:無
  39. *返回值:讀到的數據
  40. *
  41. ********************************************************************************************/
  42. u8 RC522_Read( void )
  43. {
  44.         u8 counter;
  45.         u8 Data;
  46.         for(counter=0;counter<8;counter++)
  47.         {
  48.                         Data <<= 1;
  49.                         RC522_SCK_L();
  50.                   Delay_us(200);
  51.                         if (RC522_MISO_int() == 1)
  52.                         Data |= 0x01;
  53.       Delay_us(200);
  54.                         RC522_SCK_H();
  55.        Delay_us(200);         
  56.         }
  57.         return Data;
  58.        
  59. }
  60. /******************************************************************************************
  61. *函數功能:讀RC522寄存器
  62. *參數:address 寄存器的地址
  63. *返回值:寄存器的當前值
  64. *
  65. ******************************************************************************************/
  66. //用SPI讀RC522的數據格式是 0x msb(控制位 1位) 地址(6位) 日志(1位),
  67. //舉個例子 讀地址 0x0000 0110 的數據就要把他轉換成 0x1000 1100,首位1代表讀,0是寫,最后一位0是日志是規定。
  68. //隨意左移一位是確定地址,& 0x0111 1110(7e)的作用是保證此操作只有地址沒有變成奇奇怪怪的東西。然后 | 0x1000 0000 (80)就是確定第一位是1,也就是讀數據。
  69. //具體內容看官方的 《MFCR522數據手冊》 10.2 章節,中文文檔可能不太一樣
  70. u8 ReadRC(u8 address )
  71. {
  72.         u8 Addr, Return;       
  73.         Addr=((address<<1)&0x7E)|0x80;//變化成有效的地址形式,最低位為0,最高位為1時候是,從MFRC522讀出數據。
  74.         RC522_CS_Enable();       
  75.         RC522_Send(Addr);       
  76.         Return=RC522_Read();       
  77.         RC522_CS_Disable();               
  78.         return Return;       
  79. }


  80. /*******************************************************************************************
  81. *函數功能:寫RC522寄存器
  82. *參數:Addresss 寄存器的地址
  83.      Value 寫入寄存器的值
  84. *返回值:無
  85. *******************************************************************************************/
  86. void WriteRawRC(u8 Address,u8 Value)
  87. {  
  88.         u8 Addr;
  89.        
  90.         Addr =(Address<<1)&0x7E;//變化成有效的地址形式,最低位為0,最高位為0時候是,從MFRC522寫入數據。
  91.        
  92.         RC522_CS_Enable();
  93.        
  94.         RC522_Send(Addr);
  95.        
  96.         RC522_Send(Value);
  97.        
  98.         RC522_CS_Disable();               
  99. }
  100. /*******************************************************************************************
  101. *函數功能:對RC522寄存器置位
  102. *參數:Reg 寄存器的紙質
  103.            mask 置位的值
  104. *返回值:無
  105. *******************************************************************************************/
  106. void SetBitMask(u8 Reg,u8 Mask )  
  107. {
  108.         u8 Temp;

  109.         Temp=ReadRC(Reg);

  110.         WriteRawRC(Reg,Temp|Mask);         // set bit mask       
  111. }
  112. /*******************************************************************************************
  113. *函數功能:對RC522寄存器清零
  114. *參數:Reg RC522的地址
  115.       Mask 清零的數據
  116. *返回值:無
  117. *******************************************************************************************/
  118. //讀取寄存器reg,保存在temp中;
  119. //將mask取反后與temp的內容作與運算,運算結果寫回寄存器reg中;
  120. //mask取反后原先為1的位變0,為0的位變1,所以、與運算后temp中對應mask中最初為1的位就被清零。
  121. void ClearBitMask(u8 Reg,u8 Mask )  
  122. {
  123.         u8 Temp;

  124.         Temp=ReadRC(Reg);

  125.         WriteRawRC(Reg,Temp&(~Mask));  // clear bit mask
  126.        
  127. }
  128. /*******************************************************************************************
  129. *函數功能:開天線
  130. *參數:無
  131. *返回值:無
  132. *
  133. ********************************************************************************************/
  134. void PcdAntennaOn(void)
  135. {
  136.     u8 temp;
  137.        
  138.     temp=ReadRC(TxControlReg);
  139.        
  140.     if (!(temp&0x03))
  141.                         SetBitMask(TxControlReg,0x03);               
  142. }
  143. /*******************************************************************************************
  144. *函數功能:關閉天線
  145. *參數:無
  146. *返回值:
  147. *
  148. *******************************************************************************************/
  149. void PcdAntennaOff ( void )
  150. {
  151.   ClearBitMask(TxControlReg,0x03 );       
  152. }

  153. /*******************************************************************************************
  154. *函數功能:復位RC522
  155. *參數:無
  156. *返回值:無
  157. *
  158. *******************************************************************************************/
  159. void PcdReset(void)
  160. {
  161.         RC522_Reset_Disable();
  162.        
  163.         Delay_us(1);
  164.        
  165.         RC522_Reset_Enable();
  166.        
  167.         Delay_us(1);
  168.        
  169.         RC522_Reset_Disable();
  170.        
  171.         Delay_us(1);
  172.        
  173.         WriteRawRC(CommandReg,0x0f);
  174.        
  175.         while(ReadRC(CommandReg)&0x10);
  176.        
  177.         Delay_us(1);
  178.        
  179.   WriteRawRC(ModeReg, 0x3D );            //定義發送和接收常用模式 和Mifare卡通訊,CRC初始值0x6363
  180.        
  181.   WriteRawRC(TReloadRegL,30);          //16位定時器低位   
  182.         WriteRawRC(TReloadRegH,0);                             //16位定時器高位
  183.        
  184.   WriteRawRC(TModeReg,0x8D);                                   //定義內部定時器的設置
  185.        
  186.   WriteRawRC(TPrescalerReg,0x3E);                         //設置定時器分頻系數
  187.        
  188.         WriteRawRC(TxAutoReg,0x40);                                   //調制發送信號為100%ASK       
  189.        

  190. }

  191. /*******************************************************************************************
  192. *函數功能:設置RC522的工作方式
  193. *參數:CardType:工作方式
  194. *返回值:無
  195. *
  196. *******************************************************************************************/
  197. void M500PcdConfigISOType(u8 CardType)
  198. {
  199.         if (CardType== 'A')                     //ISO14443_A
  200.   {
  201.                 ClearBitMask(Status2Reg,0x08);
  202.                
  203.     WriteRawRC(ModeReg,0x3D);//3F
  204.                
  205.                 WriteRawRC(RxSelReg,0x86);//84
  206.                
  207.                 WriteRawRC(RFCfgReg,0x7F);   //4F
  208.                
  209.                 WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
  210.                
  211.                 WriteRawRC(TReloadRegH,0);
  212.                
  213.                 WriteRawRC(TModeReg,0x8D);
  214.                
  215.                 WriteRawRC(TPrescalerReg,0x3E);
  216.                
  217.                 Delay_us(2);
  218.                 PcdAntennaOn();//開天線
  219.                
  220.    }

  221.          
  222. }


  223. /*******************************************************************************************
  224. *函數功能:通過RC522和ISO14443卡通訊
  225. *參數:    Command,RC522的命令
  226. *         intData,RC522發送到卡片的數據
  227. *         intLen,發送數據的字節長度
  228. *         outData,接收到的卡片返回數據
  229. *         outLen,返回數據的長度
  230. *返回值:
  231. ********************************************************************************************/
  232. char PcdComMF522(u8 Command,u8 *intData,u8 intLen,u8 * Data,u32 * outLen )               
  233. {
  234.     char Status =Fault;
  235.     u8 IrqEn  = 0x00;
  236.     u8 WaitFor = 0x00;
  237.     u8 LastBits;
  238.     u8 N;
  239.     u32 L;

  240.     switch (Command)
  241.     {
  242.        case PCD_AUTHENT:                //Mifare認證
  243.           IrqEn=0x12;                //允許錯誤中斷請求ErrIEn  允許空閑中斷IdleIEn
  244.           WaitFor=0x10;                //認證尋卡等待時候 查詢空閑中斷標志位
  245.           break;
  246.                          
  247.        case PCD_TRANSCEIVE:                //接收發送 發送接收
  248.           IrqEn   = 0x77;                //允許TxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEn
  249.           WaitFor = 0x30;                //尋卡等待時候 查詢接收中斷標志位與 空閑中斷標志位
  250.           break;
  251.                          
  252.        default:
  253.          break;
  254.                          
  255.     }
  256.    
  257.     WriteRawRC( ComIEnReg,IrqEn|0x80);                //IRqInv置位管腳IRQ與Status1Reg的IRq位的值相反
  258.     ClearBitMask( ComIrqReg,0x80 );                        //Set1該位清零時,CommIRqReg的屏蔽位清零
  259.     WriteRawRC( CommandReg,PCD_IDLE );                //寫空閑命令
  260.     SetBitMask( FIFOLevelReg,0x80);                        //置位FlushBuffer清除內部FIFO的讀和寫指針以及ErrReg的BufferOvfl標志位被清除
  261.    
  262.     for (L= 0; L<intLen;L++ )
  263.                   WriteRawRC(FIFODataReg,Data [L]);                    //寫數據進FIFOdata
  264.                        
  265.     WriteRawRC(CommandReg,Command);                                        //寫命令
  266.    
  267.    
  268.     if (Command==PCD_TRANSCEIVE )
  269.                         SetBitMask(BitFramingReg,0x80);                                  //StartSend置位啟動數據發送 該位與收發命令使用時才有效
  270.    
  271.     L= 1000;//根據時鐘頻率調整,操作M1卡最大等待時間25ms
  272.                
  273.     do                                                                                                                 //認證 與尋卡等待時間       
  274.     {
  275.          N = ReadRC ( ComIrqReg );                                                        //查詢事件中斷
  276.          L--;
  277.     } while ((L!=0)&&(!(N&0x01))&&(!(N&WaitFor ) ) );                //退出條件i=0,定時器中斷,與寫空閑命令
  278.                
  279.     ClearBitMask ( BitFramingReg, 0x80 );                                        //清理允許StartSend位
  280.                
  281.     if (L!= 0 )
  282.     {
  283.                         if ( ! ( ReadRC ( ErrorReg ) & 0x1B ) )                        //讀錯誤標志寄存器BufferOfI CollErr ParityErr ProtocolErr
  284.                         {
  285.                                 Status =True ;
  286.                                
  287.                                 if ( N & IrqEn & 0x01 )                                        //是否發生定時器中斷
  288.                                   Status =Irq_falg ;   
  289.                                        
  290.                                 if (Command ==PCD_TRANSCEIVE )
  291.                                 {
  292.                                         N = ReadRC ( FIFOLevelReg );                        //讀FIFO中保存的字節數
  293.                                        
  294.                                         LastBits = ReadRC(ControlReg ) & 0x07;        //最后接收到得字節的有效位數
  295.                                        
  296.                                         if(LastBits )
  297.                                                 * outLen=(N - 1 )*8+LastBits;           //N個字節數減去1(最后一個字節)+最后一位的位數 讀取到的數據總位數
  298.                                         else
  299.                                                 *outLen=N * 8;                                           //最后接收到的字節整個字節有效
  300.                                        
  301.                                         if (N ==0)               
  302.             N = 1;   
  303.                                        
  304.                                         if (N >max)
  305.                                                 N =max;   
  306.                                        
  307.                                         for (L=0;L<N;L ++ )
  308.                                           Data[L] =ReadRC(FIFODataReg );   
  309.                                        
  310.                                         }
  311.                                        
  312.       }
  313.                        
  314.                         else
  315.                                 Status =Fault;   
  316.                        
  317.     }
  318.    
  319.    SetBitMask ( ControlReg, 0x80 );           // stop timer now
  320.    WriteRawRC ( CommandReg, PCD_IDLE );
  321.                  
  322.                
  323.    return Status;
  324.                
  325.                
  326. }


  327. /*******************************************************************************************
  328. *函數功能:尋卡
  329. *參數:Card_code,尋卡方式
  330. *                    = 0x52,尋感應區內所有符合14443A標準的卡
  331. *                     = 0x26,尋未進入休眠狀態的卡
  332. *        CardType,卡片類型代碼
  333. *                   = 0x4400,Mifare_UltraLight
  334. *                  = 0x0400,Mifare_One(S50)
  335. *                   = 0x0200,Mifare_One(S70)
  336. *                  = 0x0800,Mifare_Pro(X))
  337. *                   = 0x4403,Mifare_DESFire
  338. * 返回值:1 ,成功 0,失敗
  339. *******************************************************************************************/
  340. char PcdRequest ( u8 Req_code, u8 * CardType )
  341. {
  342.    char Status;  
  343.          u8 buffer[max];
  344.    u32 Len;
  345.        

  346.    ClearBitMask ( Status2Reg, 0x08 );        //清理指示MIFARECyptol單元接通以及所有卡的數據通信被加密的情況
  347.    WriteRawRC ( BitFramingReg, 0x07 );        //        發送的最后一個字節的 七位
  348.    SetBitMask ( TxControlReg, 0x03 );        //TX1,TX2管腳的輸出信號傳遞經發送調制的13.56的能量載波信號

  349.    buffer[0] =Req_code;                //存入 卡片命令字

  350.    Status = PcdComMF522(PCD_TRANSCEIVE,buffer,1,buffer,&Len );        //尋卡  
  351.   
  352.    if ((Status ==True)&&(Len == 0x10 ) )        //尋卡成功返回卡類型
  353.    {   
  354.        * CardType=buffer[0];
  355.        * (CardType+1)=buffer[1];
  356.    }
  357.          
  358.    else
  359.      Status =Fault;

  360.    return Status;
  361.        
  362. }


  363. /*******************************************************************************************
  364. *函數功能:防沖撞
  365. *參數:接收ID號緩沖區
  366. *返回值:1,成功,0,失敗
  367. *
  368. ********************************************************************************************/
  369. char PcdAnticoll ( u8 * Snr )
  370. {
  371.     char Status;
  372.     u8 uc, Snr_check = 0;
  373.     u8 buffer[max];
  374.           u32 Len;
  375.                   
  376.     ClearBitMask ( Status2Reg, 0x08 );                //清MFCryptol On位 只有成功執行MFAuthent命令后,該位才能置位
  377.     WriteRawRC ( BitFramingReg, 0x00);                //清理寄存器 停止收發
  378.     ClearBitMask ( CollReg, 0x80 );                        //清ValuesAfterColl所有接收的位在沖突后被清除
  379.    
  380.    buffer[ 0 ] = 0x93;        //卡片防沖突命令
  381.    buffer[ 1 ] = 0x20;
  382.    
  383.     Status =PcdComMF522(PCD_TRANSCEIVE,buffer, 2,buffer,&Len);//與卡片通信
  384.        
  385.     if (Status==True )                //通信成功
  386.     {
  387.                         for ( uc = 0; uc < 4; uc ++ )
  388.                         {
  389.          * ( Snr + uc )  = buffer[ uc ];                        //讀出UID
  390.          Snr_check ^= buffer[ uc ];
  391.       }
  392.                        
  393.       if ( Snr_check !=buffer[ uc ] )
  394.                                 Status =Fault;   
  395.                                  
  396.     }
  397.    
  398.     SetBitMask ( CollReg, 0x80 );
  399.                
  400.                
  401.     return Status;
  402.                
  403.                
  404. }


  405. /*******************************************************************************************
  406. 函數功能:用RC522計算CRC16
  407. 參數:intdata,計算CRC16的數組
  408.      Len,計算CRC16的數組字節長度
  409.       0utData,存放計算結果存放的首地址
  410. *返回值:無
  411. *******************************************************************************************/
  412. void CalulateCRC ( u8 * intData, u8 Len, u8 * outData )
  413. {
  414.           u8 k,j;
  415.        
  416.        
  417.     ClearBitMask(DivIrqReg,0x04);
  418.        
  419.     WriteRawRC(CommandReg,PCD_IDLE);
  420.        
  421.     SetBitMask(FIFOLevelReg,0x80);
  422.        
  423.     for (k= 0;k<Len;k++)
  424.             WriteRawRC ( FIFODataReg, * (intData +k) );   

  425.     WriteRawRC ( CommandReg, PCD_CALCCRC );
  426.        
  427.     k= 0xFF;
  428.        
  429.     do
  430.     {
  431.         j= ReadRC(DivIrqReg );
  432.         k--;
  433.     } while ( (k!= 0) && ! (j& 0x04 ) );
  434.                
  435.    outData[0] = ReadRC(CRCResultRegL);
  436.    outData[1] = ReadRC(CRCResultRegM);
  437.                
  438.                
  439. }


  440. /*******************************************************************************************
  441. 函數功能:選定卡片
  442. 參數:pSnr,卡片序列號,4字節
  443. *返回值: 1,成功,0,失敗
  444. *
  445. ********************************************************************************************/
  446. char PcdSelect ( u8 * pSnr )
  447. {
  448.     char ucN;
  449.     u8 uc;
  450.           u8 buffer[max];
  451.     u32  ulLen;
  452.    
  453.    
  454.     buffer[0] = PICC_ANTICOLL1;
  455.     buffer[1] = 0x70;
  456.     buffer[6] = 0;
  457.        
  458.     for ( uc = 0; uc < 4; uc ++ )
  459.     {
  460.             buffer[ uc + 2 ] = * ( pSnr + uc );
  461.             buffer[ 6 ] ^= * ( pSnr + uc );
  462.     }
  463.                
  464.     CalulateCRC (buffer, 7, &buffer[ 7 ] );
  465.   
  466.     ClearBitMask ( Status2Reg, 0x08 );

  467.     ucN = PcdComMF522 ( PCD_TRANSCEIVE,buffer, 9,buffer, & ulLen );
  468.    
  469.     if ( ( ucN ==True ) && ( ulLen == 0x18 ) )
  470.       ucN =True ;  
  471.     else
  472.       ucN =Fault;   

  473.                
  474.     return ucN;
  475.                
  476.                
  477. }
  478. /*******************************************************************************************
  479. *函數功能:驗證卡片密碼
  480. *參數:mode,密碼驗證模式
  481. *        0x60,驗證A密鑰
  482. *        0x61,驗證B密鑰
  483. *        u8 Addr,塊地址
  484. *        Key,密碼
  485. *        Str,卡片序列號,4字節
  486. *返回值: 1,成功,0,失敗
  487. *******************************************************************************************/
  488. char PcdAuthState ( u8 mode, u8 Addr, u8 * Key, u8 * str )
  489. {
  490.     char Status;
  491.           u8 uc, buffer[max];
  492.     u32 Len;
  493.    
  494.        
  495.     buffer[ 0 ] =mode;
  496.     buffer[ 1 ] = Addr;
  497.        
  498.     for ( uc = 0; uc < 6; uc ++ )
  499.            buffer[uc + 2 ] = * ( Key + uc );   
  500.        
  501.     for ( uc = 0; uc < 6; uc ++ )
  502.             buffer[ uc + 8 ] = * (str + uc );   

  503.     Status = PcdComMF522 ( PCD_AUTHENT,buffer, 12,buffer, &Len );
  504.        
  505.     if ( ( Status !=True ) || ( ! ( ReadRC ( Status2Reg ) & 0x08 ) ) )
  506.       Status =Fault;   
  507.    
  508.                
  509.     return Status;
  510.                
  511.                
  512. }


  513. /*******************************************************************************************
  514. *函數功能:寫數據到M1卡一塊
  515. *參數:u8 addr,塊地址
  516. *     Data,寫入的數據,16字節
  517. *返回值:1,成功,0,失敗
  518. *******************************************************************************************/
  519. char PcdWrite ( u8 addr, u8 * Data )
  520. {
  521.     char Status;
  522.           u8 uc,buffer[max];
  523.     u32 Len;
  524.      
  525.    
  526.     buffer[ 0 ] = PICC_WRITE;
  527.     buffer [ 1 ] =addr;
  528.        
  529.     CalulateCRC (buffer, 2, &buffer[ 2 ] );

  530.    Status = PcdComMF522 ( PCD_TRANSCEIVE,buffer, 4,buffer, & Len );

  531.     if ((Status != True  )||(Len!=4)||((buffer[ 0 ] & 0x0F ) != 0x0A ) )
  532.       Status =Fault;   
  533.         
  534.     if (Status==True  )
  535.     {
  536.                         //memcpy(ucComMF522Buf, pData, 16);
  537.       for ( uc = 0; uc < 16; uc ++ )
  538.                           buffer[uc] = * ( Data + uc );  
  539.                        
  540.       CalulateCRC ( buffer, 16, &buffer[ 16 ] );

  541.      Status = PcdComMF522 ( PCD_TRANSCEIVE,buffer, 18,buffer,&Len );
  542.                        
  543.                         if ( ( Status != True )||(Len !=4)||((buffer[0]&0x0F)!=0x0A))
  544.         Status =Fault;   
  545.                        
  546.     }
  547.                
  548.                
  549.     return Status;
  550.                
  551.                
  552. }


  553. /*******************************************************************************************
  554. *函數功能:讀取M1卡一塊數據
  555. *參數:u8 Aaddr,塊地址
  556. *         Data,讀出的數據,16字節
  557. *返回值:1,成功,0,失敗
  558. *
  559. ********************************************************************************************/
  560. char PcdRead (u8 addr,u8 *Data )
  561. {
  562.     char Status;
  563.           u8 L, buffer[max];
  564.     u32 Len;
  565.    

  566.     buffer[0]=PICC_READ;
  567.     buffer[1]=addr;
  568.        
  569.     CalulateCRC (buffer, 2, &buffer[ 2 ] );
  570.    
  571.     Status = PcdComMF522 ( PCD_TRANSCEIVE,buffer, 4,buffer,&Len );
  572.        
  573.     if ((Status==True  ) && (Len == 0x90 ) )
  574.     {
  575.                         for (L= 0; L< 16;L++ )
  576.         * (Data+L) = buffer[L];   
  577.     }
  578.                
  579.     else
  580.       Status =Fault;   
  581.    
  582.                
  583.     return Status;
  584.                        
  585. }
  586. /*******************************************************************************************
  587. *函數功能:命令卡片進入休眠狀態
  588. *參數:無
  589. *返回值:1,成功,0,失敗
  590. *
  591. ********************************************************************************************/
  592. char PcdHalt(void)
  593. {
  594.         u8 buffer[max];
  595.         u32  Len;
  596.   

  597.   buffer[0]=PICC_HALT;
  598.   buffer[1]=0;
  599.        
  600.   CalulateCRC (buffer, 2, &buffer[ 2 ] );
  601.         PcdComMF522(PCD_TRANSCEIVE,buffer, 4,buffer, &Len);

  602.   return True ;
  603.        
  604. }
  605. /****************************************************************************************************************
  606. *函數功能:RC522測試
  607. *參數:無
  608. *返回值:無
  609. ******************************************************************************************************************/

  610. void RC522_test(void)
  611. {
  612.         char Str[30];
  613.   u8 Card_ID[4];      
  614.        
  615.   while (1)
  616.   {
  617.                                              
  618.                   PcdRequest (PICC_REQALL, Card_ID); //尋卡                                                                 //若失敗再次尋卡

  619.                         if (PcdAnticoll(Card_ID)==True )                                                                   //防沖撞(當有多張卡進入讀寫器操作范圍時,防沖突機制會從其中選擇一張進行操作)
  620.                         {
  621.                                 sprintf(Str,"\r\n門禁卡的ID號: %02X%02X%02X%02X",Card_ID[0],Card_ID[1],Card_ID[2],Card_ID[3]);
  622.                        
  623.                                 printf ("%s\r\n",Str);                
  624.                                
  625.                         }
  626.                
  627.                
  628.   }
  629.        
  630. }
復制代碼

所有資料51hei提供下載:
金龍107RFID例程(20160721).7z (349.26 KB, 下載次數: 27)


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

使用道具 舉報

沙發
ID:1 發表于 2019-1-25 15:29 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男人的天堂一级片 | 日韩在线观看中文字幕 | 亚洲免费在线观看视频 | 成人精品一区二区 | 国产亚洲精品美女久久久久久久久久 | 色性av | 久久国产免费 | 日韩视频成人 | 1级毛片 | 日韩av黄色 | 黄色大片免费网站 | 国产精品久久久久久久久久久久冷 | 国产成人精品一区二区 | 国产精品久久久99 | 97人人澡人人爽91综合色 | 国产目拍亚洲精品99久久精品 | 国产偷久久一级精品60部 | 国产精产国品一二三产区视频 | 热99| 欧美日韩国产中文字幕 | 亚洲小视频在线观看 | 久久久精品视 | 国产高清久久 | 日韩淫片免费看 | 一级a性色生活片久久毛片 一级特黄a大片 | 久久高清| 午夜精品一区二区三区在线视 | 黑人巨大精品欧美一区二区免费 | 日本不卡一区二区三区 | 欧美在线色视频 | 免费观看毛片 | 麻豆changesxxx国产 | 日本久久久久久久久 | 日韩高清成人 | 91免费观看 | 亚洲精品第一国产综合野 | 98久久| 国产精品视频一区二区三区 | 91成人精品| 亚洲少妇综合网 | 免费观看色|