
基于RC522的门禁系统设计
简介
本人毕业设计电路板,集刷卡,舵机,蓝牙,电源电路为一体的刷卡系统。
简介:本人毕业设计电路板,集刷卡,舵机,蓝牙,电源电路为一体的刷卡系统。开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
题目
基于RC522的门禁系统设计
题目分析
本文介绍了一种基于RC522射频芯片的门禁系统设计。该系统将射频辨识与IC卡技术相结合。以STM32F103C8为主控芯片,通过SPI通信技术与MFRC522芯片通信,识别并读取IC卡扇区数据来判断该卡是否有权限进入。结合蓝牙芯片与上位机进行通信,实现上位机自定义对该门禁系统的参数设置,以及对门禁系统的模式切换、密码开门、添加和删除IC卡的功能控制,同时该系统也将写卡、读卡一体化,提高了操作的便捷性。
总体设计方案框图
原理图设计说明
提示:说明作品中模块的设计原理图,需要配上原理图,最好是有实物图一起,每个模块都需要说明,如不需要设计的,请说明获取来源。
PCB设计说明
注意2.4g天线处要设置禁止铺铜区域并且周围打上GND的过孔防止信号干扰
软件说明
截取部分代码并非全部代码包含了本程序的主要逻辑和思路其他的为一些器件的驱动代码一般来说网上的都可以查询到,可进行自定义配置,这里不做过多赘述。此外本系统还有一个上位机使用微信小程序开发平台进行开发的,因为我用到蓝牙芯片是ecb01-c厂商的官网有资料他们设计好的小程序实例代码,利用官方的实例代码做了一些改动很容易操作这里就不放了。
软件总体设计框架
系统主程序
射频模块程序设计
串口通信程序设计
代码块:
//主函数区域
#include "stm32f10x.h" // Device header
#include "led.h"
#include "buzzer.h"
#include "usart.h"
#include "spi.h"
#include "rc522.h"
#include "Delay.h"
#include "lift.h"
#include "timer.h"
#include "server.h"
#include
#include
int main(void){
buzzer_init(); //蜂鸣器初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断设置
LED_Init(); //led初始化
TIM2_PWM_Init(200-1,7200-1); //PWM输出初始化 舵机
RC522_Init(); //rc522初始化
usart_init(9600); //串口初始化,参数为波特率
buzzer(2,100,100); //初始化完成提示,蜂鸣器响两声
while(1)
{
if(mainmode==1){Data_analysis();} //自动寻卡
usart_handle(); //串口调试
}
}
//寻卡函数
char rc522_read(u8 Sector,u8 block){
//testkeyAB(Sector,block);//验证ab密钥rc522_read(Sector,block);
if(block==0){//块0
if(PcdAuthState(PICC_AUTHENT1A,Sector*4+block,KEY_A,SN)!=MI_OK){LED_star1();return 1;}//验证,如果失败led闪烁
if(PcdRead(Sector*4+block,Data0)!=MI_OK){return 1;}//读取块
//发送数据到串口
Serial_SendByte(0xA0);
Serial_SendArray(Data0,16);
Serial_SendByte(0xAF);
}
else if (block==1){//块1
if(PcdAuthState(PICC_AUTHENT1A,Sector*4+block,KEY_A,SN)!=MI_OK){LED_star1();return 1;}//验证,如果失败led闪烁
if(PcdRead(Sector*4+block,Data1)!=MI_OK){return 1;}//读取块
//发送数据到串口
Serial_SendByte(0xA1);
Serial_SendArray(Data1,16);
Serial_SendByte(0xAF);
}
else if (block==2)//块2
{
if(PcdAuthState(PICC_AUTHENT1A,Sector*4+block,KEY_A,SN)!=MI_OK){LED_star1();return 1;}//验证,如果失败led闪烁
if(PcdRead(Sector*4+block,Data2)!=MI_OK){return 1;}//读取块
//发送数据到串口
Serial_SendByte(0xA2);
Serial_SendArray(Data2,16);
Serial_SendByte(0xAF);
}
else if(block ==3)//块3
{
if(PcdAuthState(PICC_AUTHENT1A,Sector*4+block,KEY_A,SN)!=MI_OK){LED_star1();return 1;}//验证,如果失败led闪烁
if(PcdRead(Sector*4+block,Data3)!=MI_OK){return 1;}//读取块
//发送数据到串口
Serial_SendByte(0xA3);
Serial_SendArray(Data3,16);
Serial_SendByte(0xAF);
}
else {return 0;}
return 0;
}
/*描述 :刷卡防重
* (1)卡片第一次刷后记录id第二次刷取若还是它则不进行操作,若读取数据不完整则继续读取
* (2)若卡片离开再次刷去可以,或换卡
* 函数名:cardre()
* 输入 :无
* 返回 : 返回1代表寻卡失败或防重刷;返回0代表第一次刷取可以进行卡片读取
* 调用 :内部调用
*/
char cardre()
{
u8 i = 0;
if (rc522_findcard() == 1) // 寻卡失败或卡已经离开
{
findcardnum = 0;
return 1;
}
// 寻卡成功第一次刷卡并记录id
if (findcardnum == 0)
{
for (i = 0; i < 4; i++)
{
newSN[i] = SN[i];
}
findcardnum = 1; // 第二次或更多次的刷卡标志
return 0; // 允许读取数据
}
// 第二次或多次刷卡
for (i = 0; i < 4; i++)
{
if (newSN[i] != SN[i]) // 如果但凡有一位与原卡id不一致代表有新卡输入
{
for (i = 0; i < 4; i++) // 复制新卡id
{
newSN[i] = SN[i];
}
buzzer(2,100,100);
return 0; // 新卡允许刷取
}
}
return 1; // 防重刷
}
//数据比对,成功opendoor,失败蜂鸣器反馈 返 回1失败 返回0成功
u8 Data_Comparison()
{
u8 y=0;
u8 i;
for(i=0;i<16;i++){if(Data0[i]!=cardkey03[i]){y++;}}
if(y!=0){buzzer(2,300,300);return 1;}else{buzzer(1,500,500);opendoor();return 0;}
}
//寻卡函数
void Data_analysis()
{
if(cardre()==1){return;} //防止重复寻同一张卡
if(rc522_read(sector,0)==1){return;} //数据填入data0
if(Data_Comparison()==1){return;} //数据比对,成功opendoor,失败蜂鸣器反馈
clear(); //清除刷卡缓存,将上次刷卡遗留信息进行清零操作
}
实物展示说明
1.接电源启动:3.3V电源指示灯亮代表电源电路启动正常,蜂鸣器短鸣两声,表示系统初始化完成。如图5-4所示:
图5-4系统启动
2.刷本系统IC卡:将IC卡置于天线处,系统识别有卡将LED2点亮,蜂鸣器长鸣,舵机反转300ms表示开门,3秒后舵机正转300ms代表反转。如图5-5所示:
图5-5刷本系统卡
3.刷非本系统IC卡:将IC卡置于天线处,系统识别有卡将LED2点亮,蜂鸣器短鸣两声,舵机不动作。如图5-6所示:
图5-6刷非本系统卡
注意事项
提示:天线需要自己外接我专门把天线外置了,可以自由调配天线的参数。如果需要资料请评论区留言我后续看到会把我的天线公开
设计图

BOM


评论