找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1543|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于STM32單片機(jī)RC522 RFID門禁系統(tǒng)源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1057946 發(fā)表于 2023-7-30 15:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
目前支持至多四張RFID卡存寫,可進(jìn)行二次開發(fā)
具體接線操作見源碼中主函數(shù)頂部詳細(xì)描述,大致功能為先通過(guò)按鍵進(jìn)入RFID寫卡操作進(jìn)行寫卡,至多寫入四張RFID,后便可在尋卡界面進(jìn)行讀卡操作,若識(shí)別到已存入的RFID蜂鳴器響應(yīng),舵機(jī)轉(zhuǎn)動(dòng)相應(yīng)角度以示開門操作,否則蜂鳴器進(jìn)行報(bào)警。并可進(jìn)行指定序列刪卡操作
下面附上主函數(shù)及源碼

#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——?jiǎng)h卡

extern uint8_t UID[4],Temp[4];
extern uint8_t UI0[4];                                                        //卡片0ID數(shù)組
extern uint8_t UI1[4];                                                        //卡片1ID數(shù)組
extern uint8_t UI2[4];                                                        //卡片2ID數(shù)組
extern uint8_t UI3[4];                                                        //卡片3ID數(shù)組

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中讀出已錄入的卡數(shù)據(jù)
        
        while(1)
        {        
                KeyNum = Key_Scan();
               
                OLED_ShowString(1,1,"  Welcome Home! ");
                OLED_ShowString(2,1,"                ");
               
//*******************************     主模式切換      **********************************//
                if(KeyNum==1)        //按下1鍵進(jìn)入尋卡模式,上電初始化為尋卡模式
                {
                        flag_scan=1;
                        flag_addcard=0;
                        flag_deletecard=0;
                }
                if(KeyNum==2)        //按下2鍵進(jìn)入寫卡模式
                {
                        flag_scan=0;
                        flag_addcard=1;
                        flag_deletecard=0;
                }
                if(KeyNum==3)        //按下3鍵進(jìn)入刪卡模式
                {
                        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鍵進(jìn)入尋卡模式
                        {
                                flag_scan=1;
                                flag_addcard=0;
                                flag_deletecard=0;
                        }
                        if(KeyNum==3)                //寫卡模式中按下3鍵進(jìn)入刪卡模式
                        {
                                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;        //判斷系統(tǒng)各卡數(shù)據(jù)區(qū)是否為空,為空才能寫入新卡
                                        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])        //判斷新卡是否已經(jīng)錄入
                                        {
                                                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];        //將新卡數(shù)據(jù)寫入U(xiǎn)I0[]數(shù)組
                                                        UI0[1] = UID[1];
                                                        UI0[2] = UID[2];
                                                        UI0[3] = UID[3];
                                                        FLASH_W(FLASH_ADDR1,UI0[0],UI0[1],UI0[2],UI0[3]);        //將新卡數(shù)據(jù)存入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個(gè)存卡數(shù)組均已存入卡片則顯示無(wú)數(shù)據(jù)空間,蜂鳴器發(fā)出警報(bào)
                                                        Buzzer_Alarm();
                                                        WaitCardOff();
                                                }
                                                case 5:
                                                {        
                                                        OLED_ShowString(1,1," Existing Card! ");        //若新卡已錄入,蜂鳴器發(fā)出警報(bào)
                                                        Buzzer_Alarm();
                                                        WaitCardOff();
                                                }
                                                default:break;
                                         }
                                }
                        }
                }
               
//*********************************     刪卡模式      **********************************//
                while(flag_deletecard==1)        //刪卡模式
                {
                        OLED_ShowString(1,1,"  Delete Card:  ");
                        KeyNum = Key_Scan();
                        
                        if(KeyNum==4)        //按下4鍵退出刪卡模式,進(jìn)入尋卡模式
                        {
                                flag_scan=1;
                                flag_addcard=0;
                                flag_deletecard=0;
                                select=0;
                        }
                        
                        
                        if(KeyNum==1)        //在刪卡模式下按下1鍵,選擇要?jiǎng)h除的卡片,卡片序列增加
                        {
                                select++;
                                if(select>=4 || select<1)select=0;
                        }
                        if(KeyNum==2)        //在刪卡模式下按下2鍵,選擇要?jiǎng)h除的卡片,卡片序列減少
                        {
                                select--;
                                if(select>=4 || select<1)select=0;
                        }
                        
                        
                        switch (select)
                        {
                                case 0:
                                {
                                        OLED_ShowString(2,1," Delete Card 1 ?");
                                        if(KeyNum==3)        //在刪卡模式下按下3鍵,刪除對(duì)應(yīng)的卡片
                                        {
                                                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;
                        }
                }
        }
}


//***************       讀卡函數(shù),讀卡并獲取卡編號(hào)        ************//
void RFID_Check()                                                                        
{
        cardnumber = Rc522Test();        //獲取卡編號(hào)
        if(cardnumber == 0)                        //如果為0,表示“卡片錯(cuò)誤”,系統(tǒng)中沒(méi)有這張卡
        {
                OLED_ShowString(1,1,"   Error card   ");
                Buzzer_Alarm();                //蜂鳴器發(fā)出警報(bào)
                WaitCardOff();                //等待卡片移開
        }
        else if(cardnumber==1||cardnumber==2||cardnumber==3||cardnumber == 4)                        //如果卡編號(hào)為1-4,說(shuō)明是系統(tǒng)中的4張卡
        {        
                OLED_ShowString(1,1,"The CardID is:  ");
                OLED_ShowNum(1,15,cardnumber,2);
                Buzzer2();                        //蜂鳴器響兩聲
                Servo_SetAngle(90);        //舵機(jī)旋轉(zhuǎn)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);
}


原理圖:無(wú)
程序: 程序.7z (186.47 KB, 下載次數(shù): 63)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表