找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 824|回复: 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, 下载次数: 46)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表