久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8170|回復: 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, 下載次數: 371)


回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩高清在线观看 | 黄色国产在线视频 | 国产精品呻吟久久av凹凸 | 午夜电影福利 | 免费一看一级毛片 | 激情av| 欧美综合一区二区三区 | 国产91精品在线 | 91看片免费版 | 精品美女在线观看视频在线观看 | 久久在线| 奇米av| 国产在线高清 | 欧美综合久久 | 国产精品综合网 | 亚洲欧美视频一区二区 | 精品久久一区 | 久久久久久九九九九九九 | 国产成人免费视频 | 日本又色又爽又黄又高潮 | 精品一区二区三区在线观看 | 久久国产成人午夜av影院武则天 | 亚洲综合在 | 大象视频一区二区 | 久久国产成人 | 国产农村妇女毛片精品久久麻豆 | 亚洲精品久久久久中文字幕欢迎你 | 视频一区二区三区中文字幕 | 国产免费又色又爽又黄在线观看 | 日韩a在线| 亚洲欧美一区二区三区国产精品 | 91精品国产91久久久久游泳池 | 精品国产高清一区二区三区 | 国产精品99精品久久免费 | 先锋资源网 | 久久男人 | 我爱操 | 国产福利91精品 | 视频一区二区三区四区五区 | 免费福利视频一区二区三区 | 一级h片 |