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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8140|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

RFID RC522門禁系統(tǒng)STM32源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
一份基于RFID RC522 的門禁系統(tǒng),可實(shí)現(xiàn)用戶錄入,用戶刪除功能。


單片機(jī)源程序如下:
  1. //硬件環(huán)境:德飛萊STM32開發(fā)板
  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的字符串?dāng)?shù)組
  21. u16 m=1212;

  22. /*常量定義*/
  23. #define N 10 //最大管理員數(shù)目
  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];//卡號(hào)
  34. u16 id1[4];//卡號(hào)
  35. u16 id2[4];//卡號(hào)
  36. unsigned char CT[2];//卡類型
  37. /*函數(shù)聲明*/
  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. /*主函數(shù)*/
  47. int main(void)
  48. {
  49.     u8 keyvalue,i,j=0;
  50.     delay_init();                     //延時(shí)函數(shù)初始化
  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身份驗(yàn)證\r\n");
  110.                                                
  111.                         if(Get_RC522_ID(ID))
  112.                         {
  113.                             if(ROOT_ID_Cheak(ID)==0)
  114.                             {
  115.                                 printf("ROOT身份驗(yàn)證成功,請(qǐng)錄入管理員卡號(hào)\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身份驗(yàn)證\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. /*獲取卡號(hào)*/
  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;//測(cè)試使用
  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;//將用戶身份標(biāo)志位第九位標(biāo)志為1,即普通用戶
  237.     people_num=people_num<<9;
  238.     p[0]=p[0]|people_num;//高7位標(biāo)記為當(dāng)前為第幾錄入
  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);//測(cè)試使用
  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);//測(cè)試使用
  246.     //STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&a[5],1);//測(cè)試使用
  247.     //STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&a[4],1);//測(cè)試使用
  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("錄入總?cè)藬?shù)%d\r\n",a[1]);
  256. //    printf("管理員人數(shù)%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;//測(cè)試使用
  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;//將用戶身份標(biāo)志位第九位標(biāo)志為0,即普通用戶
  278.     people_num=people_num<<9;
  279.     p[0]=p[0]|people_num;//高7位標(biāo)記為當(dāng)前為第幾錄入
  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);//測(cè)試使用
  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);//測(cè)試使用
  288.     //STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&a[5],1);//測(cè)試使用
  289.     //STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&a[4],1);//測(cè)試使用
  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("錄入總?cè)藬?shù)%d\r\n",a[1]);
  303. //    printf("管理員人數(shù)%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. /*開鎖檢測(cè)*/
  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++)//測(cè)試使用
  331. //        {
  332. //                printf("user_id[%d]=%d\r\n",i,user_id[i]);
  333. //        }*/
  334. //        user_id[0]=user_id[0]&0x00ff;//還原用戶ID數(shù)組第一個(gè)數(shù)
  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);//測(cè)試使用
  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++)//測(cè)試使用
  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數(shù)組第一個(gè)數(shù)
  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);//測(cè)試使用
  383.             if(j==4)
  384.             {
  385.                 //printf("root驗(yàn)證成功\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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
RFID RC522 門禁系統(tǒng) -2018.12.02版.rar (331.75 KB, 下載次數(shù): 371)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:315259 發(fā)表于 2018-12-19 18:59 | 只看該作者
謝謝樓主分享了
回復(fù)

使用道具 舉報(bào)

板凳
ID:308785 發(fā)表于 2019-5-12 11:01 | 只看該作者
非常感謝,這還是比較詳細(xì)呢
回復(fù)

使用道具 舉報(bào)

地板
ID:641544 發(fā)表于 2019-11-13 22:29 | 只看該作者
謝謝樓主分享,好人一生平安
回復(fù)

使用道具 舉報(bào)

5#
ID:467442 發(fā)表于 2019-11-15 17:03 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

6#
ID:375715 發(fā)表于 2019-11-19 09:44 來自手機(jī) | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

7#
ID:544005 發(fā)表于 2020-1-12 08:39 | 只看該作者
xx謝謝分享!!!
回復(fù)

使用道具 舉報(bào)

8#
ID:72576 發(fā)表于 2020-1-12 12:25 | 只看該作者
學(xué)習(xí)一下,謝謝分享!!!
回復(fù)

使用道具 舉報(bào)

9#
ID:551295 發(fā)表于 2020-6-8 17:13 | 只看該作者
有上位機(jī)嗎?
回復(fù)

使用道具 舉報(bào)

10#
ID:427723 發(fā)表于 2020-6-16 08:44 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

11#
ID:887442 發(fā)表于 2021-3-1 20:36 | 只看該作者
學(xué)習(xí)一下這個(gè)模塊的用法,看來不容易
回復(fù)

使用道具 舉報(bào)

12#
ID:381245 發(fā)表于 2021-3-7 16:55 | 只看該作者
和原來做的指紋錄入有異曲同工之處,謝謝樓主的大公無私!!
回復(fù)

使用道具 舉報(bào)

13#
ID:1033546 發(fā)表于 2022-11-19 22:59 來自手機(jī) | 只看該作者
謝謝大佬分享
回復(fù)

使用道具 舉報(bào)

14#
ID:1084333 發(fā)表于 2023-6-15 17:17 | 只看該作者
非常感謝,這還是比較詳細(xì)呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲自拍偷拍视频 | 亚洲成人综合在线 | 亚洲精品久久久久中文字幕欢迎你 | 久久成人精品 | 日本不卡免费新一二三区 | 一区二区三区在线播放视频 | 男女羞羞免费视频 | 精品福利在线 | 色婷婷久久久亚洲一区二区三区 | 国产xxxx在线 | 在线观看欧美日韩视频 | 喷潮网站 | 欧美一区二| 99热这里都是精品 | 亚洲国产成人精品女人久久久 | 欧美v免费 | 欧美黑人一区 | 99久久精品免费看国产免费软件 | 亚洲第一视频网 | 久久蜜桃av一区二区天堂 | 欧美成人影院 | 国产成人高清视频 | 成人av网站在线观看 | 九九九色 | 久草精品在线 | 久久精品视频网站 | 久久精品无码一区二区三区 | 91免费看片神器 | 国产成人小视频 | www.操.com| 中文字幕日韩欧美一区二区三区 | 久热中文字幕 | 精品少妇一区二区三区日产乱码 | 欧美一区二区大片 | 亚洲国产精品久久 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 欧美日韩久久精品 | 国产精久久久 | 欧美精品一二三区 | 国产精品视频500部 a久久 | 亚洲男人天堂av |