国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

stm32f103c8t6和rc522的門禁ic卡識別程序

[復制鏈接]
樓主
路漫漫 發表于 2020-5-21 01:20:06 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
基于stm32的IC卡識別,做的是個門禁系統,用的rc522模塊,設別IC卡卡號,判斷卡號為管理員還是員工,進行開門操作,用的12v電磁鎖,添加了時鐘,來分開上班時間和下班時間,以及假日模式,假日模式管理員卡和密碼同時正確才可打開門,下班時間管理員就可以打開。最后加了電池,當外部電源斷開,電池自動供電,由外部電源電池不供電。
stm32f103c8t6和rc522的門禁ic卡識別程序 1.jpg

部分源碼:
  1. u8 key;
  2. extern u8 F8X16[];
  3. u8 data_out[16];
  4. unsigned char CT[2];//卡類型
  5. unsigned char SN[4]; //卡號
  6. unsigned char RFID[16];                        //存放RFID
  7. unsigned char lxl_bit=0;
  8. unsigned char card_bit=0;
  9. unsigned char total=0;
  10. unsigned char card[30]={153,172,26,163,71,133,84,59,102,94,109,37};
  11. unsigned char KEY[4];
  12. unsigned char MI[4]={3,9,1,8};
  13. u8 status,flags=0,weeks=0,power=0,suo=0;

  14. u8 xianshi[17]={1,2,3,10,4,5,6,11,7,8,9,12,13,0,14,15,16};
  15. u8 str[6];
  16. u8 plen=0;
  17.    u8 s;
  18. u8 T=100,TT=100;
  19. /*函數聲明*/
  20. typedef struct
  21. {
  22.         vu8 hour;
  23.         vu8 min;
  24.         vu8 sec;                       
  25.         //公歷日月年周
  26.         vu16 w_year;
  27.         vu8  w_month;
  28.         vu8  w_date;
  29.         vu8  week;                 
  30. }set_calendar_obj;
  31. set_calendar_obj set_time;

  32. u8 jiance(void)
  33. {
  34.         u8 i,j,turns=0,m=0;      
  35.         for(i=0;i<50;i++)
  36.         {
  37.         for(j=0;j<4;j++)
  38.         {
  39.                 if(SN[j]==card[j+i*4])
  40.                 {turns=1;m++;}
  41.                 else{m=0; turns=0;}

  42.         }
  43.                         if(m==4)break;
  44. }
  45.         if(turns==1)return i;
  46.         return 255;
  47.       
  48. }
  49. u8 panduan()
  50. {
  51.         u8 i,t=0;
  52.         for(i=0;i<4;i++){
  53.         if(KEY[i]==MI[i])
  54.                 t=1;
  55.         else t=0;
  56.    }
  57.         if(t==1)return 1;
  58.    else return 0;
  59.       
  60. }
  61. u8 shuru()
  62. {
  63.         u32 m=0,num=0;
  64.         key=16;
  65.         plen=0;
  66.                                         LCD_Fill(0x00);
  67.                                 LCD_Print(20, 16, "請輸入密碼",TYPE16X16,TYPE8X16);
  68.                 while(1)
  69.                                 {
  70.                                         key_load();
  71.                                         //請輸入密碼
  72.                                 if(key<16){
  73.                                         num=0;
  74.                         if(key==3){plen--;m/=10;}//刪減輸入的密碼
  75.                                 else{        plen++;
  76.        m=m*10+xianshi[key];      
  77.        LCD_Print(24, 32, "       ",TYPE16X16,TYPE8X16);                                       
  78.                     KEY[plen-1]=xianshi[key];
  79.                                 }
  80.                                 LCD_Print(35, 32, "        ",TYPE16X16,TYPE8X16);
  81.                                  LCD_ShowNum(35,32,m,6,16);      
  82.                                 }//將輸入的密碼添加到KEY數組

  83.                                         //顯示輸入的密碼
  84.                                         if(plen==4) {//達到4位數密碼,進行密碼對比
  85.                                         LCD_Fill(0x00);
  86.                                         if(panduan()==1){LCD_Print(24, 24, "密碼正確",TYPE16X16,TYPE8X16);flags=1;}
  87.                                         else LCD_Print(24, 32, "密碼錯誤",TYPE16X16,TYPE8X16);
  88.                                         delay_ms(2000);
  89.                                                 break;
  90.                                         }
  91.                                         num++;if(num>300)break;
  92.                                         delay_ms(100);
  93.                                         key=16;
  94.                                 }
  95.                                 LCD_Fill(0x00);
  96.                                 T=100,TT=100;
  97. }


  98. void TIME()
  99. {      
  100.                 if(T!=calendar.min)
  101.                 {      
  102.         LCD_P32x32STR(52,16,640);
  103.         if(calendar.hour>7&&calendar.hour<18)power=1;
  104.         else power=0;
  105.         if(calendar.week==6||calendar.week==0)weeks=1;
  106.         else weeks=0;
  107.                         T=calendar.min;
  108.                         if(TT!=calendar.w_date)
  109.                         {
  110.                                 LCD_Print(56, 0, "-  -",TYPE16X16,TYPE8X16);
  111.                                 LCD_Print(37, 48, "星期",TYPE16X16,TYPE8X16);
  112.         LCD_ShowNum(24,0,calendar.w_year,4,16);
  113.         LCD_ShowNum(64,0,calendar.w_month,2,16);      
  114.         LCD_ShowNum(88,0,calendar.w_date,2,16);
  115.   TT=calendar.w_date;      
  116.                 switch(calendar.week)
  117.                         {
  118.                                 case 0:
  119.                                 LCD_Print(69,48,"日",TYPE16X16,TYPE8X16);
  120.                                         break;
  121.                                 case 1:
  122.                                 LCD_Print(69,48,"一",TYPE16X16,TYPE8X16);
  123.                                         break;
  124.                                 case 2:
  125.                                 LCD_Print(69,48,"二",TYPE16X16,TYPE8X16);
  126.                                         break;
  127.                                 case 3:
  128.                                 LCD_Print(69,48,"三",TYPE16X16,TYPE8X16);
  129.                                         break;
  130.                                 case 4:
  131.                                 LCD_Print(69,48,"四",TYPE16X16,TYPE8X16);
  132.                                         break;
  133.                                 case 5:
  134.                                 LCD_Print(69,48,"五",TYPE16X16,TYPE8X16);
  135.                                         break;
  136.                                 case 6:
  137.                                 LCD_Print(69,48,"六",TYPE16X16,TYPE8X16);
  138.                                         break;  
  139.                         }                              
  140.                         }                              
  141.         LCD_ShowNum(16,16,calendar.hour,2,32);      
  142.         LCD_ShowNum(70,16,calendar.min,2,32);                       
  143.                 }
  144.         }
  145. u8 jianpan(u8 x,u8 y,u8 flagm)
  146. {
  147.    key_load();
  148.         if(xianshi[key]>=0&&xianshi[key]<=9)
  149.                 {
  150.                         //Gui_DrawFont_GBK16(x+plen*8,y,BLACK,WHITE,zhuanhuan(xianshi[key]));                        
  151.                         s=xianshi[key];      
  152.                         plen++;
  153.       return 1;                                       
  154.                 }               
  155. return 0;
  156. }
  157. void IC()
  158. {
  159.         u8 j;
  160.                 status = PcdRequest(PICC_REQALL,CT);
  161.                         if(status==MI_OK)//尋卡成功
  162.                         {
  163.                          status=MI_ERR;
  164.                          status = PcdAnticoll(SN);
  165.          for(j=0;j<4;j++)
  166.                                 printf("%d  ",SN[j]);
  167.                                 printf("\r\n");
  168.                         }
  169.                         if (status==MI_OK)//防衝撞成功
  170.                         {      
  171.                                 total=jiance();
  172.                                 if(weeks)
  173.                                 {if(total==0) {
  174.                                 if(shuru()==1)flags=1;
  175.                                   }
  176.                                 }
  177.                                 else{
  178.                                 if(total==0) flags=1;
  179.                                 if(total&&power)flags=1;
  180.                                 }
  181.                                 printf("22\r\n");
  182.                         }
  183. }



  184. int main(void)
  185. {               
  186.         u8 num=0,i;
  187.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  188.         delay_init();                     //延時函數初始化      
  189.         RTC_Init();        //RTC初始化      
  190.          //RTC_Set(2020,5,1,14,20,0);  
  191.          uart_init(115200);
  192.          LCD_Init();
  193.    SUO_Init();
  194.                 key_Init();  //矩陣鍵盤利用外部中斷和輸出引腳構成,先把輸出引腳低電平,按鍵閉合觸發檢測行,在出現一個下降沿,再次觸發,檢測列
  195.     InitRc522();                                //初始化射頻卡模塊
  196.         while(1)
  197.         {      
  198.                 num++;
  199.                 if(num>50)
  200.                 break;
  201.                 if(key==15)
  202.                 {GPIO_SetBits(GPIOA,GPIO_Pin_4);break;}
  203.                 delay_ms(100);
  204.                 key_load();
  205.         }  
  206.                 key=16;
  207.           while(1)
  208.         {      
  209.           IC();               
  210.                 TIME();//更新時間
  211.           key_load();  //鍵盤鍵值檢測
  212.                 if(flags==1)
  213.                 {
  214.                         SUO=1;
  215.         for(i=0;i<9;i++)
  216.                         delay_ms(1000);
  217.                                         SUO=0;num=0;
  218.                                 delay_ms(1000);
  219.                 T=100,TT=100;
  220.    flags=0;
  221.                 LCD_Init();
  222.                 }           //開鎖
  223.         if(key==11)weeks=~weeks;//假期模式選擇
  224.   if(weeks)LCD_Print(96, 48, "假日",TYPE16X16,TYPE8X16);
  225.    else LCD_Print(96, 48, "    ",TYPE16X16,TYPE8X16);
  226.                 if(key==12)flags=1; //緊急按鍵
  227.         if(weeks==0)
  228.                         {
  229.                         if(key==7)
  230.                         {
  231.       if(shuru()==1)flags=1;  //輸入密碼開鎖
  232.             }
  233.     }                       
  234.                                         delay_ms(100);
  235.                          key=16;
  236. }
復制代碼
完整源碼: stm32門禁ic卡源碼.zip (342.13 KB, 售價: 3 E幣)
原理圖.pdf (77.41 KB, 售價: 1 E幣)
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 03:42

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表