国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
stm32f103c8t6和rc522的門禁ic卡識別程序
[打印本頁]
作者:
路漫漫
時間:
2020-5-21 01:20
標題:
stm32f103c8t6和rc522的門禁ic卡識別程序
基于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幣
[記錄]
[
購買
]
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0