STM32RCT6+RC522+OLED,RFID课设制作一个门禁系统

STM32RCT6+RC522+OLED,刷卡显示卡号

暂时只做了这么多,后续会继续更新

完整版讲解链接

RFID课程设计–基于STM32F103RCT6的智能门禁系统

完整版工程文件下载链接

RFID课程设计工程文件,基于STM32F103RCT6的智能门禁系统
在这里插入图片描述



准备工作

准备左图的.c文件
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、RC522

在这里插入图片描述
在这里插入图片描述

二、OLED

在这里插入图片描述

三、主函数

关键代码的解释

		u8 UID_str[10] = {'0','0','0','0','0','0','0','0','\0',0};

		UID_str[0] = ((g_ucTempbuf[0]>>4)>9)	?(g_ucTempbuf[0]>>4)-10+'a'	:(g_ucTempbuf[0]>>4)+'0';
		UID_str[1] = ((g_ucTempbuf[0]&0x0f)>9)?(g_ucTempbuf[0]&0x0f)-10+'a':(g_ucTempbuf[0]&0x0f)+'0';
		UID_str[2] = ((g_ucTempbuf[1]>>4)>9)	?(g_ucTempbuf[1]>>4)-10+'a'	:(g_ucTempbuf[1]>>4)+'0';
		UID_str[3] = ((g_ucTempbuf[1]&0x0f)>9)?(g_ucTempbuf[1]&0x0f)-10+'a':(g_ucTempbuf[1]&0x0f)+'0';
		UID_str[4] = ((g_ucTempbuf[2]>>4)>9)	?(g_ucTempbuf[2]>>4)-10+'a'	:(g_ucTempbuf[2]>>4)+'0';
		UID_str[5] = ((g_ucTempbuf[2]&0x0f)>9)?(g_ucTempbuf[2]&0x0f)-10+'a':(g_ucTempbuf[2]&0x0f)+'0';
		UID_str[6] = ((g_ucTempbuf[3]>>4)>9)	?(g_ucTempbuf[3]>>4)-10+'a'	:(g_ucTempbuf[3]>>4)+'0';
		UID_str[7] = ((g_ucTempbuf[3]&0x0f)>9)?(g_ucTempbuf[3]&0x0f)-10+'a':(g_ucTempbuf[3]&0x0f)+'0';
		UID_str[9] = 1;

主要介绍这一块
因为我们的UID是4字节(比如:07 87 E8 76
我们主要用到OLED中的 void OLED_ShowChar(u8 x,u8 y,u8 chr); void OLED_ShowString(u8 x,u8 y, u8 *p); 两个函数
但两位16进制数是两个字符,我们需要分开显示在OLED屏幕上
这个时候我们就需要分为高位低位来显示
我们知道,MCU中只存储二进制数据
所以 0xE8 对应 二进制数 1110 1000
想得到高位我们需要把0xE8右移4位得到0x0E
想得到低位我们把0xE80x0f做与(&)运算,得到0x08
然后将四字节数据每字节的高低位放在UID_str数组中
UID_str数组的第九位为停止位,在OLED_ShowString函数中可以看到,继续打印字符串内容的前提是当前读到的地方不是'\0'
UID_str数组的第十位为标志位,当标志为0时不打印数组的内容,当标志为1时打印

if(UID_str[9] != 0)
OLED_ShowString(32,2,UID_str);

然后我们通过三目运算符运算,将数值转换成ASCII,当打印a、b、c......f时需要做一些变动
我们得到的数字可以当作偏移量,我们想输出8,就是用字符0的ASCII加上8
但我们输出b时,此时的偏移量为11,所以我们要先将偏移量减去10,在加上字符a的ASCII值,从而实现输出字符b的效果

在这里插入图片描述

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "rc522.h"
#include "led.h"
#include "key.h"
#include "exti.h" 
#include "bmp.h"
#include "oled.h"
#include "pwm.h"


/**
*   连线说明:
*   1--SDA  <----->PA4
*   2--SCK  <----->PA5
*   3--MOSI <----->PA7
*   4--MISO <----->PA6
*   5--悬空
*   6--GND <----->GND
*   7--RST <----->PB0
*   8--VCC <----->VCC
**/

unsigned char g_ucTempbuf[20];

int main(void)
{
	
	unsigned char status,i,j=0;
	unsigned int temp;
  u8 num = 0;
	u8 KEY_A[6]= {0xff,0xff,0xff,0xff,0xff,0xff};
	u8 data[16] = {0};
	u8 UID[4]= {0x49, 0xe0, 0x05, 0x98};
	u8 UID_str[10] = {'0','0','0','0','0','0','0','0','\0',0};
  delay_init();	    	 //延时函数初始化
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  uart_init(9600);	 //串口初始化为9600
  LED_Init();
  RC522_Init();       //初始化射频卡模块
	//KEY_Init();          	//初始化与按键连接的硬件接口
	
 	EXTIX_Init();		//外部中断初始化  
	//NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	LED_Init();			     //LED端口初始化
	OLED_Init();			//初始化OLED  
	OLED_Clear()  	; 
  LED0=0;				//点亮LED
//	TIM4_PWM_Init(199,7199);//不分频。PWM频率=72000/(899+1)=80Khz 
	
	delay_ms(3000);

	
	
	
	// UID为你要修改的卡的UID key_type:0为KEYA,非0为KEYB KEY为密钥 RW:1是读,0是写 data_addr为修改的地址 data为数据内容
	IC_RW ( UID, 0, KEY_A, 1, 0x10, data );
	
    while(1)
    {
			
			printf("\r\n开始 ");
			//寻卡中
			OLED_ShowString(0,0,"please put card          ");
			OLED_ShowString(0,2,"UID:");
			if(UID_str[9] != 0)
			OLED_ShowString(32,2,UID_str);
			status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
			printf(" %X ",status);
			if (status != MI_OK)
        {    
					PcdReset();
					PcdAntennaOff(); 
					PcdAntennaOn(); 
					continue;
				}		     
		 printf("\r\n卡的类型:");
	    for(i=0;i<2;i++)
		{
			temp=g_ucTempbuf[i];
			printf("%X",temp);
			
		}	
         status = PcdAnticoll(g_ucTempbuf);//防冲撞
         if(status != MI_OK)
         {    continue;    }
				 printf("\r\n卡序列号:");	//终端显示
				 
		for(i=0;i<4;i++)
		{
			temp=g_ucTempbuf[i];
			printf("%X ",temp);
			
		}
		UID_str[0] = ((g_ucTempbuf[0]>>4)>9)	?(g_ucTempbuf[0]>>4)-10+'a'	:(g_ucTempbuf[0]>>4)+'0';
		UID_str[1] = ((g_ucTempbuf[0]&0x0f)>9)?(g_ucTempbuf[0]&0x0f)-10+'a':(g_ucTempbuf[0]&0x0f)+'0';
		UID_str[2] = ((g_ucTempbuf[1]>>4)>9)	?(g_ucTempbuf[1]>>4)-10+'a'	:(g_ucTempbuf[1]>>4)+'0';
		UID_str[3] = ((g_ucTempbuf[1]&0x0f)>9)?(g_ucTempbuf[1]&0x0f)-10+'a':(g_ucTempbuf[1]&0x0f)+'0';
		UID_str[4] = ((g_ucTempbuf[2]>>4)>9)	?(g_ucTempbuf[2]>>4)-10+'a'	:(g_ucTempbuf[2]>>4)+'0';
		UID_str[5] = ((g_ucTempbuf[2]&0x0f)>9)?(g_ucTempbuf[2]&0x0f)-10+'a':(g_ucTempbuf[2]&0x0f)+'0';
		UID_str[6] = ((g_ucTempbuf[3]>>4)>9)	?(g_ucTempbuf[3]>>4)-10+'a'	:(g_ucTempbuf[3]>>4)+'0';
		UID_str[7] = ((g_ucTempbuf[3]&0x0f)>9)?(g_ucTempbuf[3]&0x0f)-10+'a':(g_ucTempbuf[3]&0x0f)+'0';
		UID_str[9] = 1;
		//OLED_ShowString(0,2,UID_str);

		RC522_Handle();
		
		
		
		
/*		if(g_ucTempbuf[0]==0x07&&g_ucTempbuf[1]==0x87&&g_ucTempbuf[2]==0xE8&&g_ucTempbuf[3]==0x76)		//0787E876,4396C597,83B062C9
		{
			printf("\r\nDoor Opened.\r\n");
			delay_ms(2000);
		}
		else
		{	
			printf("\r\nThe illegal card!\r\n");
			delay_ms(2000);
		}
*/
		// 重要提醒,写卡操作有风险,请勿随意尝试,不能保证程序安全性,本人对任何程序问题概不负责,不限于由任何程序错误导致的任何损失或损害
		// 测试程序0,完成addr读写读
    // RC522_Handle();
		// 谨慎使用 测试程序1,完成0x0F块 验证KEY_A、KEY_B 读 写RFID1 验证KEY_A1、KEY_B1 读 写RFID2
		// RC522_Handle1();

        if(num % 20 == 0)
            LED0 = !LED0;
        num++;
    }
}





最终效果

刷卡之后显示卡的UID
在这里插入图片描述

完整版讲解链接

RFID课程设计–基于STM32F103RCT6的智能门禁系统

完整版工程文件下载链接

RFID课程设计工程文件,基于STM32F103RCT6的智能门禁系统

  • 13
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 51
    评论
您好!对于使用STM32F103RCT6RFID-RC522的示例程序,您可以参考以下步骤: 1. 首先,确保您已经配置好STM32F103RCT6的开发环境,包括安装好Keil MDK软件和相应的STM32Cube库。 2. 下载并安装RFID-RC522的库文件。您可以在GitHub或其他资源网站上找到适用于STM32RFID-RC522库。确保选择与您的开发环境兼容的版本。 3. 创建一个新的Keil项目,并配置正确的芯片型号(STM32F103RCT6)和时钟设置。 4. 将RFID-RC522库文件添加到您的项目中。将库文件中提供的源代码和头文件复制到您的项目目录中,并在Keil中添加这些文件到您的项目中。 5. 根据您的硬件连接,配置GPIO引脚和SPI接口。确保正确连接RFID-RC522模块与STM32开发板,并通过SPI接口进行通信。 6. 在主程序中,初始化SPI接口并使用RFID-RC522库提供的函数来初始化RFID模块。这些函数通常包括初始化SPI、设置IO口方向和模式、复位模块等。 7. 通过调用RFID-RC522库中的函数,实现读取和写入RFID卡的功能。例如,您可以使用函数来检测卡片是否存在、读取卡片UID、读取或写入卡片数据等。 8. 编译和烧录程序到STM32F103RCT6开发板上。 请注意,以上步骤仅提供了一个大致的指导。具体的实现过程可能因您所选择的库和硬件连接方式而有所不同。确保阅读并遵循RFID-RC522库的文档和示例程序以获取更详细的指导。 祝您成功使用STM32F103RCT6RFID-RC522!如果您有更多问题,请随时提问。
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵芝三昧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值