标题:
基于stm32F103xxx与RFID-RC522的门禁程序
[打印本页]
作者:
沐浴
时间:
2021-1-4 20:37
标题:
基于stm32F103xxx与RFID-RC522的门禁程序
最近用到了RFID-RC522,找了很多资料,总结了一下 顺便和大家分享分享。 再本人的项目中RFID只是用来起到刷卡开门的效果,顺带用串口打印显示ID号。 需要的朋友自行下载。
RD
连线如下:
//SPI2_SCK PB13
//SPI2_MISO PB14
//SPI2_MOSI PB15
//RCC522_RST PC4
//RCC522_SDA PB0
//RCC522_IRQ 悬空(不管)
直接移植久好 驱动是全的
#include "rc522.h"
//SPI2_SCK PB13
//SPI2_MISO PB14
//SPI2_MOSI PB15
//RCC522_RST(CE) PC4
//RCC522_NSS(SDA)PB0
//RCC522_IRQ 悬空
void SPI2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE ); //PORTB时钟使能
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ); //SPI2时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PB0 RC522_CS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB0推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_0); //PB0上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PC4 RC522_RST
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOC
GPIO_SetBits(GPIOC,GPIO_Pin_4); //PC4
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
// SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
// SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第一个跳变沿(下降)数据被采样
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
//RC522 SPI通讯时钟周期最小为100ns 即频率最大为10MHZ
//RC522 数据在下降沿变化
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256、传输速率36M/256=140.625KHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI2, ENABLE); //使能SPI外设
RC522_CS=0;
SPI2_ReadWriteByte(0xaa);//启动传输
RC522_CS=1;
delay_ms(50);
PcdReset();//复位RC522读卡器
delay_ms(10);
PcdReset();//复位RC522读卡器
delay_ms(10);
PcdAntennaOff();//关闭天线发射
delay_ms(10);
PcdAntennaOn();//开启天线发射
printf("RFID-MFRC522 TEST\r\nFindCard Starting ...\r\n"); //测试引脚初始化完成
}
void delay_ns(u32 ns)
{
u32 i;
for(i=0;i<ns;i++)
{
__nop();
__nop();
__nop();
}
}
/***************************************************************************
- 功能描述:STM32f103 SPI读写字节函数
- 隶属模块:STM32 SPI操作
- 函数属性:外部,使用户使用
- 参数说明:TxData:要写入的字节
- 返回说明:读取到的字节
- 函数说明:由于主机SPI通信时,在发送和接受时是同时进行的,即发送完了一个字节的数据后,也应当接受到一个字节的数据
(1)stm32先等待已发送的数据是否发送完成,如果没有发送完成,并且进入循环200次,则表示发送错误,返回收到的值为0;
(2)如果发送完成,stm32从SPI1总线发送TxData
(3)stm32再等待接收的数据是否接收完成,如果没有接收完成,并且进入循环200次,则表示接收错误,则返回值0
(4)如果接收完成了,则返回STm32读取的最新的数据
stm32
------->等待已发送的数据是否完成
OK
------->
stm32发送数据
------->等待待接收的数据是否完成
OK
------->
stm32读取数据
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
***************************************************************************/
char SPI2_ReadWriteByte(u8 TxData)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
;
}
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
// retry++;
// if(retry>200)return 0;
;
}
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
}
// u8 SPI2_ReadWriteByte(u8 Byte)
// {
// while((SPI2->SR&0X02)==0); //等待发送区空
// SPI2->DR=Byte; //发送一个byte
// while((SPI2->SR&0X01)==0); //等待接收完一个byte
// return SPI2->DR; //返回收到的数据
// }
//******************************************************************/
//功 能:读RC522寄存器
//参数说明:Address[IN]:寄存器地址
//返 回:读出的值
//******************************************************************/
unsigned char ReadRawRC(unsigned char Address)
{
u8 ucAddr;
u8 ucResult=0;
RC522_CS=0;
delay_us(10);
ucAddr = ((Address<<1)&0x7E)|0x80;
SPI2_ReadWriteByte(ucAddr);
delay_us(10);
ucResult=SPI2_ReadWriteByte(0);
delay_us(10);
RC522_CS=1;
return ucResult;
}
//******************************************************************/
//功 能:写RC522寄存器
//参数说明:Address[IN]:寄存器地址
// value[IN]:写入的值
//******************************************************************/
void WriteRawRC(unsigned char Address, unsigned char value)
{
u8 ucAddr;
RC522_CS=0;
delay_us(10);
ucAddr = ((Address<<1)&0x7E) ;
SPI2_ReadWriteByte(ucAddr);
delay_us(10);
SPI2_ReadWriteByte(value);
delay_us(10);
RC522_CS=1;
}
//******************************************************************/
//功 能:置RC522寄存器位
//参数说明:reg[IN]:寄存器地址
// mask[IN]:置位值
//******************************************************************/
void SetBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0 ;
tmp = ReadRawRC(reg)| mask;
WriteRawRC(reg,tmp | mask); // set bit mask
}
//******************************************************************/
//功 能:清RC522寄存器位
//参数说明:reg[IN]:寄存器地址
// mask[IN]:清位值
//******************************************************************/
void ClearBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x0 ;
tmp = ReadRawRC(reg)&(~mask);
WriteRawRC(reg, tmp) ; // clear bit mask
}
//******************************************************************/
//功 能:复位RC522
//返 回: 成功返回MI_OK
//******************************************************************/
char PcdReset()
{
RC522_RST=1; ;
delay_ns(10) ;
RC522_RST=0; ;
delay_ns(100) ;
RC522_RST=1; ;
delay_ns(10) ;
WriteRawRC(CommandReg,PCD_RESETPHASE);
delay_ns(100) ;
WriteRawRC(ModeReg,0x3D) ;//定义发送和接收常用模式 和Mifare卡通讯,CRC初始值0x6363
WriteRawRC(TReloadRegL,30) ;//16位定时器低位 30
WriteRawRC(TReloadRegH,0) ;//16位定时器高位
WriteRawRC(TModeReg,0x8D) ;//定义内部定时器的设置
WriteRawRC(TPrescalerReg,0x3E) ;//设置定时器分频系数
WriteRawRC(TxASKReg,0x40) ;//调制发送信号为100%ASK
return MI_OK ;
}
//////////////////////////////////////////////////////////////////////
//设置RC522的工作方式
//////////////////////////////////////////////////////////////////////
char MF522PcdConfigISOType(unsigned char type)
{
if (type == 'A') //ISO14443_A
{
ClearBitMask(Status2Reg,0x08); //状态2寄存器
WriteRawRC(ModeReg,0x3D); //3F //和Mifare卡通讯,CRC初始值0x6363
WriteRawRC(RxSelReg,0x86); //84 选择内部接收器设置,内部模拟部分调制信号,发送数据后,延迟6个位时钟,接收
WriteRawRC(RFCfgReg,0x7F); //4F 配置接收器 48dB最大增益
WriteRawRC(TReloadRegL,30); //tmoLength);TReloadVal = 'h6a =tmoLength(dec)
WriteRawRC(TReloadRegH,0); //实际值是OXD3E 这部分主要是设置定时器寄存器
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
delay_ns(1000);
PcdAntennaOn();
}
else {return 0xFE;}
return MI_OK;
}
//******************************************************************/
//开启天线发射
//每次启动或关闭天险发射之间应至少有1ms的间隔
//******************************************************************/
void PcdAntennaOn()
{
unsigned char i;
WriteRawRC(TxASKReg,0x40) ;
delay_us(10) ;
i = ReadRawRC(TxControlReg) ;
if(!(i&0x03))
SetBitMask(TxControlReg, 0x03);
i=ReadRawRC(TxASKReg) ;
}
//******************************************************************/
//关闭天线发射
//******************************************************************/
void PcdAntennaOff()
{
ClearBitMask(TxControlReg, 0x03);
}
//******************************************************************/
//功 能:通过RC522和ISO14443卡通讯
//参数说明:Command[IN]:RC522命令字
// pInData[IN]:通过RC522发送到卡片的数据
// InLenByte[IN]:发送数据的字节长度
// pOutData[OUT]:接收到的卡片返回数据
// *pOutLenBit[OUT]:返回数据的位长度
//******************************************************************/
char PcdComMF522(unsigned char Command ,unsigned char *pInData ,
unsigned char InLenByte,unsigned char *pOutData,
unsigned int *pOutLenBit )
{
char status = MI_ERR ;
unsigned char irqEn = 0x00 ;
unsigned char waitFor = 0x00 ;
unsigned char lastBits ;
unsigned char n ;
unsigned int i ;
switch (Command)
{
case PCD_AUTHENT:
irqEn = 0x12 ;
waitFor = 0x10 ;
break ;
case PCD_TRANSCEIVE:
irqEn = 0x77 ;
waitFor = 0x30 ;
break ;
default:
break ;
}
WriteRawRC(ComIEnReg,irqEn|0x80) ; //
ClearBitMask(ComIrqReg,0x80) ;
WriteRawRC(CommandReg,PCD_IDLE) ;
SetBitMask(FIFOLevelReg,0x80) ; // 清空FIFO
for(i=0; i<InLenByte; i++)
WriteRawRC(FIFODataReg,pInData[i]) ; // 数据写入FIFO
WriteRawRC(CommandReg, Command) ; // 命令写入命令寄存器
if(Command == PCD_TRANSCEIVE)
SetBitMask(BitFramingReg,0x80) ; // 开始发送
i = 6000 ; //根据时钟频率调整,操作M1卡最大等待时间25ms
do
{
n = ReadRawRC(ComIrqReg) ;
i-- ;
}
while((i!=0)&&!(n&0x01)&&!(n&waitFor)) ;
ClearBitMask(BitFramingReg,0x80) ;
if(i!=0)
{
if(!(ReadRawRC(ErrorReg)&0x1B))
{
status = MI_OK ;
if (n&irqEn&0x01)
status = MI_NOTAGERR ;
if(Command==PCD_TRANSCEIVE)
{
n = ReadRawRC(FIFOLevelReg) ;
lastBits = ReadRawRC(ControlReg)&0x07 ;
if(lastBits)
*pOutLenBit = (n-1)*8 + lastBits ;
else
*pOutLenBit = n*8 ;
if(n==0)
n = 1 ;
if(n>MAXRLEN)
n = MAXRLEN ;
for (i=0; i<n; i++)
pOutData[i] = ReadRawRC(FIFODataReg) ;
}
}
else
status = MI_ERR ;
}
SetBitMask(ControlReg,0x80) ;// stop timer now
WriteRawRC(CommandReg,PCD_IDLE) ;
return status;
}
//******************************************************************/
//功 能:寻卡 /
//参数说明: req_code[IN]:寻卡方式 /
// 0x52 = 寻感应区内所有符合14443A标准的卡 /
// 0x26 = 寻未进入休眠状态的卡 /
// pTagType[OUT]:卡片类型代码 /
// 0x4400 = Mifare_UltraLight /
// 0x0400 = Mifare_One(S50) /
// 0x0200 = Mifare_One(S70) /
// 0x0800 = Mifare_Pro(X) /
// 0x4403 = Mifare_DESFire /
//返 回: 成功返回MI_OK /
//******************************************************************/
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char status ;
unsigned int unLen ;
unsigned char ucComMF522Buf[MAXRLEN] ;
ClearBitMask(Status2Reg,0x08) ;//清除MRCrypto1on,要用软件清零
WriteRawRC(BitFramingReg,0x07) ;//startsend=0,rxalign=0,在FIFO中存放的位置,TXlastbit=7
SetBitMask(TxControlReg,0x03) ;//TX2rfen=1,TX1RFen=1,传递调制的13.56MHZ的载波信号
ucComMF522Buf[0] = req_code ;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen );
if ((status == MI_OK) && (unLen == 0x10))
{
*pTagType = ucComMF522Buf[0] ;
*(pTagType+1) = ucComMF522Buf[1] ;
}
else
status = MI_ERR ;
return status ;
}
//******************************************************************/
//功 能:防冲撞 /
//参数说明: pSnr[OUT]:卡片序列号,4字节 /
//返 回: 成功返回MI_OK /
//******************************************************************/
char PcdAnticoll(unsigned char *pSnr)
{
char status;
unsigned char i,snr_check=0;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);//清除MRCrypto1on,要用软件清零
WriteRawRC(BitFramingReg,0x00);//表示最后一个字节所有位都发送
ClearBitMask(CollReg,0x80);//CollRegCollReg0冲突结束后冲突位被置零
ucComMF522Buf[0] = PICC_ANTICOLL1;
ucComMF522Buf[1] = 0x20;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
if (status == MI_OK)
{
for (i=0; i<4; i++)
{
*(pSnr+i) = ucComMF522Buf[i];
snr_check ^= ucComMF522Buf[i];
}
if (snr_check != ucComMF522Buf[i])
{ status = MI_ERR; }
}
SetBitMask(CollReg,0x80);//CollRegCollReg 在106kbps良好的防冲突情况下该位置1
return status;
}
/////////////////////////////////////////////////////////////////////
//功 能:选定卡片
//参数说明: pSnr[IN]:卡片序列号,4字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdSelect(unsigned char *pSnr)
{
char status;
unsigned char i;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_ANTICOLL1;
ucComMF522Buf[1] = 0x70;
ucComMF522Buf[6] = 0;
for (i=0; i<4; i++)
{
ucComMF522Buf[i+2] = *(pSnr+i);
ucComMF522Buf[6] ^= *(pSnr+i);
}
CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
ClearBitMask(Status2Reg,0x08);//清零MFcryon
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x18))
{ status = MI_OK; }
else
{ status = MI_ERR; }
return status;
}
//******************************************************************/
//功 能:验证卡片密码
//参数说明: auth_mode[IN]: 密码验证模式
// 0x60 = 验证A密钥
// 0x61 = 验证B密钥
// addr[IN]:块地址
// pKey[IN]:密码
// pSnr[IN]:卡片序列号,4字节
//返 回: 成功返回MI_OK
//******************************************************************/
char PcdAuthState(unsigned char auth_mode,unsigned char addr,
unsigned char *pKey,unsigned char *pSnr )
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = auth_mode;//验证A密钥
ucComMF522Buf[1] = addr;//addr[IN]:块地址
for (i=0; i<6; i++)
{ ucComMF522Buf[i+2] = *(pKey+i); }
for (i=0; i<6; i++)
{ ucComMF522Buf[i+8] = *(pSnr+i); }
status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
{ status = MI_ERR; }
return status;
}
//******************************************************************/
//功 能:读取M1卡一块数据
//参数说明: addr[IN]:块地址
// pData[OUT]:读出的数据,16字节
//返 回: 成功返回MI_OK
//******************************************************************/
char PcdRead(unsigned char addr,unsigned char *pData)
{
char status ;
unsigned int unLen ;
unsigned char i,ucComMF522Buf[MAXRLEN] ;
ucComMF522Buf[0] = PICC_READ ;
ucComMF522Buf[1] = addr ;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]) ;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,
ucComMF522Buf,&unLen );
if ((status == MI_OK) && (unLen == 0x90))
{
for (i=0; i<16; i++)
*(pData+i) = ucComMF522Buf[i];
}
else
status = MI_ERR;
return status;
}
//******************************************************************/
//功 能:读取M1卡一块数据
//参数说明: addr[IN]:块地址
// pData[OUT]:读出的数据,16字节
//返 回: 成功返回MI_OK
//******************************************************************/
char Read_Block(unsigned char Block,unsigned char *Buf)
{
char result ;
result = PcdAuthState(0x60,Block,Password_Buffer,UID) ;
if(result!=MI_OK)
return result ;
result = PcdRead(Block,Buf) ;
// return result; // 2011.01.03
if(result!=MI_OK) return result ;
if(Block!=0x00&&des_on)
{
// Des_Decrypt((char *)Buf ,KK,(char *)Buf ) ;
// Des_Decrypt((char *)&Buf[8],KK,(char *)&Buf[8]) ;
}
return SUCCESS ;
}
//******************************************************************/
//功 能:写数据到M1卡一块
//参数说明: addr[IN]:块地址
// pData[IN]:写入的数据,16字节
//返 回: 成功返回MI_OK
//******************************************************************/
char PcdWrite(unsigned char addr,unsigned char *pData)
{
char status ;
unsigned int unLen ;
unsigned char i,ucComMF522Buf[MAXRLEN] ;
ucComMF522Buf[0] = PICC_WRITE ;
ucComMF522Buf[1] = addr ;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]) ;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,
ucComMF522Buf,&unLen ) ;
if( ( status != MI_OK)||(unLen != 4)
||((ucComMF522Buf[0]&0x0F)!= 0x0A))
status = MI_ERR ;
if (status == MI_OK)
{
for (i=0; i<16; i++)
ucComMF522Buf[i] = *(pData+i) ;
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]) ;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,
18,ucComMF522Buf,&unLen ) ;
if( (status != MI_OK)||(unLen != 4 )
||((ucComMF522Buf[0]&0x0F)!= 0x0A))
status = MI_ERR ;
}
return status ;
}
//******************************************************************/
//功 能:写数据到M1卡一块
//参数说明: addr[IN]:块地址
// pData[IN]:写入的数据,16字节
//返 回: 成功返回MI_OK
//******************************************************************/
//******************************************************************/
//用MF522计算CRC16函数
//******************************************************************/
void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
{
unsigned char i,n;
ClearBitMask(DivIrqReg,0x04);
WriteRawRC(CommandReg,PCD_IDLE);//取消当前命令
SetBitMask(FIFOLevelReg,0x80);//FlushBuffer 清除ErrReg 的标志位
for (i=0; i<len; i++)
{ WriteRawRC(FIFODataReg, *(pIndata+i)); }
WriteRawRC(CommandReg, PCD_CALCCRC);
i = 0xFF;
do
{
n = ReadRawRC(DivIrqReg);
i--;
}
while ((i!=0) && !(n&0x04));//当CRCIRq所有数据被处理完毕该位置位
pOutData[0] = ReadRawRC(CRCResultRegL);//显示计算出来的CRC值
pOutData[1] = ReadRawRC(CRCResultRegM);
}
//==============================================================================
//读取卡的类型
//读取卡的ID号
// 卡片:12AAD52D
// 卡环:EC838322
//==============================================================================
void ReaderCard(void)
{
char temp_value;
if(PcdRequest(PICC_REQALL,Temp)==MI_OK) //选卡
{
if(Temp[0]==0x04&&Temp[1]==0x00)
printf("MFOne-S50");
else if(Temp[0]==0x02&&Temp[1]==0x00)
printf("MFOne-S70");
else if(Temp[0]==0x44&&Temp[1]==0x00)
printf("MF-UltraLight");
else if(Temp[0]==0x08&&Temp[1]==0x00)
printf("MF-Pro");
else if(Temp[0]==0x44&&Temp[1]==0x03)
printf("MF Desire");
else
printf("Unknown");
if(PcdAnticoll(UID)==MI_OK) //防冲撞
{
printf("Card Id is:");
/* 获取卡值 */
Uart1_SendHexDisplay(UID[0]);
Uart1_SendHexDisplay(UID[1]);
Uart1_SendHexDisplay(UID[2]);
Uart1_SendHexDisplay(UID[3]);
printf("\r\n"); //发送换行指令
temp_value = ((UID[0]>>4)*10+(UID[0]&0x0f));
printf("管理员:%d\r\n",temp_value);
// switch(temp_value)
// {
// case 12 : printf("管理员:%d\r\n",temp_value); break;
// case 152: printf("学生 :%d\r\n",temp_value); break;
// default : printf("无效卡:%d\r\n",temp_value); break;
// }
}
}
}
复制代码
全部程序51hei下载地址:
RFID_RC522.7z
(195.99 KB, 下载次数: 395)
2021-1-4 21:41 上传
点击文件名下载附件
已经调试
下载积分: 黑币 -5
作者:
quzhihong
时间:
2021-1-27 14:54
感谢老铁,资料非常好。谢谢了
作者:
杀死比亚
时间:
2021-2-7 10:59
很不错,在网上很少有直接移植,就能成功程序,楼主的很不错,烧录好以后就能直接用
作者:
fxx1369
时间:
2021-2-19 10:10
太感谢了,驱动移植很方便
作者:
uuuiii66
时间:
2021-4-27 01:22
楼主您好,我怎么找不到Uart1_SendHexDisplay这个函数的定义。您能告诉我吗?
作者:
zgt1480
时间:
2022-3-24 15:09
我想知道实物实现需要买什么硬件,或者说识别模块
作者:
耿晓峰
时间:
2022-10-18 13:49
楼主的很不错,烧录好以后就能直接用
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1