STM32智能门锁学习二,RFID刷卡解锁

目录

效果如图:

cube配置:

代码部分:


个人认为,这个比之前的按键解锁和蓝牙好玩哈哈哈哈==

效果如图:

首先,这个模块叫做RFID RC522射频模块,上面一共有8个引脚,其中IRQ引脚保持悬空即可,我们只需要接另外7个引脚。SDA引脚为数据接口,SCK引脚为时钟接口,MOSI引脚为SPI接口主出从入,MISO引脚为SPI接口主入从出,GND接地,RST为复位信号,3.3V接单片机3.3V。

 

SPI的时序

这里涉及到SPI通讯协议,参考: (41条消息) SPI协议详解(图文并茂+超详细)_小麦大叔的博客-CSDN博客_spi协议

cube配置:

使能SPI功能,模式选择>Full-Duplex Master 全双工。

代码部分:

定义两个数组,一个是用来读取的卡号,一个存放自己正确的卡号,要想知道自己的卡号可以手机上下载一个软件NFC Writer可以读取自己卡片的信息,然后将其写入数组用于判断。

 /* USER CODE BEGIN 1 */
	uint8_t readUid[5]; 
	uint8_t UID[5]={0x43,0x58,0x36,0x84};//自己的卡号
  /* USER CODE END 1 */

进行RC522初始化

/* USER CODE BEGIN 2 */
   MFRC_Init();
   PCD_Reset();
   printf("RC522初始化成功\r\n");
  /* USER CODE END 2 */

void MFRC_Init(void)
{
    RS522_NSS(1);
    RS522_RST(1);
}

void PCD_Reset(void)//PCD复位
{
    /*硬复位*/
    RS522_RST(1);//用到复位引脚
    osDelay(2);
    RS522_RST(0);
    osDelay(2);
    RS522_RST(1);
    osDelay(2);

    /*软复位*/
    MFRC_WriteReg(MFRC_CommandReg, MFRC_RESETPHASE);
    osDelay(2);

    /*复位后的初始化配置*/
    MFRC_WriteReg(MFRC_ModeReg, 0x3D);              //CRC初始值0x6363
    MFRC_WriteReg(MFRC_TReloadRegL, 30);            //定时器重装值
    MFRC_WriteReg(MFRC_TReloadRegH, 0);
    MFRC_WriteReg(MFRC_TModeReg, 0x8D);             //定时器设置
    MFRC_WriteReg(MFRC_TPrescalerReg, 0x3E);        //定时器预分频值
    MFRC_WriteReg(MFRC_TxAutoReg, 0x40);            //100%ASK

    PCD_AntennaOff();                               //关天线
    osDelay(2);
    PCD_AntennaOn();                                //开天线
}

while(1)中进行卡号比对,然后正确干什么,错误干什么:

读取卡号函数:

uint8_t readCard(uint8_t *readUid,void(*funCallBack)(void))
{
	uint8_t Temp[5];
	if (PCD_Request(0x52, Temp) == 0)
	{
		if (PCD_Anticoll(readUid) == 0)
		{
			if(funCallBack != NULL)
				funCallBack();
			return 0;
		}	
	}
	return 1;
}
 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			if(!readCard(readUid,NULL)){
			printf("卡号:%x-%x-%x-%x\n",readUid[0],readUid[1],readUid[2],readUid[3]);
			if(!strncmp((char *)readUid,(char *)UID,4))
            {
			OLED_Clear();
			OLED_ShowCHinese(0,0,18); //卡
			OLED_ShowCHinese(20,0,19);//号
			OLED_ShowCHinese(40,0,10);//正
			OLED_ShowCHinese(60,0,11);//确
			OLED_ShowChar(80,0,'!',16);//!
				
			OLED_ShowCHinese(0,3,0); //门 
			OLED_ShowCHinese(20,3,1);//已
			OLED_ShowCHinese(40,3,4);//打
			OLED_ShowCHinese(60,3,5);//开
			OLED_ShowChar(80,3,'!',16);//!				
			}
			else
            {
			OLED_Clear();
			OLED_ShowCHinese(0,0,18); //卡
			OLED_ShowCHinese(20,0,19);//号
			OLED_ShowCHinese(40,0,8);//错
			OLED_ShowCHinese(60,0,9);//误
			OLED_ShowChar(80,0,'!',16);//!			
			}
		}
			HAL_Delay (500);
  }
  /* USER CODE END 3 */

 

/*PCD函数声明*/
void PCD_Init(void);
void PCD_Reset(void);
void PCD_AntennaOn(void);
void PCD_AntennaOff(void);
char PCD_Request(uint8_t RequestMode, uint8_t *pCardType);  //寻卡,并返回卡的类型
char PCD_Anticoll(uint8_t *pSnr);                           //防冲突,返回卡号
char PCD_Select(uint8_t *pSnr);                             //选卡
char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *pSnr); //验证密码(密码A和密码B)   
char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData);   //写数据
char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData);    //读数据
char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue);   
char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr);                                 
char PCD_Halt(void);
void StartIDcardTask(void const * argument);

  • 2
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值