找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4205|回复: 3
收起左侧

stm32f103c8t6+rc522 ic卡识别程序

[复制链接]
ID:547792 发表于 2020-5-6 21:57 | 显示全部楼层 |阅读模式
  基于stm32的IC卡识别,做的是个门禁系统,用的rc522模块,设别IC卡卡号,判断卡号为管理员还是员工,进行开门操作,用的12v电磁锁,添加了时钟,来分开上班时间和下班时间,以及假日模式,假日模式管理员卡和密码同时正确才可打开门,下班时间管理员就可以打开。最后加了电池,当外部电源断开,电池自动供电,由外部电源电池不供电。

制作出来的实物图如下:
IMG_20200501_141440.jpg

单片机源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "rc522.h"
  4. #include "key.h"             //矩阵键盘模块
  5. #include "usart.h"
  6. #include "string.h"
  7. #include "suo.h"
  8. #include "rtc.h"
  9. #include "oled.h"
  10. #include "adc.h"

  11. u8 key;
  12. extern u8 F8X16[];
  13. u8 data_out[16];
  14. unsigned char CT[2];//卡类型
  15. unsigned char SN[4]; //卡号
  16. unsigned char RFID[16];                        //存放RFID
  17. unsigned char lxl_bit=0;
  18. unsigned char card_bit=0;
  19. unsigned char total=0;
  20. unsigned char card[30]={153,172,26,163,71,133,84,59,102,94,109,37};
  21. unsigned char KEY[4];
  22. unsigned char MI[4]={3,9,1,8};
  23. u8 status,flags=0,weeks=0,power=0,suo=0;

  24. u8 xianshi[17]={1,2,3,10,4,5,6,11,7,8,9,12,13,0,14,15,16};
  25. u8 str[6];
  26. u8 plen=0;
  27.    u8 s;
  28. u8 T=100,TT=100;
  29. /*函数声明*/
  30. typedef struct
  31. {
  32.         vu8 hour;
  33.         vu8 min;
  34.         vu8 sec;                       
  35.         //公历日月年周
  36.         vu16 w_year;
  37.         vu8  w_month;
  38.         vu8  w_date;
  39.         vu8  week;                 
  40. }set_calendar_obj;
  41. set_calendar_obj set_time;

  42. u8 jiance(void)
  43. {
  44.         u8 i,j,turns=0,m=0;       
  45.         for(i=0;i<50;i++)
  46.         {
  47.         for(j=0;j<4;j++)
  48.         {
  49.                 if(SN[j]==card[j+i*4])
  50.                 {turns=1;m++;}
  51.                 else{m=0; turns=0;}

  52.         }
  53.                         if(m==4)break;
  54. }
  55.         if(turns==1)return i;
  56.         return 255;
  57.        
  58. }
  59. u8 panduan()
  60. {
  61.         u8 i,t=0;
  62.         for(i=0;i<4;i++){
  63.         if(KEY[i]==MI[i])
  64.                 t=1;
  65.         else t=0;
  66.    }
  67.         if(t==1)return 1;
  68.    else return 0;
  69.        
  70. }
  71. u8 shuru()
  72. {
  73.         u32 m=0,num=0;
  74.         key=16;
  75.         plen=0;
  76.                                         LCD_Fill(0x00);
  77.                                 LCD_Print(20, 16, "请输入密码",TYPE16X16,TYPE8X16);
  78.                 while(1)
  79.                                 {
  80.                                         key_load();
  81.                                         //请输入密码
  82.                                 if(key<16){
  83.                                         num=0;
  84.                         if(key==3){plen--;m/=10;}//删减输入的密码
  85.                                 else{        plen++;
  86.        m=m*10+xianshi[key];       
  87.        LCD_Print(24, 32, "       ",TYPE16X16,TYPE8X16);                                       
  88.                     KEY[plen-1]=xianshi[key];
  89.                                 }
  90.                                 LCD_Print(35, 32, "        ",TYPE16X16,TYPE8X16);
  91.                                  LCD_ShowNum(35,32,m,6,16);       
  92.                                 }//将输入的密码添加到KEY数组

  93.                                         //显示输入的密码
  94.                                         if(plen==4) {//达到4位数密码,进行密码对比
  95.                                         LCD_Fill(0x00);
  96.                                         if(panduan()==1){LCD_Print(24, 24, "密码正确",TYPE16X16,TYPE8X16);flags=1;}
  97.                                         else LCD_Print(24, 32, "密码错误",TYPE16X16,TYPE8X16);
  98.                                         delay_ms(2000);
  99.                                                 break;
  100.                                         }
  101.                                         num++;if(num>300)break;
  102.                                         delay_ms(100);
  103.                                         key=16;
  104.                                 }
  105.                                 LCD_Fill(0x00);
  106.                                 T=100,TT=100;
  107. }


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



  194. int main(void)
  195. {               
  196.         u8 num=0,i;
  197.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  198.         delay_init();                     //延时函数初始化       
  199.         RTC_Init();        //RTC初始化       
  200.          //RTC_Set(2020,5,1,14,20,0);  
  201.          uart_init(115200);
  202.          LCD_Init();
  203.    SUO_Init();
  204.                 key_Init();  //矩阵键盘利用外部中断和输出引脚构成,先把输出引脚低电平,按键闭合触发检测行,在出现一个下降沿,再次触发,检测列
  205.     InitRc522();                                //初始化射频卡模块
  206.         while(1)
  207.         {       
  208.                 num++;
  209.                 if(num>50)
  210.                 break;
  211.                 if(key==15)
  212.                 {GPIO_SetBits(GPIOA,GPIO_Pin_4);break;}
  213.                 delay_ms(100);
  214.                 key_load();
  215.         }  
  216.                 key=16;
  217.           while(1)
  218.         {       
  219.           IC();               
  220.                 TIME();//更新时间
  221.           key_load();  //键盘键值检测
  222.                 if(flags==1)
  223.                 {
  224.                         SUO=1;
  225.         for(i=0;i<9;i++)
  226.                         delay_ms(1000);
  227.                                         SUO=0;num=0;
  228.                                 delay_ms(1000);
  229.                 T=100,TT=100;
  230.    flags=0;
  231.                 LCD_Init();
  232.                 }           //开锁
  233.         if(key==11)weeks=~weeks;//假期模式选择
  234.   if(weeks)LCD_Print(96, 48, "假日",TYPE16X16,TYPE8X16);
  235.    else LCD_Print(96, 48, "    ",TYPE16X16,TYPE8X16);
  236.                 if(key==12)flags=1; //紧急按键
  237.         if(weeks==0)
  238.                         {
  239.                         if(key==7)
  240.                         {
  241.       if(shuru()==1)flags=1;  //输入密码开锁
  242.             }
  243.     }                       
  244.                                         delay_ms(100);
  245.                          key=16;
  246. }
  247. }
复制代码

所有资料51hei提供下载:
门禁.7z (213.59 KB, 下载次数: 143)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:448525 发表于 2020-9-24 14:26 | 显示全部楼层
大佬这个引脚图可以给一下吗?
回复

使用道具 举报

ID:423533 发表于 2021-1-26 15:57 | 显示全部楼层
正好需要这个程序,谢谢楼主无私分享,希望讲解一下RC522的工作原理
回复

使用道具 举报

ID:81138 发表于 2021-1-27 13:31 | 显示全部楼层
是两种程序还是一种程序两种用法
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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