你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于stm32f103c8t6RFID-RC522智能开关

[复制链接]
STMCU小助手 发布时间:2022-10-27 16:38
基于stm32f103x8t6的RFID-RC522门禁卡的使用,简单实现智能门锁的改造。下面就简单分析如何实现,驱动源码由商家提供,当然我们所做的也不只是智能门锁,可以通过刷卡实现各种智能操作(开灯、开风扇等等)根据自己需求修改就好了。工程的源码我会放在最后需要的可以自行下载。

一、硬件准备
R_JP8XD1S77`@F1K__@3W)4.png

图 1

5c6bd24a81e64b8fb4fa0997cadbee81.png

图 2

438dda72632c43b995b920518d641446.png

二、软件准备

编写完后我们首先通过串口来检测是否正确,将我们的信息通过串口打印出来

d579705580ba4449ab6b9ccfc0fff89b.png

三、主程序

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "spi_driver.h"
  6. #include "stm32f10x_spi.h"
  7. #include "rfid.h"


  8. /******************************************************************
  9. Author:小殷
  10. Date:2022-3-24
  11. 声明:本代码也是移值的进行了简单修改 非原创

  12. 硬件连接
  13. STM32F103C8T6       RC522模块
  14. PA4(SPI1_NSS)              SDA
  15. PA5(SPI1_SCK)                                SCK
  16. PA6(SPI1_MISO)                        MISO
  17. PA7(SPI1_MOSI)                        MOSI
  18. PA11(RST)                                                RST
  19. PB1(IRQ)                                                IRQ  未定义


  20. 将线接好后,刷卡,观察串口1有ID项有四个数字
  21. 第一项*1+第二项*2+第三项*3+第四项*4/4得到一个数字用SWITCH语句,判断即可。
  22. *******************************************************************/


  23. uint8_t Card_Type1[2];  //卡的类型存储  
  24. uint8_t Card_ID[4]; //卡序列号存储
  25. uint8_t Card_KEY[6] = {0xff,0xff,0xff,0xff,0xff,0xff};    //{0x11,0x11,0x11,0x11,0x11,0x11};   //密码
  26. uint8_t Card_Data[16];
  27. uint8_t Run_flag=1;
  28. uint8_t flag;
  29. uint8_t status;


  30. void main(void)
  31. {
  32.         Card_Type1[0]=0x04;
  33.         Card_Type1[1]=0x00;
  34.         delay_init();//延时函数初始化
  35.         LED_GPIO_INIT(); //led初始化
  36.         uart_init(115200);         //串口初始化为115200        
  37.         printf("****************************** 串口测试 *************************\n");
  38.         RC522_IO_Init();
  39.         PcdReset();  //复位RC522
  40.         PcdAntennaOff();  //关闭天线
  41.         delay_ms(100);
  42.         PcdAntennaOn();  //开启天线        
  43.         printf("****************************** 智能门锁 *****************************\r\n");
  44.         while(Run_flag)
  45.         {
  46.         

  47.                 if(MI_OK==PcdRequest(0x52, Card_Type1))  //寻卡函数,如果成功返回MI_OK  打印多次卡号
  48.                 {
  49.                         
  50.                         uint16_t cardType = (Card_Type1[0]<<8)|Card_Type1[1];//读不同卡的类型
  51.                         printf("卡类型:(0x%04X)\r\n",cardType);  //"Card Type(0x%04X):"
  52.                         
  53.                         //下面是进行不同卡型号的判断 进行测试的时候大家可以多买几张卡 进行测试
  54.                         switch(cardType)
  55.                                 {
  56.                                         case 0x4400:
  57.                                                         printf("Mifare UltraLight\r\n");
  58.                                                         break;
  59.                                         case 0x0400:
  60.                                                         printf("Mifare One(S50)\r\n");
  61.                                                         break;
  62.                                         case 0x0200:
  63.                                                         printf("Mifare One(S70)\r\n");
  64.                                                         break;
  65.                                         case 0x0800:
  66.                                                         printf("Mifare Pro(X)\r\n");
  67.                                                         break;
  68.                                         case 0x4403:
  69.                                                         printf("Mifare DESFire\r\n");
  70.                                                         break;
  71.                                         default:
  72.                                                         printf("Unknown Card\r\n");
  73.                                                         break;
  74.                         }
  75.                         status = PcdAnticoll(Card_ID);//防冲撞 如果成功返回MI_OK
  76.                         if(status != MI_OK)
  77.                                 {
  78.                                         printf("Anticoll Error\r\n");
  79.                                 }
  80.                                 //打印卡的序列号 进行区分
  81.                                 else
  82.                                 {
  83.                                         printf("Serial Number:%d %d %d %d\r\n",Card_ID[0],Card_ID[1],Card_ID[2],Card_ID[3]);
  84.                                        
  85.                                 //根据卡id处理后获取不同的值 我们可以通过这个不同的数值 来进行不同的控制
  86.                                 //下面如果flag 返回1 进行关灯操作  返回2 进行开灯操作
  87.                                 //注意需要用不同的卡进行刷 才可以 (通过买的时候会有一张白卡和一个小型的刷卡卡片
  88.                                         flag=Card_Data_Tackle(Card_ID);
  89.                                        
  90.                                        
  91.                                         //通过打印flag的值在串口进行观察不同卡的值
  92.                                        
  93.                                         printf("flag=%d \r\n",flag);
  94.                                         if(flag == 1)
  95.                                         {
  96.                                                 //这里面可以根据自己控制的需求进行修改
  97.                                                 GPIO_SetBits(GPIOC,GPIO_Pin_13);  //关灯
  98.                                         }
  99.                                         else if(flag == 2)
  100.                                         {
  101.                                                 //这里面可以根据自己控制的需求进行修改
  102.                                                 GPIO_ResetBits(GPIOC,GPIO_Pin_13); //开关
  103.                                         }
  104.                                         else
  105.                                         {
  106.                                                 
  107.                                                 printf("flag is not exit\n");   //未识别 不存在在卡的数值
  108.                                         }
  109.                                                 
  110.                                                 
  111.                                 }
  112.                         
  113.                         status = PcdSelect(Card_ID);  //选卡 如果成功返回MI_OK
  114.                         if(status != MI_OK){
  115.                                         printf("Select Card Error\r\n");
  116.                         }
  117.                         else
  118.                                 printf("Select Card OK\r\n");
  119.                         
  120.                         status = PcdHalt();  //卡片进入休眠状态
  121.                         if(status != MI_OK){
  122.                                         printf("PcdHalt Error\r\n");                        
  123.                         }
  124.                         else
  125.                         {
  126.                                         printf("PcdHalt OK\r\n");        
  127.                         }
  128.                         
  129.                 }

  130.         }

  131. }
复制代码

串口结果

从下面结果可以看出我们卡的类型是0x0400也就是Mifare One(S50),刷卡后flag为1 说明我们这张卡是作为关灯的。另一张就是进行开灯的,这样我们就将RFID-RC522模块简单的使用了起来。

bacf0580c61a4db38ac3a3b2b34b0921.png

总结
在我们进行不同模块使用的时候,首先我们可以不用太过于去研究实现原理,可以先把我们想要的功能实现出来,向商家要源码或者去网上搜相关的资料。当一个小小的功能实现的时候都是会有成就感的,这时候如果想深究一下原理这时候我们在去仔细分析每句代码什么意思,个人认为这样学习会更有效。
譬如我们使用的RDIF-RC522是SPI驱动的,一开始就先去研究SPI的驱动原理(真正掌握还是很难的)这时候我们难免会失去学习兴趣,当我门把功能实现后带着乐趣去了解原理会更有效果(至少对我来说是这样)。

————————————————
版权声明:@slow-walker


收藏 评论0 发布时间:2022-10-27 16:38

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版