久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1515|回復: 0
打印 上一主題 下一主題
收起左側

基于STM32單片機RC522 RFID門禁系統源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:1057946 發表于 2023-7-30 15:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
目前支持至多四張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)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产无套一区二区三区久久 | 黄色大片在线免费观看 | 日韩欧美在线视频播放 | 91久久久久久久久久久 | 国产日韩欧美激情 | 精品96久久久久久中文字幕无 | 最新国产精品 | 国产精品大片在线观看 | 一级黄色裸片 | 欧美日韩一区二区在线观看 | 成人福利在线 | 新疆少妇videos高潮 | 九九福利| 天堂中文字幕av | 一色一黄视频 | 精品久久亚洲 | 这里精品 | 国产午夜影院 | www.日本国产 | 国产精品免费看 | 亚洲三级在线观看 | 国产精品免费在线 | 永久免费av | 欧美网站一区 | 在线免费黄色小视频 | 久久婷婷香蕉热狠狠综合 | 欧美在线日韩 | 成年网站在线观看 | 久久国色 | 桃色五月 | 色综合久久天天综合网 | 午夜精品影院 | 天天操天天干天天爽 | 亚洲国产精品一区二区第一页 | 国产精品久久久久无码av | 精品在线一区 | 国产激情综合五月久久 | 国产精品123区 | 国产精品爱久久久久久久 | 久久精品国产免费 | 亚洲精品白浆高清久久久久久 |