找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7027|回复: 13
收起左侧

RFID RC522门禁系统STM32源码

  [复制链接]
ID:440534 发表于 2018-12-5 23:27 | 显示全部楼层 |阅读模式
一份基于RFID RC522 的门禁系统,可实现用户录入,用户删除功能。
0.png

单片机源程序如下:
  1. //硬件环境:德飞莱STM32开发板
  2. //接线:SDA--PA3  SCK--PB13  MOSI--PB15  MISO--PB14  IRQ悬空  RST--PA4
  3. #include "var.h"
  4. #include "led.h"
  5. #include "delay.h"
  6. #include "key.h"
  7. #include "sys.h"
  8. #include "usart.h"
  9. #include "rtc.h"
  10. #include "wkup.h"
  11. #include "ADC.h"
  12. #include "DAC.h"
  13. #include "DMA.h"
  14. #include "24c02.h"
  15. #include "w25qxx.h"
  16. #include "timer.h"
  17. #include "oled.h"
  18. #include "stmflash.h"
  19. #include "rc522.h"
  20. //要写入到STM32 FLASH的字符串数组
  21. u16 m=1212;

  22. /*常量定义*/
  23. #define N 10 //最大管理员数目
  24. /*全局变量*/
  25. u16 flash_adder=0;//闪存地址变化量
  26. u16 people_num=0;
  27. u16 root_num=0;
  28. u16 ROOT_ID[4]= {174,115,14,46};
  29. u16 user1[4]= {222,181,4,46};
  30. u16 user2[4]= {219,225,48,47};
  31. u8 key_flage=0;
  32. u8 Key_Value=0;
  33. u16 ID[4];//卡号
  34. u16 id1[4];//卡号
  35. u16 id2[4];//卡号
  36. unsigned char CT[2];//卡类型
  37. /*函数声明*/
  38. u8 Get_RC522_ID(u16 *p);
  39. u8 ROOT_ID_Cheak(u16 *p);
  40. u8 root_ID_Cheak(u16 *p);
  41. u8 NormalUser_Input(u16 *p);
  42. u8 RootUser_Input(u16 *p);
  43. void unlock_check(u16 *p);
  44. void User_ID_Play(u8 y,u8 x,u16 *p);
  45. void Progress_Bar(u8 y,u8 x,u16 num,u8 n);
  46. /*主函数*/
  47. int main(void)
  48. {
  49.     u8 keyvalue,i,j=0;
  50.     delay_init();                     //延时函数初始化
  51.     uart_init(9600);                 //串口初始化为115200
  52.     LED_Init();//初始化
  53.     KEY_Init();
  54.     InitRc522();
  55.         OLED_Init();                        //初始化OLED  
  56.         OLED_Clear();
  57.     BEEP=0;
  58.     STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
  59.     STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
  60.     STMFLASH_Write(FLASH_SAVE_ADDR+4,(u16*)&root_num,1);  
  61.     printf("*%d\r\n",RootUser_Input(ROOT_ID));
  62.     ROOT_ID[0]=174;
  63.     printf("***********************\r\n");
  64.     while(1)
  65.     {
  66.                 if(j==0)  OLED_ShowString(10,-1,"Unocking model");
  67.                 j++;
  68.         if(Get_RC522_ID(ID))
  69.         {  
  70.                         User_ID_Play(0,0,ID);
  71.             unlock_check(ID);
  72.             for(i=0; i<4; i++)
  73.             {
  74.                 ID[i]=0;
  75.             }
  76.         }
  77.         /**********************************************************************/
  78.         if(Key_Test()==1)
  79.         {
  80.                         OLED_Clear_Hang(0);
  81.             printf("用户录入模式\r\n");
  82.                         j=1;
  83.             while(1)
  84.             {
  85.                                
  86.                                 if(j==1)
  87.                                 {
  88.                                         OLED_ShowString(0,-1,"User Entering");
  89.                                         OLED_ShowString(0,0,"Key2:Common User");
  90.                                         OLED_ShowString(0,1,"Key3:root User");
  91.                                         OLED_ShowString(0,2,"Key4:Exit");
  92.                                 }
  93.                                 j++;
  94.                 printf("key2管理员用户录入  key3普通用户录入 key4退出录入模式\r\n");
  95.                 if(key_flage==0)
  96.                 {
  97.                     Key_Value=Key_Test();
  98.                     if(Key_Value==2||Key_Value==3) key_flage=1;
  99.                 }
  100.                 /*******************************************************************************/
  101.                 if(Key_Value==2)
  102.                 {
  103.                                         OLED_Clear_Hang(1);
  104.                                         OLED_Clear_Hang(2);
  105.                                         OLED_Clear_Hang(3);
  106.                                         OLED_ShowString(0,0,"ROOT Cheak");
  107.                     while(1)
  108.                     {
  109.                         printf("ROOT身份验证\r\n");
  110.                                                
  111.                         if(Get_RC522_ID(ID))
  112.                         {
  113.                             if(ROOT_ID_Cheak(ID)==0)
  114.                             {
  115.                                 printf("ROOT身份验证成功,请录入管理员卡号\r\n");
  116.                                                                 OLED_Clear_Hang(1);
  117.                                                                 OLED_ShowString(0,0,"ROOT Cheak OK");
  118.                                                                 OLED_ShowString(0,1,"Entering root ID");
  119.                                 while(1)
  120.                                 {
  121.                                     if(Get_RC522_ID(id1))
  122.                                     {
  123.                                         if(id1[0]!=ID[0]||id1[1]!=ID[1]||id1[2]!=ID[2]||id1[3]!=ID[3])
  124.                                         {
  125.                                             if(RootUser_Input(id1))
  126.                                             {
  127.                                                 printf("管理员录入成功\r\n");
  128.                                                 key_flage=0;
  129.                                                 break;
  130.                                             }
  131.                                         }
  132.                                     }
  133.                                                                         if(Key_Test()==4)  break;
  134.                                 }
  135.                                                                 key_flage=0;
  136.                                                                 OLED_Clear();
  137.                                 break;
  138.                             }
  139.                         }
  140.                                                 if(Key_Test()==4)  break;
  141.                     }
  142.                                         key_flage=0;
  143.                                         j=1;
  144.                                         OLED_Clear();
  145.                 }
  146.                 /**************************************************************************/
  147.                 if(Key_Value==3)
  148.                 {
  149.                                         //OLED_Clear_Hang(1);
  150.                                         OLED_Clear_Hang(2);
  151.                                         OLED_Clear_Hang(3);
  152.                                         OLED_ShowString(0,0,"root Cheak");
  153.                     while(1)
  154.                     {
  155.                         printf("root身份验证\r\n");
  156.                         if(Get_RC522_ID(ID))
  157.                         {
  158.                             if(root_ID_Cheak(ID))
  159.                             {
  160.                                                                 OLED_ShowString(0,0,"root Cheak OK");
  161.                                                                 OLED_ShowString(0,1,"Entering User ID");
  162.                                 while(1)
  163.                                 {
  164.                                  
  165.                                     if(Get_RC522_ID(id2))
  166.                                     {
  167.                                         if(id2[0]!=ID[0]||id2[1]!=ID[1]||id2[2]!=ID[2]||id2[3]!=ID[3])
  168.                                         {
  169.                                             if(NormalUser_Input(id2))
  170.                                             {
  171.                                                 printf("普通用户录入成功\r\n");
  172.                                                 key_flage=0;
  173.                                                 break;
  174.                                             }
  175.                                         }
  176.                                     }
  177.                                                                         if(Key_Test()==4)  break;
  178.                                 }
  179.                                 break;
  180.                             }
  181.                                                        
  182.                         }
  183.                                                 if(Key_Test()==4)  break;
  184.                     }
  185.                                         j=1;
  186.                                         key_flage=0;
  187.                 }
  188.                 /**************************************************************************/
  189.                 if(Key_Test()==4)  break;//退出用户录入模式返回开锁模式
  190.             }
  191.                         OLED_Clear();
  192.                         j=0;
  193.         }
  194.     }
  195. }
  196. /*获取卡号*/
  197. u8 Get_RC522_ID(u16 *p)
  198. {
  199.     u8 t=0;
  200.     if(PcdRequest(PICC_REQALL,CT)==0)/*尋卡*/
  201.     {
  202.         if(PcdAnticoll(p)==0)/*防冲撞*/
  203.         {
  204.             for(t=0; t<4; t++)
  205.             {
  206.                 printf("%d\r\n",p[t]);
  207.             }  
  208.             if(p[0]==0&&p[1]==0&&p[2]==0&&p[3]==0)        return 0;               
  209.             else return 1;
  210.         }
  211.     }else {
  212.         return 0;
  213.     }
  214. }
  215. u8 ROOT_ID_Cheak(u16 *p)
  216. {
  217.     u8 n;
  218.     for(n=0; n<4; n++)
  219.     {
  220.         if(p[n]!=ROOT_ID[n]) break;
  221.     }
  222.     printf("%d\r\n",n);
  223.     if(n==4)
  224.     {
  225.         printf("The current user is:ROOT\r\n");
  226.         return 0;
  227.     }
  228. }
  229. /*普通用户录入*/
  230. u8 NormalUser_Input(u16 *p)
  231. {
  232.     u16 a[7],i;//测试使用
  233.     STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
  234.     STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
  235.     people_num=people_num+1;
  236.     p[0]=p[0]|0x0100;//将用户身份标志位第九位标志为1,即普通用户
  237.     people_num=people_num<<9;
  238.     p[0]=p[0]|people_num;//高7位标记为当前为第几录入
  239.     people_num=people_num>>9;
  240.     STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
  241.     STMFLASH_Write(FLASH_SAVE_ADDR+6+flash_adder,(u16*)p,4);
  242.     STMFLASH_Read(FLASH_SAVE_ADDR+6+flash_adder,(u16*)&a[3],4);//测试使用
  243.     flash_adder=flash_adder+8;
  244.     STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
  245.     STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)a,3);//测试使用
  246.     //STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&a[5],1);//测试使用
  247.     //STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&a[4],1);//测试使用
  248.     a[3]=a[3]&0x00ff;
  249.     p[0]=p[0]&0x00ff;
  250.     for(i=3; i<7; i++)
  251.     {
  252.         if(a[i]!=p[i-3]) break;
  253.     }
  254. //    printf("地址变化量 %d\r\n",a[0]);
  255. //    printf("录入总人数%d\r\n",a[1]);
  256. //    printf("管理员人数%d\r\n",a[2]);
  257. //    printf("%d\r\n",a[3]);
  258. //    printf("%d\r\n",a[4]);
  259. //    printf("%d\r\n",a[5]);
  260. //    printf("%d\r\n",a[6]);
  261.     if(i==7)
  262.     {
  263.         return 1;
  264.     } else {
  265.         return 0;
  266.     }
  267. }
  268. /*管理员用户录入*/
  269. u8 RootUser_Input(u16 *p)
  270. {
  271.     u16 a[7],i;//测试使用
  272.     STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
  273.     STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
  274.     STMFLASH_Read(FLASH_SAVE_ADDR+4,(u16*)&root_num,1);
  275.     people_num=people_num+1;
  276.     root_num=root_num+1;
  277.     p[0]=p[0]|0x0000;//将用户身份标志位第九位标志为0,即普通用户
  278.     people_num=people_num<<9;
  279.     p[0]=p[0]|people_num;//高7位标记为当前为第几录入
  280.     people_num=people_num>>9;
  281.     STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
  282.     STMFLASH_Write(FLASH_SAVE_ADDR+4,(u16*)&root_num,1);
  283.     STMFLASH_Write(FLASH_SAVE_ADDR+6+flash_adder,(u16*)p,4);
  284.     STMFLASH_Read(FLASH_SAVE_ADDR+6+flash_adder,(u16*)&a[3],4);//测试使用
  285.     flash_adder=flash_adder+8;
  286.     STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
  287.     STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)a,3);//测试使用
  288.     //STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&a[5],1);//测试使用
  289.     //STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&a[4],1);//测试使用
  290.     a[3]=a[3]&0x00ff;
  291.     p[0]=p[0]&0x00ff;
  292.     for(i=3; i<7; i++)
  293.     {
  294.         if(a[i]!=p[i-3]) break;
  295.     }
  296. //          printf("%d\r\n",p[0]);
  297. //          printf("%d\r\n",p[1]);
  298. //          printf("%d\r\n",p[2]);
  299. //          printf("%d\r\n",p[3]);
  300. //          printf("%d\r\n",i);
  301. //    printf("地址变化量 %d\r\n",a[0]);
  302. //    printf("录入总人数%d\r\n",a[1]);
  303. //    printf("管理员人数%d\r\n",a[2]);
  304. //    printf("%d\r\n",a[3]);
  305. //    printf("%d\r\n",a[4]);
  306. //    printf("%d\r\n",a[5]);
  307. //    printf("%d\r\n",a[6]);
  308.     if(i==7)
  309.     {
  310.         return 1;
  311.     } else {
  312.         return 0;
  313.     }
  314. }
  315. /*开锁检测*/
  316. //void unlock_check(u16 *p)
  317. //{
  318. //    u16 i=0,j=0;
  319. //    u16 user_id[4];
  320. ////    printf("%d\r\n",p[0]);
  321. ////    printf("%d\r\n",p[1]);
  322. ////    printf("%d\r\n",p[2]);
  323. ////    printf("%d\r\n",p[3]);
  324. //    STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
  325. ////    printf("people_num=%d\r\n",people_num);
  326. //    for(i=0; i<people_num; i++)
  327. //    {
  328. //                Progress_Bar(0,1,people_num,i+1);
  329. //        STMFLASH_Read(FLASH_SAVE_ADDR+6+(8*i),(u16*)user_id,4);
  330. //        /*for(i=0;i<4;i++)//测试使用
  331. //        {
  332. //                printf("user_id[%d]=%d\r\n",i,user_id[i]);
  333. //        }*/
  334. //        user_id[0]=user_id[0]&0x00ff;//还原用户ID数组第一个数
  335. ////        printf("user_id[0]=%d\r\n",user_id[0]);
  336. //        for(j=0; j<4; j++)
  337. //        {
  338. //            if(user_id[j]!=p[j]) break;
  339. //        }
  340. ////        printf("j=%d\r\n",j);//测试使用
  341. //        if(j==4)
  342. //        {
  343. //            BEEP=1;
  344. //            delay_ms(3000);
  345. //            BEEP=0;
  346. ////            printf("开锁成功\r\n");
  347. //            break;
  348. //        } else {
  349. //                        delay_ms(3000);
  350. //            BEEP=0;
  351. ////            printf("开锁失败\r\n");
  352. //        }
  353. //    }
  354. //        OLED_Clear_Hang(1);
  355. //        OLED_Clear_Hang(2);
  356. //}
  357. u8 root_ID_Cheak(u16 *p)
  358. {
  359.     u16 i=0,j=0;
  360.     u16 user_id[4];
  361. //    printf("%d\r\n",p[0]);
  362. //    printf("%d\r\n",p[1]);
  363. //    printf("%d\r\n",p[2]);
  364. //    printf("%d\r\n",p[3]);
  365.     STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
  366. //    printf("people_num=%d\r\n",people_num);
  367.     for(i=0; i<people_num; i++)
  368.     {
  369.         STMFLASH_Read(FLASH_SAVE_ADDR+6+(8*i),(u16*)user_id,4);
  370.         /*for(i=0;i<4;i++)//测试使用
  371.         {
  372.                 printf("user_id[%d]=%d\r\n",i,user_id[i]);
  373.         }*/
  374.         if((user_id[0]&0x0100)==0x0000)
  375.         {
  376.             user_id[0]=user_id[0]&0x00ff;//还原用户ID数组第一个数
  377.             printf("user_id[0]=%d\r\n",user_id[0]);
  378.             for(j=0; j<4; j++)
  379.             {
  380.                 if(user_id[j]!=p[j]) break;
  381.             }
  382. //            printf("j=%d\r\n",j);//测试使用
  383.             if(j==4)
  384.             {
  385.                 //printf("root验证成功\r\n");
  386.                 return 1;
  387.                 break;
  388.             }
  389.         }
  390.     }       
  391. }
  392. void User_ID_Play(u8 y,u8 x,u16 *p)
  393. {
  394.         u8 n,len[4]={0,0,0,0},m=0;
  395.         OLED_ShowString(y,x,"User ID:");
  396.         for(n=0;n<4;n++)
  397.         {
  398.                 if(p[n]>9)
  399.                 {
  400.                         len[n]=2;
  401.                         if(p[n]>99) len[n]=3;
  402.                 }else{
  403.                  len[n]=1;
  404.                 }
  405.             if(n==0) OLED_ShowNum(63+y,x,p[n],len[n],12);
  406.                 else   
  407.                 {       
  408.                        m+=len[n-1];       
  409.                         OLED_ShowNum(6*m+1+63+y,x,p[n],len[n],12);
  410.                 }
  411.         }
  412. }

  413. void Progress_Bar(u8 y,u8 x,u16 num,u8 n)
  414. {
  415. ……………………

  416. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
RFID RC522 门禁系统 -2018.12.02版.rar (331.75 KB, 下载次数: 360)
回复

使用道具 举报

ID:315259 发表于 2018-12-19 18:59 | 显示全部楼层
谢谢楼主分享了
回复

使用道具 举报

ID:308785 发表于 2019-5-12 11:01 | 显示全部楼层
非常感谢,这还是比较详细呢
回复

使用道具 举报

ID:641544 发表于 2019-11-13 22:29 | 显示全部楼层
谢谢楼主分享,好人一生平安
回复

使用道具 举报

ID:467442 发表于 2019-11-15 17:03 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:375715 发表于 2019-11-19 09:44 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:544005 发表于 2020-1-12 08:39 | 显示全部楼层
xx谢谢分享!!!
回复

使用道具 举报

ID:72576 发表于 2020-1-12 12:25 | 显示全部楼层
学习一下,谢谢分享!!!
回复

使用道具 举报

ID:551295 发表于 2020-6-8 17:13 | 显示全部楼层
有上位机吗?
回复

使用道具 举报

ID:427723 发表于 2020-6-16 08:44 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:887442 发表于 2021-3-1 20:36 | 显示全部楼层
学习一下这个模块的用法,看来不容易
回复

使用道具 举报

ID:381245 发表于 2021-3-7 16:55 | 显示全部楼层
和原来做的指纹录入有异曲同工之处,谢谢楼主的大公无私!!
回复

使用道具 举报

ID:1033546 发表于 2022-11-19 22:59 来自手机 | 显示全部楼层
谢谢大佬分享
回复

使用道具 举报

ID:1084333 发表于 2023-6-15 17:17 | 显示全部楼层
非常感谢,这还是比较详细呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表