|
一份基于RFID RC522 的門禁系統(tǒng),可實(shí)現(xiàn)用戶錄入,用戶刪除功能。
0.png (15.13 KB, 下載次數(shù): 83)
下載附件
2018-12-8 01:58 上傳
單片機(jī)源程序如下:
- //硬件環(huán)境:德飛萊STM32開發(fā)板
- //接線: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的字符串?dāng)?shù)組
- u16 m=1212;
- /*常量定義*/
- #define N 10 //最大管理員數(shù)目
- /*全局變量*/
- 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];//卡號(hào)
- u16 id1[4];//卡號(hào)
- u16 id2[4];//卡號(hào)
- unsigned char CT[2];//卡類型
- /*函數(shù)聲明*/
- 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);
- /*主函數(shù)*/
- int main(void)
- {
- u8 keyvalue,i,j=0;
- delay_init(); //延時(shí)函數(shù)初始化
- 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身份驗(yàn)證\r\n");
-
- if(Get_RC522_ID(ID))
- {
- if(ROOT_ID_Cheak(ID)==0)
- {
- printf("ROOT身份驗(yàn)證成功,請(qǐng)錄入管理員卡號(hào)\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身份驗(yàn)證\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;
- }
- }
- }
- /*獲取卡號(hào)*/
- 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;//測(cè)試使用
- 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;//將用戶身份標(biāo)志位第九位標(biāo)志為1,即普通用戶
- people_num=people_num<<9;
- p[0]=p[0]|people_num;//高7位標(biāo)記為當(dāng)前為第幾錄入
- 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);//測(cè)試使用
- flash_adder=flash_adder+8;
- STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
- STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)a,3);//測(cè)試使用
- //STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&a[5],1);//測(cè)試使用
- //STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&a[4],1);//測(cè)試使用
- 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("錄入總?cè)藬?shù)%d\r\n",a[1]);
- // printf("管理員人數(shù)%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;//測(cè)試使用
- 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;//將用戶身份標(biāo)志位第九位標(biāo)志為0,即普通用戶
- people_num=people_num<<9;
- p[0]=p[0]|people_num;//高7位標(biāo)記為當(dāng)前為第幾錄入
- 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);//測(cè)試使用
- flash_adder=flash_adder+8;
- STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flash_adder,1);
- STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)a,3);//測(cè)試使用
- //STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&a[5],1);//測(cè)試使用
- //STMFLASH_Read(FLASH_SAVE_ADDR+2,(u16*)&a[4],1);//測(cè)試使用
- 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("錄入總?cè)藬?shù)%d\r\n",a[1]);
- // printf("管理員人數(shù)%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;
- }
- }
- /*開鎖檢測(cè)*/
- //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++)//測(cè)試使用
- // {
- // printf("user_id[%d]=%d\r\n",i,user_id[i]);
- // }*/
- // user_id[0]=user_id[0]&0x00ff;//還原用戶ID數(shù)組第一個(gè)數(shù)
- //// 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);//測(cè)試使用
- // 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++)//測(cè)試使用
- {
- 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數(shù)組第一個(gè)數(shù)
- 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);//測(cè)試使用
- if(j==4)
- {
- //printf("root驗(yàn)證成功\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)
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
RFID RC522 門禁系統(tǒng) -2018.12.02版.rar
(331.75 KB, 下載次數(shù): 371)
2018-12-8 01:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|