目前支持至多四張RFID卡存寫,可進行二次開發
具體接線操作見源碼中主函數頂部詳細描述,大致功能為先通過按鍵進入RFID寫卡操作進行寫卡,至多寫入四張RFID,后便可在尋卡界面進行讀卡操作,若識別到已存入的RFID蜂鳴器響應,舵機轉動相應角度以示開門操作,否則蜂鳴器進行報警。并可進行指定序列刪卡操作
下面附上主函數及源碼
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Flash.h"
#include "KEY.h"
#include "BUZZER.h"
#include "Servo.h"
#include "RC522.h"
uint8_t cardnumber,KeyNum,tempcard,select=0;
uint8_t flag_scan=1; //尋卡模式 1——尋卡
uint8_t flag_addcard=0; //寫卡模式 1——寫卡
uint8_t flag_deletecard=0; //刪卡模式 1——刪卡
extern uint8_t UID[4],Temp[4];
extern uint8_t UI0[4]; //卡片0ID數組
extern uint8_t UI1[4]; //卡片1ID數組
extern uint8_t UI2[4]; //卡片2ID數組
extern uint8_t UI3[4]; //卡片3ID數組
void RFID_Check(void);
void Read_Card(void);
int main(void)
{
Servo_Init();
Buzzer_Init();
Key_Init();
OLED_Init();
RFID_Init();
Servo_SetAngle(0);
Read_Card(); //上電后從flash中讀出已錄入的卡數據
while(1)
{
KeyNum = Key_Scan();
OLED_ShowString(1,1," Welcome Home! ");
OLED_ShowString(2,1," ");
//******************************* 主模式切換 **********************************//
if(KeyNum==1) //按下1鍵進入尋卡模式,上電初始化為尋卡模式
{
flag_scan=1;
flag_addcard=0;
flag_deletecard=0;
}
if(KeyNum==2) //按下2鍵進入寫卡模式
{
flag_scan=0;
flag_addcard=1;
flag_deletecard=0;
}
if(KeyNum==3) //按下3鍵進入刪卡模式
{
flag_scan=0;
flag_addcard=0;
flag_deletecard=1;
}
//******************************* 尋卡模式 **********************************//
if(flag_scan==1)
{
RFID_Check();
}
//******************************* 寫卡模式 **********************************//
while(flag_addcard==1) //寫卡模式
{
KeyNum = Key_Scan();
if(KeyNum==1) //寫卡模式中按下1鍵進入尋卡模式
{
flag_scan=1;
flag_addcard=0;
flag_deletecard=0;
}
if(KeyNum==3) //寫卡模式中按下3鍵進入刪卡模式
{
flag_scan=0;
flag_addcard=0;
flag_deletecard=1;
}
OLED_ShowString(1,1," Add Card: ");
if (PcdRequest(REQ_ALL, Temp) == MI_OK)
{
if (PcdAnticoll(UID) == MI_OK)
{
if(UI0[0] == 0xFF && UI0[1] == 0xFF && UI0[2] == 0xFF && UI0[3] == 0xFF) tempcard = 0; //判斷系統各卡數據區是否為空,為空才能寫入新卡
else if(UI1[0] == 0xFF && UI1[1] == 0xFF && UI1[2] == 0xFF && UI1[3] == 0xFF) tempcard = 1;
else if(UI2[0] == 0xFF && UI2[1] == 0xFF && UI2[2] == 0xFF && UI2[3] == 0xFF) tempcard = 2;
else if(UI3[0] == 0xFF && UI3[1] == 0xFF && UI3[2] == 0xFF && UI3[3] == 0xFF) tempcard = 3;
else tempcard = 4;
if(UID[0]==UI0[0] && UID[1]==UI0[1] && UID[2]==UI0[2] && UID[3]==UI0[3]) //判斷新卡是否已經錄入
{
tempcard = 5;
}
if(UID[0]==UI1[0] && UID[1]==UI1[1] && UID[2]==UI1[2] && UID[3]==UI1[3])
{
tempcard = 5;
}
if(UID[0]==UI2[0] && UID[1]==UI2[1] && UID[2]==UI2[2] && UID[3]==UI2[3])
{
tempcard = 5;
}
if(UID[0]==UI3[0] && UID[1]==UI3[1] && UID[2]==UI3[2] && UID[3]==UI3[3])
{
tempcard = 5;
}
switch(tempcard)
{
case 0:
{
UI0[0] = UID[0]; //將新卡數據寫入UI0[]數組
UI0[1] = UID[1];
UI0[2] = UID[2];
UI0[3] = UID[3];
FLASH_W(FLASH_ADDR1,UI0[0],UI0[1],UI0[2],UI0[3]); //將新卡數據存入flash
OLED_ShowString(1,1," Add Card 1 OK "); //寫卡成功,蜂鳴器響一聲
Buzzer1();
WaitCardOff(); //等待卡片移走
}break;
case 1:
{
UI1[0] = UID[0];
UI1[1] = UID[1];
UI1[2] = UID[2];
UI1[3] = UID[3];
FLASH_W(FLASH_ADDR2,UI1[0],UI1[1],UI1[2],UI1[3]);
OLED_ShowString(1,1," Add Card 2 OK ");
Buzzer1();
WaitCardOff();
}break;
case 2:
{
UI2[0] = UID[0];
UI2[1] = UID[1];
UI2[2] = UID[2];
UI2[3] = UID[3];
FLASH_W(FLASH_ADDR3,UI2[0],UI2[1],UI2[2],UI2[3]);
OLED_ShowString(1,1," Add Card 3 OK ");
Buzzer1();
WaitCardOff();
}break;
case 3:
{
UI3[0] = UID[0];
UI3[1] = UID[1];
UI3[2] = UID[2];
UI3[3] = UID[3];
FLASH_W(FLASH_ADDR4,UI3[0],UI3[1],UI3[2],UI3[3]);
OLED_ShowString(1,1," Add Card 4 OK ");
Buzzer1();
WaitCardOff();
}break;
case 4:
{
OLED_ShowString(1,1," NO memory "); //若4個存卡數組均已存入卡片則顯示無數據空間,蜂鳴器發出警報
Buzzer_Alarm();
WaitCardOff();
}
case 5:
{
OLED_ShowString(1,1," Existing Card! "); //若新卡已錄入,蜂鳴器發出警報
Buzzer_Alarm();
WaitCardOff();
}
default:break;
}
}
}
}
//********************************* 刪卡模式 **********************************//
while(flag_deletecard==1) //刪卡模式
{
OLED_ShowString(1,1," Delete Card: ");
KeyNum = Key_Scan();
if(KeyNum==4) //按下4鍵退出刪卡模式,進入尋卡模式
{
flag_scan=1;
flag_addcard=0;
flag_deletecard=0;
select=0;
}
if(KeyNum==1) //在刪卡模式下按下1鍵,選擇要刪除的卡片,卡片序列增加
{
select++;
if(select>=4 || select<1)select=0;
}
if(KeyNum==2) //在刪卡模式下按下2鍵,選擇要刪除的卡片,卡片序列減少
{
select--;
if(select>=4 || select<1)select=0;
}
switch (select)
{
case 0:
{
OLED_ShowString(2,1," Delete Card 1 ?");
if(KeyNum==3) //在刪卡模式下按下3鍵,刪除對應的卡片
{
FLASH_Clear(FLASH_ADDR1);
UI0[0]=0xFF;
UI0[1]=0xFF;
UI0[2]=0xFF;
UI0[3]=0xFF;
OLED_ShowString(2,1,"Clear Card 1 OK ");
Buzzer1(); //刪除成功后蜂鳴器響一聲
Delay_ms(1500);
}
}break;
case 1:
{
OLED_ShowString(2,1," Delete Card 2 ?");
if(KeyNum==3)
{
FLASH_Clear(FLASH_ADDR2);
UI1[0]=0xFF;
UI1[1]=0xFF;
UI1[2]=0xFF;
UI1[3]=0xFF;
OLED_ShowString(2,1,"Clear Card 2 OK ");
Buzzer1();
Delay_ms(1500);
}
}break;
case 2:
{
OLED_ShowString(2,1," Delete Card 3 ?");
if(KeyNum==3)
{
FLASH_Clear(FLASH_ADDR3);
UI2[0]=0xFF;
UI2[1]=0xFF;
UI2[2]=0xFF;
UI2[3]=0xFF;
OLED_ShowString(2,1,"Clear Card 3 OK ");
Buzzer1();
Delay_ms(1500);;
}
}break;
case 3:
{
OLED_ShowString(2,1," Delete Card 4 ?");
if(KeyNum==3)
{
FLASH_Clear(FLASH_ADDR4);
UI3[0]=0xFF;
UI3[1]=0xFF;
UI3[2]=0xFF;
UI3[3]=0xFF;
OLED_ShowString(2,1,"Clear Card 4 OK ");
Buzzer1();
Delay_ms(1500);
}
}break;
default:break;
}
}
}
}
//*************** 讀卡函數,讀卡并獲取卡編號 ************//
void RFID_Check()
{
cardnumber = Rc522Test(); //獲取卡編號
if(cardnumber == 0) //如果為0,表示“卡片錯誤”,系統中沒有這張卡
{
OLED_ShowString(1,1," Error card ");
Buzzer_Alarm(); //蜂鳴器發出警報
WaitCardOff(); //等待卡片移開
}
else if(cardnumber==1||cardnumber==2||cardnumber==3||cardnumber == 4) //如果卡編號為1-4,說明是系統中的4張卡
{
OLED_ShowString(1,1,"The CardID is: ");
OLED_ShowNum(1,15,cardnumber,2);
Buzzer2(); //蜂鳴器響兩聲
Servo_SetAngle(90); //舵機旋轉90度維持1.5秒
Delay_ms(1500);
Servo_SetAngle(0);
WaitCardOff(); //等待卡片移開
}
}
//**************** 從flash中讀取各卡信息 *************//
void Read_Card()
{
UI0[0]=FLASH_R(FLASH_ADDR1);
UI0[1]=FLASH_R(FLASH_ADDR1+2);
UI0[2]=FLASH_R(FLASH_ADDR1+4);
UI0[3]=FLASH_R(FLASH_ADDR1+6);
UI1[0]=FLASH_R(FLASH_ADDR2);
UI1[1]=FLASH_R(FLASH_ADDR2+2);
UI1[2]=FLASH_R(FLASH_ADDR2+4);
UI1[3]=FLASH_R(FLASH_ADDR2+6);
UI2[0]=FLASH_R(FLASH_ADDR3);
UI2[1]=FLASH_R(FLASH_ADDR3+2);
UI2[2]=FLASH_R(FLASH_ADDR3+4);
UI2[3]=FLASH_R(FLASH_ADDR3+6);
UI3[0]=FLASH_R(FLASH_ADDR4);
UI3[1]=FLASH_R(FLASH_ADDR4+2);
UI3[2]=FLASH_R(FLASH_ADDR4+4);
UI3[3]=FLASH_R(FLASH_ADDR4+6);
}
原理圖:無
程序:
程序.7z
(186.47 KB, 下載次數: 63)
2023-8-8 14:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|