久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
RFID RC522門禁系統STM32源碼
[打印本頁]
作者:
低調的黑馬
時間:
2018-12-5 23:27
標題:
RFID RC522門禁系統STM32源碼
一份基于RFID RC522 的門禁系統,可實現用戶錄入,用戶刪除功能。
0.png
(15.13 KB, 下載次數: 83)
下載附件
2018-12-8 01:58 上傳
單片機源程序如下:
//硬件環境:德飛萊STM32開發板
//接線:SDA--PA3 SCK--PB13 MOSI--PB15 MISO--PB14 IRQ懸空 RST--PA4
#include "var.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "rtc.h"
#include "wkup.h"
#include "ADC.h"
#include "DAC.h"
#include "DMA.h"
#include "24c02.h"
#include "w25qxx.h"
#include "timer.h"
#include "oled.h"
#include "stmflash.h"
#include "rc522.h"
//要寫入到STM32 FLASH的字符串數組
u16 m=1212;
/*常量定義*/
#define N 10 //最大管理員數目
/*全局變量*/
u16 flash_adder=0;//閃存地址變化量
u16 people_num=0;
u16 root_num=0;
u16 ROOT_ID[4]= {174,115,14,46};
u16 user1[4]= {222,181,4,46};
u16 user2[4]= {219,225,48,47};
u8 key_flage=0;
u8 Key_Value=0;
u16 ID[4];//卡號
u16 id1[4];//卡號
u16 id2[4];//卡號
unsigned char CT[2];//卡類型
/*函數聲明*/
u8 Get_RC522_ID(u16 *p);
u8 ROOT_ID_Cheak(u16 *p);
u8 root_ID_Cheak(u16 *p);
u8 NormalUser_Input(u16 *p);
u8 RootUser_Input(u16 *p);
void unlock_check(u16 *p);
void User_ID_Play(u8 y,u8 x,u16 *p);
void Progress_Bar(u8 y,u8 x,u16 num,u8 n);
/*主函數*/
int main(void)
{
u8 keyvalue,i,j=0;
delay_init(); //延時函數初始化
uart_init(9600); //串口初始化為115200
LED_Init();//初始化
KEY_Init();
InitRc522();
OLED_Init(); //初始化OLED
OLED_Clear();
BEEP=0;
STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
STMFLASH_Write(FLASH_SAVE_ADDR+4,(u16*)&root_num,1);
printf("*%d\r\n",RootUser_Input(ROOT_ID));
ROOT_ID[0]=174;
printf("***********************\r\n");
while(1)
{
if(j==0) OLED_ShowString(10,-1,"Unocking model");
j++;
if(Get_RC522_ID(ID))
{
User_ID_Play(0,0,ID);
unlock_check(ID);
for(i=0; i<4; i++)
{
ID[i]=0;
}
}
/**********************************************************************/
if(Key_Test()==1)
{
OLED_Clear_Hang(0);
printf("用戶錄入模式\r\n");
j=1;
while(1)
{
if(j==1)
{
OLED_ShowString(0,-1,"User Entering");
OLED_ShowString(0,0,"Key2:Common User");
OLED_ShowString(0,1,"Key3:root User");
OLED_ShowString(0,2,"Key4:Exit");
}
j++;
printf("key2管理員用戶錄入 key3普通用戶錄入 key4退出錄入模式\r\n");
if(key_flage==0)
{
Key_Value=Key_Test();
if(Key_Value==2||Key_Value==3) key_flage=1;
}
/*******************************************************************************/
if(Key_Value==2)
{
OLED_Clear_Hang(1);
OLED_Clear_Hang(2);
OLED_Clear_Hang(3);
OLED_ShowString(0,0,"ROOT Cheak");
while(1)
{
printf("ROOT身份驗證\r\n");
if(Get_RC522_ID(ID))
{
if(ROOT_ID_Cheak(ID)==0)
{
printf("ROOT身份驗證成功,請錄入管理員卡號\r\n");
OLED_Clear_Hang(1);
OLED_ShowString(0,0,"ROOT Cheak OK");
OLED_ShowString(0,1,"Entering root ID");
while(1)
{
if(Get_RC522_ID(id1))
{
if(id1[0]!=ID[0]||id1[1]!=ID[1]||id1[2]!=ID[2]||id1[3]!=ID[3])
{
if(RootUser_Input(id1))
{
printf("管理員錄入成功\r\n");
key_flage=0;
break;
}
}
}
if(Key_Test()==4) break;
}
key_flage=0;
OLED_Clear();
break;
}
}
if(Key_Test()==4) break;
}
key_flage=0;
j=1;
OLED_Clear();
}
/**************************************************************************/
if(Key_Value==3)
{
//OLED_Clear_Hang(1);
OLED_Clear_Hang(2);
OLED_Clear_Hang(3);
OLED_ShowString(0,0,"root Cheak");
while(1)
{
printf("root身份驗證\r\n");
if(Get_RC522_ID(ID))
{
if(root_ID_Cheak(ID))
{
OLED_ShowString(0,0,"root Cheak OK");
OLED_ShowString(0,1,"Entering User ID");
while(1)
{
if(Get_RC522_ID(id2))
{
if(id2[0]!=ID[0]||id2[1]!=ID[1]||id2[2]!=ID[2]||id2[3]!=ID[3])
{
if(NormalUser_Input(id2))
{
printf("普通用戶錄入成功\r\n");
key_flage=0;
break;
}
}
}
if(Key_Test()==4) break;
}
break;
}
}
if(Key_Test()==4) break;
}
j=1;
key_flage=0;
}
/**************************************************************************/
if(Key_Test()==4) break;//退出用戶錄入模式返回開鎖模式
}
OLED_Clear();
j=0;
}
}
}
/*獲取卡號*/
u8 Get_RC522_ID(u16 *p)
{
u8 t=0;
if(PcdRequest(PICC_REQALL,CT)==0)/*尋卡*/
{
if(PcdAnticoll(p)==0)/*防沖撞*/
{
for(t=0; t<4; t++)
{
printf("%d\r\n",p[t]);
}
if(p[0]==0&&p[1]==0&&p[2]==0&&p[3]==0) return 0;
else return 1;
}
}else {
return 0;
}
}
u8 ROOT_ID_Cheak(u16 *p)
{
u8 n;
for(n=0; n<4; n++)
{
if(p[n]!=ROOT_ID[n]) break;
}
printf("%d\r\n",n);
if(n==4)
{
printf("The current user is:ROOT\r\n");
return 0;
}
}
/*普通用戶錄入*/
u8 NormalUser_Input(u16 *p)
{
u16 a[7],i;//測試使用
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
people_num=people_num+1;
p[0]=p[0]|0x0100;//將用戶身份標志位第九位標志為1,即普通用戶
people_num=people_num<<9;
p[0]=p[0]|people_num;//高7位標記為當前為第幾錄入
people_num=people_num>>9;
STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
STMFLASH_Write(FLASH_SAVE_ADDR+6+flash_adder,(u16*)p,4);
STMFLASH_Read(FLASH_SAVE_ADDR+6+flash_adder,(u16*)&a[3],4);//測試使用
flash_adder=flash_adder+8;
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)a,3);//測試使用
//STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&a[5],1);//測試使用
//STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&a[4],1);//測試使用
a[3]=a[3]&0x00ff;
p[0]=p[0]&0x00ff;
for(i=3; i<7; i++)
{
if(a[i]!=p[i-3]) break;
}
// printf("地址變化量 %d\r\n",a[0]);
// printf("錄入總人數%d\r\n",a[1]);
// printf("管理員人數%d\r\n",a[2]);
// printf("%d\r\n",a[3]);
// printf("%d\r\n",a[4]);
// printf("%d\r\n",a[5]);
// printf("%d\r\n",a[6]);
if(i==7)
{
return 1;
} else {
return 0;
}
}
/*管理員用戶錄入*/
u8 RootUser_Input(u16 *p)
{
u16 a[7],i;//測試使用
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
STMFLASH_Read(FLASH_SAVE_ADDR+4,(u16*)&root_num,1);
people_num=people_num+1;
root_num=root_num+1;
p[0]=p[0]|0x0000;//將用戶身份標志位第九位標志為0,即普通用戶
people_num=people_num<<9;
p[0]=p[0]|people_num;//高7位標記為當前為第幾錄入
people_num=people_num>>9;
STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
STMFLASH_Write(FLASH_SAVE_ADDR+4,(u16*)&root_num,1);
STMFLASH_Write(FLASH_SAVE_ADDR+6+flash_adder,(u16*)p,4);
STMFLASH_Read(FLASH_SAVE_ADDR+6+flash_adder,(u16*)&a[3],4);//測試使用
flash_adder=flash_adder+8;
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)a,3);//測試使用
//STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&a[5],1);//測試使用
//STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&a[4],1);//測試使用
a[3]=a[3]&0x00ff;
p[0]=p[0]&0x00ff;
for(i=3; i<7; i++)
{
if(a[i]!=p[i-3]) break;
}
// printf("%d\r\n",p[0]);
// printf("%d\r\n",p[1]);
// printf("%d\r\n",p[2]);
// printf("%d\r\n",p[3]);
// printf("%d\r\n",i);
// printf("地址變化量 %d\r\n",a[0]);
// printf("錄入總人數%d\r\n",a[1]);
// printf("管理員人數%d\r\n",a[2]);
// printf("%d\r\n",a[3]);
// printf("%d\r\n",a[4]);
// printf("%d\r\n",a[5]);
// printf("%d\r\n",a[6]);
if(i==7)
{
return 1;
} else {
return 0;
}
}
/*開鎖檢測*/
//void unlock_check(u16 *p)
//{
// u16 i=0,j=0;
// u16 user_id[4];
//// printf("%d\r\n",p[0]);
//// printf("%d\r\n",p[1]);
//// printf("%d\r\n",p[2]);
//// printf("%d\r\n",p[3]);
// STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
//// printf("people_num=%d\r\n",people_num);
// for(i=0; i<people_num; i++)
// {
// Progress_Bar(0,1,people_num,i+1);
// STMFLASH_Read(FLASH_SAVE_ADDR+6+(8*i),(u16*)user_id,4);
// /*for(i=0;i<4;i++)//測試使用
// {
// printf("user_id[%d]=%d\r\n",i,user_id[i]);
// }*/
// user_id[0]=user_id[0]&0x00ff;//還原用戶ID數組第一個數
//// printf("user_id[0]=%d\r\n",user_id[0]);
// for(j=0; j<4; j++)
// {
// if(user_id[j]!=p[j]) break;
// }
//// printf("j=%d\r\n",j);//測試使用
// if(j==4)
// {
// BEEP=1;
// delay_ms(3000);
// BEEP=0;
//// printf("開鎖成功\r\n");
// break;
// } else {
// delay_ms(3000);
// BEEP=0;
//// printf("開鎖失敗\r\n");
// }
// }
// OLED_Clear_Hang(1);
// OLED_Clear_Hang(2);
//}
u8 root_ID_Cheak(u16 *p)
{
u16 i=0,j=0;
u16 user_id[4];
// printf("%d\r\n",p[0]);
// printf("%d\r\n",p[1]);
// printf("%d\r\n",p[2]);
// printf("%d\r\n",p[3]);
STMFLASH_Write(FLASH_SAVE_ADDR+2,(u16*)&people_num,1);
// printf("people_num=%d\r\n",people_num);
for(i=0; i<people_num; i++)
{
STMFLASH_Read(FLASH_SAVE_ADDR+6+(8*i),(u16*)user_id,4);
/*for(i=0;i<4;i++)//測試使用
{
printf("user_id[%d]=%d\r\n",i,user_id[i]);
}*/
if((user_id[0]&0x0100)==0x0000)
{
user_id[0]=user_id[0]&0x00ff;//還原用戶ID數組第一個數
printf("user_id[0]=%d\r\n",user_id[0]);
for(j=0; j<4; j++)
{
if(user_id[j]!=p[j]) break;
}
// printf("j=%d\r\n",j);//測試使用
if(j==4)
{
//printf("root驗證成功\r\n");
return 1;
break;
}
}
}
}
void User_ID_Play(u8 y,u8 x,u16 *p)
{
u8 n,len[4]={0,0,0,0},m=0;
OLED_ShowString(y,x,"User ID:");
for(n=0;n<4;n++)
{
if(p[n]>9)
{
len[n]=2;
if(p[n]>99) len[n]=3;
}else{
len[n]=1;
}
if(n==0) OLED_ShowNum(63+y,x,p[n],len[n],12);
else
{
m+=len[n-1];
OLED_ShowNum(6*m+1+63+y,x,p[n],len[n],12);
}
}
}
void Progress_Bar(u8 y,u8 x,u16 num,u8 n)
{
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
RFID RC522 門禁系統 -2018.12.02版.rar
(331.75 KB, 下載次數: 371)
2018-12-8 01:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
@1234567890
時間:
2018-12-19 18:59
謝謝樓主分享了
作者:
suph007
時間:
2019-5-12 11:01
非常感謝,這還是比較詳細呢
作者:
IOTJy
時間:
2019-11-13 22:29
謝謝樓主分享,好人一生平安
作者:
dadaewqq
時間:
2019-11-15 17:03
學習一下
作者:
yyhlsf
時間:
2019-11-19 09:44
謝謝分享
作者:
ben0148
時間:
2020-1-12 08:39
xx謝謝分享!!!
作者:
yubo2007
時間:
2020-1-12 12:25
學習一下,謝謝分享!!!
作者:
666澤
時間:
2020-6-8 17:13
有上位機嗎?
作者:
jinniuxing88888
時間:
2020-6-16 08:44
謝謝分享!
作者:
bxian1974
時間:
2021-3-1 20:36
學習一下這個模塊的用法,看來不容易
作者:
BlueFox
時間:
2021-3-7 16:55
和原來做的指紋錄入有異曲同工之處,謝謝樓主的大公無私!!
作者:
來了來了噗
時間:
2022-11-19 22:59
謝謝大佬分享
作者:
sbhsc666
時間:
2023-6-15 17:17
非常感謝,這還是比較詳細呢
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩在线视频一区
|
国产一区二区在线免费观看
|
欧美精品久久
|
97视频久久
|
日韩视频一区二区三区
|
高清成人免费视频
|
人人鲁人人莫人人爱精品
|
欧美一区二区三区
|
久久精品无码一区二区三区
|
久久国产婷婷国产香蕉
|
一级日批片
|
成人在线观看中文字幕
|
妞干网福利视频
|
亚洲视频区
|
欧美精品一
|
在线视频日韩
|
久久精品国产一区二区电影
|
女女百合av大片一区二区三区九县
|
91综合在线观看
|
亚洲国产免费
|
免费国产一区二区
|
91天堂
|
欧美视频1
|
一区二区免费
|
在线视频国产一区
|
午夜视频精品
|
日韩a视频
|
一区二区三区视频在线观看
|
国产精品一区二
|
中文字幕亚洲精品
|
国产免费播放视频
|
亚洲iv一区二区三区
|
成人免费视频
|
伊人焦久影院
|
免费一区二区
|
国产成人在线一区二区
|
精品免费在线
|
99精品视频在线
|
久久久久久国产精品免费免费狐狸
|
在线色网
|
成人免费在线视频
|