[其他ST产品] 基于STM32的RFID-RC522门禁系统

[复制链接]
 楼主| 而服务器人 发表于 2022-12-27 16:34 | 显示全部楼层 |阅读模式
设计介绍

这是一个基于STM32的RFID-RC522门禁系统,LCD1602显示当前状态,当检测到IC卡时,如果这个IC卡已经登记过,LCD1602上会显示IC卡的卡号,继电器打开,如果没有登记则报警。部分代码如下。

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "lcd.h"
  4. #include "led.h"
  5. #include "usart.h"
  6. #include "dht11.h"
  7. #include "key.h"
  8. #include "beep.h"
  9. #include <stdio.h>
  10. #include "stmflash.h"
  11. #include "timer.h"
  12. #include "exit.h"
  13. #include "rc522.h"

  14. void show1(void);
  15. void show2(void);
  16. void show3(void);
  17. void show4(void);
  18. void show5(void);
  19. void show21(void);
  20. void show31(void);
  21. void show8(void);
  22. u8 read_up=1;
  23. u8 set1=1;

  24. /*这三个标志位是用于按键的扫描程序*/
  25. u8 key0_flag=0;
  26. u8 key1_flag=0;
  27. u8 key2_flag=0;
  28. u8 beep_switch=0;
  29. u8 beep_num=0;
  30. u8 beepup_num=0;
  31. u8 open_flag=0;
  32. u8 down_flag=0;
  33. u8 err_beepnum=0;
  34. u8 table1[]="Please Bash Card";
  35. u8 table11[]="      (())      ";
  36. u8 table2[]="  Register Mode ";
  37. u8 table22[]="      (())      ";
  38. u8 table222[]="Register Success";
  39. u8 table3[]="   Clear Mode   ";
  40. u8 table33[]=" **ut Success ";
  41. u8 table5[]="    Door open   ";
  42. u8 table6[]="   Door close   ";
  43. u8 table8[]=" Dead Lock    s ";
  44. u8 err_num=0;
  45. u8 eee_flag=0;
  46. int kg_flag=0;//定时器4累加标志位,用于当RFID扫描到了并对门做出了相应的动作后,返回到扫描ID卡的计时标志位
  47. u8 tim2_flag=0;//定时器2累加标志位,用于当按键按下之后,并完成了注册或注销卡之后,返回到扫描ID卡的计时标志位
  48. u8 show_flag=0;//记录显示那个界面的标志位
  49. unsigned char num;
  50. unsigned char key_flag;//用于标识当前系统处于,扫描ID卡状态还是注册ID卡状态还是注销ID卡状态
  51. unsigned char i;
  52. unsigned int temp;
  53. unsigned char status;
  54. unsigned char g_ucTempbuf[20];
  55. unsigned char g_ucTempbufid[20];//用于记录下来当前扫描到的ID
  56. unsigned char lcd[]="0123456789ABCDEF";//用于显示ID时的16进制
  57. unsigned char dataerr[16] = {0x11,0x11,0x11,0x78,0xED,0xCB,0xA9,0x87,0x12,0x34,0x56,0x78,0x01,0xFE,0x01,0xFE};//ID卡中错误的密码数据
  58. unsigned char data1[16] = {0x12,0x34,0x56,0x78,0xED,0xCB,0xA9,0x87,0x12,0x34,0x56,0x78,0x01,0xFE,0x01,0xFE};//ID卡中正确的密码数据

  59. unsigned char data2[4]  = {0,0,0,0x01};
  60. unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};


  61. u8 RC522_flag=1;
  62. u8 RC522_flag1=1;
  63. u8 RC522_flag2=1;
  64. u8 RC522_flag3=0;
  65. /*按键的扫描函数*/

  66. /*用于判断系统应该显示哪一个界面*/

  67.         

  68. int main(void)
  69. {
  70.         unsigned char status,i;
  71.         unsigned int temp;
  72.         delay_init();
  73.   LCD1602_Init();
  74.         KEY_Init();
  75.         
  76.         BEEP_Init();
  77.         LED_Init();
  78.         
  79.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  80.          uart_init(115200);


  81.         RC522_Init();
  82.         PcdReset();
  83.         PcdAntennaOff();
  84.         delay_ms(10);
  85.          PcdAntennaOn();
  86.         delay_ms(10);
  87.         TIM2_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
  88.         TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到5000为500ms  
  89.         TIM4_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
  90.         printf("Start \r\n");
  91.         key_flag=0;
  92.         show_flag=1;
  93.         beep_switch=0;
  94.         GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  95.         while(1)
  96.         {
  97. //                printf("%d",RC522_flag1);
  98.                
  99.                
  100.                 show_num();


  101.                         down_flag=0;
  102.                         if(kg_flag==6 && err_num<3)
  103.                         {
  104.                                 GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  105.                                 kg_flag=0;
  106.                                 TIM_Cmd(TIM4, DISABLE);  //使能TIMx        
  107.                                 GPIO_ResetBits(GPIOB,GPIO_Pin_11);
  108.                                 key_flag=0;
  109.                                 show_flag=1;
  110.                                 open_flag=0;
  111.                                 down_flag=0;

  112.                         }
  113.                         else if(kg_flag==360 && err_num==3)
  114.                         {
  115.                                 kg_flag=0;
  116.                                 err_beepnum=0;
  117.                                 GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  118.                                 TIM_Cmd(TIM4, DISABLE);  //使能TIMx        
  119.                                 key_flag=0;
  120.                                 show_flag=1;
  121.                                 err_num=0;
  122.                         }

  123.                 if(tim2_flag==4)
  124.                 {               
  125.                                 GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  126.                                 tim2_flag=0;
  127.                                 TIM_Cmd(TIM2, DISABLE);  //使能TIMx        
  128.                                 key_flag=0;
  129.                           show_flag=1;

  130.                 }
  131.                 if(key_flag==0)
  132.                 {

  133.                         status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡                        
  134.                         if (status != MI_OK)                 
  135.                         {   
  136.                                 PcdReset();
  137.                                 PcdAntennaOff();
  138.                                 PcdAntennaOn();
  139.                                         printf("寻卡失败\r\n");
  140.                                 
  141.                                 if(RC522_flag3<3) RC522_flag3++;
  142.                           if(RC522_flag3==4)RC522_flag3=3;
  143.                                 

  144.                         
  145.                                 continue;
  146.                         }
  147.                         else
  148.                         {
  149.                                         if(RC522_flag3==3)
  150.                                         {
  151.                                                   RC522_flag3=4;
  152.                                                         RC522_flag=1;
  153.                                         }
  154.                         }
  155.                         
  156.                         
  157.                         if(RC522_flag==1)
  158.                         {  
  159.                                 RC522_flag=0;               
  160.                                 printf("1231231231312312312312312312\r\n");
  161.                                 status = PcdAnticoll(g_ucTempbuf);//防冲撞               
  162.                                 if(status != MI_OK)
  163.                                 {   printf("寻卡失败1");  continue;           }


  164.                                 printf("卡序列号:");        //超级终端显示,
  165.                                 for(i=0;i<4;i++)
  166.                                 {
  167.                                 temp=g_ucTempbuf[i];
  168.                                 g_ucTempbufid[i]=temp;
  169.                                 printf("%X",temp);
  170.                                 }
  171.                                                         status = PcdSelect(g_ucTempbuf);//选定卡片
  172.                                 if (status != MI_OK)
  173.                                 {   printf("寻卡失败2");  continue;           }
  174.                                          
  175.                                 
  176.                                 status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
  177.                                 if (status != MI_OK)
  178.                                 {           printf("寻卡失败3");   continue;  }

  179.                                                 

  180.                                 status = PcdRead(1, g_ucTempbuf);//读块
  181.                                 if (status != MI_OK)
  182.                                 {          printf("寻卡失败4");    continue;  }
  183.                                                                         
  184.                                 printf("卡读块:");        //超级终端显示,
  185.                                 for(i=0;i<16;i++)
  186.                                 {
  187.                                         temp=g_ucTempbuf[i];
  188.                                         printf("%X",temp);
  189.                                 }
  190.                                 num=0;
  191.                                 for(i=0;i<16;i++)
  192.                                 {
  193.                                         if(data1[i]==g_ucTempbuf[i])
  194.                                         {num++;}
  195.                                        
  196.                                         printf("\nnum %d\n",num);
  197.                                 }
  198.                                                 
  199.                                 if(num!=16)
  200.                                 {
  201.                                         err_num++;
  202.                                         if(err_num<3)
  203.                                         {                                       
  204.                                                 //不开门
  205.                                                 show_flag=4;
  206.                                                 kg_flag=0;
  207.                                                 open_flag=2;
  208.                                                 printf("downflag%d\n",down_flag);
  209.                                                 TIM_Cmd(TIM4, ENABLE);  //使能TIMx        
  210.                                         }
  211.                                 }
  212.                                 else
  213.                                 {
  214.                                 //开门
  215.                                         err_num=0;
  216.                                         show_flag=5;
  217.                                         kg_flag=0;
  218.                                         open_flag=1;
  219.                                         TIM_Cmd(TIM4, ENABLE);  //使能TIMx        
  220.                                         GPIO_SetBits(GPIOB,GPIO_Pin_11);

  221.                                 }
  222.                         }
  223.                         
  224.                                 //printf("\n");                                          
  225.                         
  226.                         PcdHalt();
  227.                 }
  228.                
  229.                 else if(key_flag==1)
  230.                 {
  231.         
  232.                         TIM_Cmd(TIM2, DISABLE);  //使能TIMx        
  233.       TIM_Cmd(TIM4, DISABLE);  //使能TIMx        
  234.                         GPIO_ResetBits(GPIOB,GPIO_Pin_11);
  235.       GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  236.                         show_flag=2;
  237.                         status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
  238.                         if (status != MI_OK)
  239.                         {   
  240.                                 PcdReset();
  241.                                 PcdAntennaOff();
  242.                                 PcdAntennaOn();
  243.                                 key_flag=1;                printf("寻卡失败111\r\n");RC522_flag1=1;

  244.                                 continue;
  245.                                 

  246.                         }
  247.                         if(RC522_flag1==1)
  248.                         {
  249.                                 RC522_flag3=0;
  250.                                 RC522_flag1=0;
  251.                                 printf("1231231231312312312312312312\r\n");

  252.                                 printf("卡的类型:");
  253.                                 for(i=0;i<2;i++)
  254.                                 {
  255.                                 temp=g_ucTempbuf[i];
  256.                                 printf("%X",temp);
  257.                                 }
  258.                                 
  259.                                 status = PcdAnticoll(g_ucTempbuf);//防冲撞               
  260.                                 if(status != MI_OK)
  261.                                 {  
  262.                                         printf("防冲撞失败");
  263.                                  
  264.                                 }
  265.                                 else
  266.                                 {
  267.                                                                                                                
  268.                                         printf("卡序列号:");        //超级终端显示,
  269.                                         for(i=0;i<4;i++)
  270.                                         {
  271.                                                 temp=g_ucTempbuf[i];
  272.                                                 printf("%X",temp);

  273.                                         }

  274.                                         status = PcdSelect(g_ucTempbuf);//选定卡片
  275.                                         if (status != MI_OK)
  276.                                         {   
  277.                                                 printf("选定卡失败");   

  278.                                         }
  279.                                         else
  280.                                         {        
  281.                                                 status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
  282.                                                 if (status != MI_OK)
  283.                                                 {   
  284.                                                         printf("密码错误");

  285.                                                 }
  286.                                                 else
  287.                                                 {
  288.                                                         status = PcdWrite(1, data1);//写块
  289.                                                         if (status != MI_OK)
  290.                                                         {   
  291.                                                                 printf("写错");
  292.                                                                         
  293.                                                         }
  294.                                                         else
  295.                                                         {               

  296.                                                                
  297.                                                                         key_flag=3;
  298.                                                                         show_flag=6;                                                
  299.                   tim2_flag=0;
  300.                                                                         TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                                                                                                                         
  301.                                                         }                                                        
  302.                                                 }                                                        
  303.                                         }                                                
  304.                                 }               
  305.                  
  306.                         
  307.                         }

  308.             PcdHalt();
  309. //                        
  310. //RC522_flag1=1;
  311.         
  312.                         
  313.                         
  314.                 }
  315.                 else if(key_flag==2)
  316.                 {
  317.                                          TIM_Cmd(TIM2, DISABLE);  //使能TIMx        
  318.      TIM_Cmd(TIM4, DISABLE);  //使能TIMx        
  319.                                                 GPIO_ResetBits(GPIOB,GPIO_Pin_11);
  320.       GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  321.                         show_flag=3;
  322.                         status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
  323.                         if (status != MI_OK)
  324.                         {   
  325.                                 PcdReset();
  326.                                 PcdAntennaOff();
  327.                                 PcdAntennaOn();
  328.                                 printf("寻卡失败\r\n");
  329.                                 key_flag=2;
  330.                                 RC522_flag2=1;
  331.                                 continue;
  332.                         }
  333.                         if(RC522_flag2==1)
  334.                         {
  335.                                 RC522_flag3=0;
  336.                                 RC522_flag2=0;printf("1231231231312312312312312312\r\n");

  337.                                 printf("卡的类型:");
  338.                                 for(i=0;i<2;i++)
  339.                                 {
  340.                                         temp=g_ucTempbuf[i];
  341.                                         printf("%X",temp);
  342.                                 }                                
  343.                                 status = PcdAnticoll(g_ucTempbuf);//防冲撞               
  344.                                 if(status != MI_OK)
  345.                                 {  
  346.                                         printf("防冲撞失败");

  347.                                 }
  348.                                 else
  349.                                 {                                                        
  350.                                         printf("卡序列号:");        //超级终端显示,
  351.                                         for(i=0;i<4;i++)
  352.                                         {
  353.                                                 temp=g_ucTempbuf[i];
  354.                                                 printf("%X",temp);

  355.                                         }                                                
  356.                                         status = PcdSelect(g_ucTempbuf);//选定卡片
  357.                                         if (status != MI_OK)
  358.                                         {   
  359.                                                 printf("选定卡失败");   

  360.                                         }
  361.                                         else
  362.                                         {        
  363.                                                 status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
  364.                                                 if (status != MI_OK)
  365.                                                 {   
  366.                                                         printf("密码错误");
  367.                                                          
  368.                                                 }
  369.                                                 else
  370.                                                 {
  371.                                                         status = PcdWrite(1, dataerr);//写块
  372.                                                         if (status != MI_OK)
  373.                                                         {   
  374.                                                                 printf("写错");
  375.                                                                
  376.                                                         }
  377.                                                         else
  378.                                                         {                                
  379.                
  380.                                                                 key_flag=3;
  381.                                                                 show_flag=7;        
  382.                                                                 tim2_flag=0;
  383.                                                                 TIM_Cmd(TIM2, ENABLE);  //使能TIMx        
  384.                                                      
  385.                                                         }                                                
  386.                                                 }                                       
  387.                                         }                        
  388.                                 }                                 
  389.                         }
  390.                         PcdHalt();
  391.                
  392.                 }
  393.                 else if(key_flag==3)
  394.                 {
  395.                         
  396.                 }
  397.         }

  398. }



pmp 发表于 2023-1-5 11:26 | 显示全部楼层
这个工程文件有了吗?              
OKAKAKO 发表于 2023-1-5 11:35 | 显示全部楼层
原理简单,代码编写很有用
maudlu 发表于 2023-1-5 11:36 | 显示全部楼层
射频卡是否支持加密呢?              
hudi008 发表于 2023-1-5 16:20 | 显示全部楼层
这个最大的读取速度是多少?              
Jacquetry 发表于 2023-1-5 16:49 | 显示全部楼层
最大的读取速度是多少?   
adolphcocker 发表于 2023-1-5 17:00 | 显示全部楼层
射频卡的功能非常强大。              
LOVEEVER 发表于 2023-1-6 09:30 | 显示全部楼层
固定频率的电磁波,非接触的功能很好
louliana 发表于 2023-1-6 17:34 | 显示全部楼层
这个如何写入数据?              
mikewalpole 发表于 2023-1-7 16:30 | 显示全部楼层
怎么写入数据到RC522系统呢?
bestwell 发表于 2023-1-9 15:33 | 显示全部楼层
循环扫描的话,会不会连续读写卡片?
星辰大海不退缩 发表于 2023-1-9 16:10 来自手机 | 显示全部楼层
射频卡应用还是很多的,不过这种应该加密吧
sheflynn 发表于 2023-1-12 14:51 | 显示全部楼层
检测IC卡的时候,会报错,但是读取不到数据。
zerorobert 发表于 2023-1-13 22:26 | 显示全部楼层
RC522可以被哪个模块替代呢?
updownq 发表于 2023-1-14 14:39 | 显示全部楼层
这个有时候会接触不良怎么回事?              
uiint 发表于 2023-1-14 15:58 | 显示全部楼层
怎么判断ic卡已经读取到了?              
everyrobin 发表于 2023-1-16 19:00 | 显示全部楼层
STM32的性能还是不错的。              
abotomson 发表于 2023-1-19 13:23 | 显示全部楼层
怎么判断数据是否读取成功?              
earlmax 发表于 2023-1-19 18:28 | 显示全部楼层
怎么使用这个中断?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

467

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部