基于stm32的IC卡識別,做的是個門禁系統,用的rc522模塊,設別IC卡卡號,判斷卡號為管理員還是員工,進行開門操作,用的12v電磁鎖,添加了時鐘,來分開上班時間和下班時間,以及假日模式,假日模式管理員卡和密碼同時正確才可打開門,下班時間管理員就可以打開。最后加了電池,當外部電源斷開,電池自動供電,由外部電源電池不供電。
1.jpg (71.56 KB)
下載附件
2021-10-11 01:35 上傳
部分源碼:
- u8 key;
- extern u8 F8X16[];
- u8 data_out[16];
- unsigned char CT[2];//卡類型
- unsigned char SN[4]; //卡號
- unsigned char RFID[16]; //存放RFID
- unsigned char lxl_bit=0;
- unsigned char card_bit=0;
- unsigned char total=0;
- unsigned char card[30]={153,172,26,163,71,133,84,59,102,94,109,37};
- unsigned char KEY[4];
- unsigned char MI[4]={3,9,1,8};
- u8 status,flags=0,weeks=0,power=0,suo=0;
- u8 xianshi[17]={1,2,3,10,4,5,6,11,7,8,9,12,13,0,14,15,16};
- u8 str[6];
- u8 plen=0;
- u8 s;
- u8 T=100,TT=100;
- /*函數聲明*/
- typedef struct
- {
- vu8 hour;
- vu8 min;
- vu8 sec;
- //公歷日月年周
- vu16 w_year;
- vu8 w_month;
- vu8 w_date;
- vu8 week;
- }set_calendar_obj;
- set_calendar_obj set_time;
- u8 jiance(void)
- {
- u8 i,j,turns=0,m=0;
- for(i=0;i<50;i++)
- {
- for(j=0;j<4;j++)
- {
- if(SN[j]==card[j+i*4])
- {turns=1;m++;}
- else{m=0; turns=0;}
- }
- if(m==4)break;
- }
- if(turns==1)return i;
- return 255;
-
- }
- u8 panduan()
- {
- u8 i,t=0;
- for(i=0;i<4;i++){
- if(KEY[i]==MI[i])
- t=1;
- else t=0;
- }
- if(t==1)return 1;
- else return 0;
-
- }
- u8 shuru()
- {
- u32 m=0,num=0;
- key=16;
- plen=0;
- LCD_Fill(0x00);
- LCD_Print(20, 16, "請輸入密碼",TYPE16X16,TYPE8X16);
- while(1)
- {
- key_load();
- //請輸入密碼
- if(key<16){
- num=0;
- if(key==3){plen--;m/=10;}//刪減輸入的密碼
- else{ plen++;
- m=m*10+xianshi[key];
- LCD_Print(24, 32, " ",TYPE16X16,TYPE8X16);
- KEY[plen-1]=xianshi[key];
- }
- LCD_Print(35, 32, " ",TYPE16X16,TYPE8X16);
- LCD_ShowNum(35,32,m,6,16);
- }//將輸入的密碼添加到KEY數組
- //顯示輸入的密碼
- if(plen==4) {//達到4位數密碼,進行密碼對比
- LCD_Fill(0x00);
- if(panduan()==1){LCD_Print(24, 24, "密碼正確",TYPE16X16,TYPE8X16);flags=1;}
- else LCD_Print(24, 32, "密碼錯誤",TYPE16X16,TYPE8X16);
- delay_ms(2000);
- break;
- }
- num++;if(num>300)break;
- delay_ms(100);
- key=16;
- }
- LCD_Fill(0x00);
- T=100,TT=100;
- }
- void TIME()
- {
- if(T!=calendar.min)
- {
- LCD_P32x32STR(52,16,640);
- if(calendar.hour>7&&calendar.hour<18)power=1;
- else power=0;
- if(calendar.week==6||calendar.week==0)weeks=1;
- else weeks=0;
- T=calendar.min;
- if(TT!=calendar.w_date)
- {
- LCD_Print(56, 0, "- -",TYPE16X16,TYPE8X16);
- LCD_Print(37, 48, "星期",TYPE16X16,TYPE8X16);
- LCD_ShowNum(24,0,calendar.w_year,4,16);
- LCD_ShowNum(64,0,calendar.w_month,2,16);
- LCD_ShowNum(88,0,calendar.w_date,2,16);
- TT=calendar.w_date;
- switch(calendar.week)
- {
- case 0:
- LCD_Print(69,48,"日",TYPE16X16,TYPE8X16);
- break;
- case 1:
- LCD_Print(69,48,"一",TYPE16X16,TYPE8X16);
- break;
- case 2:
- LCD_Print(69,48,"二",TYPE16X16,TYPE8X16);
- break;
- case 3:
- LCD_Print(69,48,"三",TYPE16X16,TYPE8X16);
- break;
- case 4:
- LCD_Print(69,48,"四",TYPE16X16,TYPE8X16);
- break;
- case 5:
- LCD_Print(69,48,"五",TYPE16X16,TYPE8X16);
- break;
- case 6:
- LCD_Print(69,48,"六",TYPE16X16,TYPE8X16);
- break;
- }
- }
- LCD_ShowNum(16,16,calendar.hour,2,32);
- LCD_ShowNum(70,16,calendar.min,2,32);
- }
- }
- u8 jianpan(u8 x,u8 y,u8 flagm)
- {
- key_load();
- if(xianshi[key]>=0&&xianshi[key]<=9)
- {
- //Gui_DrawFont_GBK16(x+plen*8,y,BLACK,WHITE,zhuanhuan(xianshi[key]));
- s=xianshi[key];
- plen++;
- return 1;
- }
- return 0;
- }
- void IC()
- {
- u8 j;
- status = PcdRequest(PICC_REQALL,CT);
- if(status==MI_OK)//尋卡成功
- {
- status=MI_ERR;
- status = PcdAnticoll(SN);
- for(j=0;j<4;j++)
- printf("%d ",SN[j]);
- printf("\r\n");
- }
- if (status==MI_OK)//防衝撞成功
- {
- total=jiance();
- if(weeks)
- {if(total==0) {
- if(shuru()==1)flags=1;
- }
- }
- else{
- if(total==0) flags=1;
- if(total&&power)flags=1;
- }
- printf("22\r\n");
- }
- }
- int main(void)
- {
- u8 num=0,i;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- delay_init(); //延時函數初始化
- RTC_Init(); //RTC初始化
- //RTC_Set(2020,5,1,14,20,0);
- uart_init(115200);
- LCD_Init();
- SUO_Init();
- key_Init(); //矩陣鍵盤利用外部中斷和輸出引腳構成,先把輸出引腳低電平,按鍵閉合觸發檢測行,在出現一個下降沿,再次觸發,檢測列
- InitRc522(); //初始化射頻卡模塊
- while(1)
- {
- num++;
- if(num>50)
- break;
- if(key==15)
- {GPIO_SetBits(GPIOA,GPIO_Pin_4);break;}
- delay_ms(100);
- key_load();
- }
- key=16;
- while(1)
- {
- IC();
- TIME();//更新時間
- key_load(); //鍵盤鍵值檢測
- if(flags==1)
- {
- SUO=1;
- for(i=0;i<9;i++)
- delay_ms(1000);
- SUO=0;num=0;
- delay_ms(1000);
- T=100,TT=100;
- flags=0;
- LCD_Init();
- } //開鎖
- if(key==11)weeks=~weeks;//假期模式選擇
- if(weeks)LCD_Print(96, 48, "假日",TYPE16X16,TYPE8X16);
- else LCD_Print(96, 48, " ",TYPE16X16,TYPE8X16);
- if(key==12)flags=1; //緊急按鍵
- if(weeks==0)
- {
- if(key==7)
- {
- if(shuru()==1)flags=1; //輸入密碼開鎖
- }
- }
- delay_ms(100);
- key=16;
- }
復制代碼 完整源碼:
stm32門禁ic卡源碼.zip
(342.13 KB, 售價: 3 E幣)
2020-5-21 01:19 上傳
點擊文件名下載附件
售價: 3 E幣 [記錄]
[ 購買]
版權說明:本文檔由用戶提供并上傳,僅供個人學習用途,若內容存在侵權,請聯系我們刪除。
原理圖.pdf
(77.41 KB, 售價: 1 E幣)
2020-5-21 01:19 上傳
點擊文件名下載附件
售價: 1 E幣 [記錄]
[ 購買]
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|