找回密码
 注册

QQ登录

只需一步,快速开始

搜索

stm32f103c8t6和rc522的门禁ic卡识别程序

[复制链接]
路漫漫 发表于 2020-5-21 01:20:06 | 显示全部楼层 |阅读模式
基于stm32的IC卡识别,做的是个门禁系统,用的rc522模块,设别IC卡卡号,判断卡号为管理员还是员工,进行开门操作,用的12v电磁锁,添加了时钟,来分开上班时间和下班时间,以及假日模式,假日模式管理员卡和密码同时正确才可打开门,下班时间管理员就可以打开。最后加了电池,当外部电源断开,电池自动供电,由外部电源电池不供电。
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币)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-21 21:38

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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