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

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

QQ登錄

只需一步,快速開(kāi)始

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

stm32f103c8t6+rc522 ic卡識(shí)別程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
  基于stm32的IC卡識(shí)別,做的是個(gè)門(mén)禁系統(tǒng),用的rc522模塊,設(shè)別IC卡卡號(hào),判斷卡號(hào)為管理員還是員工,進(jìn)行開(kāi)門(mén)操作,用的12v電磁鎖,添加了時(shí)鐘,來(lái)分開(kāi)上班時(shí)間和下班時(shí)間,以及假日模式,假日模式管理員卡和密碼同時(shí)正確才可打開(kāi)門(mén),下班時(shí)間管理員就可以打開(kāi)。最后加了電池,當(dāng)外部電源斷開(kāi),電池自動(dòng)供電,由外部電源電池不供電。

制作出來(lái)的實(shí)物圖如下:


單片機(jī)源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "rc522.h"
  4. #include "key.h"             //矩陣鍵盤(pán)模塊
  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];//卡類(lèi)型
  15. unsigned char SN[4]; //卡號(hào)
  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. /*函數(shù)聲明*/
  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, "請(qǐng)輸入密碼",TYPE16X16,TYPE8X16);
  78.                 while(1)
  79.                                 {
  80.                                         key_load();
  81.                                         //請(qǐng)輸入密碼
  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數(shù)組

  93.                                         //顯示輸入的密碼
  94.                                         if(plen==4) {//達(dá)到4位數(shù)密碼,進(jìn)行密碼對(duì)比
  95.                                         LCD_Fill(0x00);
  96.                                         if(panduan()==1){LCD_Print(24, 24, "密碼正確",TYPE16X16,TYPE8X16);flags=1;}
  97.                                         else LCD_Print(24, 32, "密碼錯(cuò)誤",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();                     //延時(shí)函數(shù)初始化       
  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();  //矩陣鍵盤(pán)利用外部中斷和輸出引腳構(gòu)成,先把輸出引腳低電平,按鍵閉合觸發(fā)檢測(cè)行,在出現(xiàn)一個(gè)下降沿,再次觸發(fā),檢測(cè)列
  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();//更新時(shí)間
  221.           key_load();  //鍵盤(pán)鍵值檢測(cè)
  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.                 }           //開(kāi)鎖
  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;  //輸入密碼開(kāi)鎖
  242.             }
  243.     }                       
  244.                                         delay_ms(100);
  245.                          key=16;
  246. }
  247. }
復(fù)制代碼

所有資料51hei提供下載:
門(mén)禁.7z (213.59 KB, 下載次數(shù): 143)
門(mén)鎖.pdf (77.41 KB, 下載次數(shù): 62)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:448525 發(fā)表于 2020-9-24 14:26 | 只看該作者
大佬這個(gè)引腳圖可以給一下嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:423533 發(fā)表于 2021-1-26 15:57 | 只看該作者
正好需要這個(gè)程序,謝謝樓主無(wú)私分享,希望講解一下RC522的工作原理
回復(fù)

使用道具 舉報(bào)

地板
ID:81138 發(fā)表于 2021-1-27 13:31 | 只看該作者
是兩種程序還是一種程序兩種用法
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线精品国产 | 一级毛片在线播放 | 欧美一级三级在线观看 | 99综合在线 | 欧美视频福利 | 成人欧美日韩一区二区三区 | 日本亚洲欧美 | 国产成人免费一区二区60岁 | 亚洲精选一区二区 | 97偷拍视频| 日韩欧美网| 午夜久久久| 99精品欧美一区二区三区综合在线 | 久久久久久国产精品免费免费 | 久久久久亚洲视频 | 91资源在线 | 中文字幕国产视频 | jizz在线免费观看 | 蜜桃视频一区二区三区 | 中文字幕免费中文 | 欧美日韩在线综合 | 国产欧美日韩一区二区三区在线 | 在线免费观看黄色 | 91最新视频 | 精一区二区 | 亚洲国产精品一区在线观看 | 成年人网站在线观看视频 | 成人福利网站 | 欧美视频免费 | 国产美女一区二区 | 国产亚洲一区二区三区 | 一区二区三区在线观看免费视频 | 久久久日韩精品一区二区三区 | 91大神新作在线观看 | av色站 | 精精国产视频 | 午夜影视在线观看 | 欧美精品黄 | 激情毛片 | 国产精品一区二区久久久久 | 九色在线观看 |