找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1916|回复: 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)
回复

使用道具 举报

ID:1 发表于 2019-1-25 15:29 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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