文章目录

  • 1 简介
  • 2 绪论
  • 2.1 课题背景与目的
  • 3 射频识别
  • 3.1 射频识别技术
  • 3.2 射频识别模块
  • 3.2.1 RFID模块
  • 3.2.2 RFID模块组成
  • 4 系统设计
  • 4.1 系统架构
  • 4.1.1 硬件部分
  • 4.1.2 软件部分
  • 4.2 软件总体流程图
  • 4.3 密码子程序
  • 4.4 数据采集子程序
  • 4.5 显示子程序
  • 4.6 存储子程序
  • 5 指纹识别部分
  • 5.1 指纹识别模块的程序设计
  • 5.2 指纹录入
  • 5.3 指纹识别代码流程
  • 5.4 显示屏程序设计
  • 5.5 整体业务逻辑代码流程
  • 6 最后



1 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个 如何使用RFID技术构建一个单片机门禁系统

基于stm32的RFID与指纹识别的门禁系统 (项目开源)

大家可用于 课程设计 或 毕业设计



🧿 项目分享:

https://gitee.com/sinonfin/sharing

实现效果

RFID门禁系统过程描述_RFID门禁系统过程描述

2 绪论

2.1 课题背景与目的

门禁安全管理系统是新型现代化安全管理系统, 它集自动识别技术和现代安全管理措施为一体。 门禁系统可有效管理门的开启关闭, 对出入人员进行监控管理。 基于RFID的门禁系统通过对射频IC卡的识别, 保证那些持有相应证件的人员能自由进出, 阻止外来人员或无法提供证件的人员进入。 还有些门禁是利用生物识别的技术, 通过对人体某些部位(如眼睛、 指纹) 的识别来确认来人是否经过授权。 这种门禁系统相对射频识别的系统安全系数有很大提高, 但其成本较高, 在日 常生活中还未广泛应用。

3 射频识别

3.1 射频识别技术

射频识别(Radio Frequency Identification, RFID) 技术是从八十年代逐渐走向成熟的一种自 动识别技术, 它 是一项利用 射频信号通过空间耦合(交变磁场或电磁场)实现无接触信息传递并通过所传递的信息达到识别目 的的技术。

根据射频卡读写方式的不同可分成可读写(RW) 卡、 一次写入多次读出(WORM) 卡和只读(RO) 卡。 RW 卡成本较 WORM 卡和 RO 卡相比要高, 而且写入数据所花费的时间要远大于读取数据所花费的时间。 用户可以一次性将信息写入 WORM 卡, 写入后数据不能改变。 RO 卡存有一个唯一的号码。 只可读取, 不能修改, 虽然安全性较高, 但用途有限。

RFID门禁系统过程描述_python_02

3.2 射频识别模块

3.2.1 RFID模块

RFID门禁系统过程描述_stm32_03

射频识别「Radio Frequency IDentification,简称RFID」技术,又称为无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触,普遍应用于企业/校园一卡通、公交储值卡、高速公路收费、停车场、小区管理等。

RFID 技术利用无线射频方式在阅读器和射频卡之间进行非接触双向数据传输,以达到目标识别和数据交换的目的。

3.2.2 RFID模块组成

  • 标签(Tag,即射频卡),耦合元件及芯片组成,标签含有内置天线,用于和射频天线间进行通信。
  • 阅读器:读取(在读写卡中还可以写入)标签信息的设备。
  • 天线:在标签和读取器间传递射频信号。

这里使用的RFID-RC522模块采用MFRC522芯片,SPI通讯方式,支持Mifarel S50、S70 、Pro、Desfire等类型的卡,附带的白卡和钥匙扣是S50卡,每张卡都有自己的标识(UID)。

RFID门禁系统过程描述_RFID门禁系统过程描述_04

4 系统设计

本系统的主要电路包括: 读卡器数据采集电路、 串行 E 2 PROM 存储电路、 LCD1602 显示电路、 串口通讯电路、 报警电路、 门控电路、 键盘电路。

RFID门禁系统过程描述_RFID门禁系统过程描述_05

器件列表

  1. 主控芯片: AT89C52。
  2. 读卡器: YHY502ATG。
  3. E 2 PROM: AT24C04。
  4. LCD 液晶: ZL1602C2。
  5. 串口通讯芯片: MAX232。
  6. 报警器: 1 个蜂鸣器加一个 LED 红灯。
  7. 门控器件: 一个 LED 绿灯。

4.1 系统架构

4.1.1 硬件部分

LCD1602 显示电路设计

RFID门禁系统过程描述_RFID门禁系统过程描述_06

串口通讯电路设计

RFID门禁系统过程描述_RFID门禁系统过程描述_07

报警电路设计

RFID门禁系统过程描述_stm32_08

4.1.2 软件部分

在本系统中, 软件的设计主要包括: 数据采集模块、 存储模块、 显示模块、 门控模块、 报警模块、 键盘模块和上位机软件的设计几个方面。 本系统的软件结构框图如图 4-1 所示。

  1. 数据采集模块: 读卡器 YHY502ATG 通过天线读取 RFID 卡的数据,然后将数据传送出去。
  2. 存储模块: AT89C52 接收到数据后, 将数据传送给 AT24C04 进行存储。
  3. 显示模块: AT89C52 接收到数据后, 将数据与 AT24C04 里存储的数据进行对比, 若两者完全相同, 则液晶显示正确的信息; 若不相同, 则液晶显示错误的信息。
  4. 门控模块: AT89C52 接收到数据后, 将数据与 AT24C04 里存储的数据进行对比, 若两者完全相同, 则进行开门操作; 若不相同, 则不开门。
  5. 报警模块: AT89C52 接收到数据后, 将数据与 AT24C04 里存储的数据进行对比, 若不相同则报警。
  6. 键盘模块: 通过键盘输入密码, 并根据输入密码的有效性做相应的操作。

4.2 软件总体流程图

系统的软件总体流程图如图

RFID门禁系统过程描述_python_09

4.3 密码子程序

当程序运行时, 会一直判断是否有按键被按下, 当有按键被按下时, 系统会确定键值, 关将键值存入到密码数组里, 然后将输入的密码与本身的密码做比较, 若相同, 则执行开门和显示正确信息的操作; 若不相同, 则执行报警和显示错误信息的操作。

RFID门禁系统过程描述_python_10

核心代码:

P1=0x0f;
if(P1!=0x0f) compare(P1);
for(n=0;n<10;n++)
if(input[n]!=password[n]) break;
if(n==10)
{ if(m<10) continue;
WriteLcdCom(0x01);   //清屏
WriteLcdCom(0x80);  //第一行数据指针地址
for(s=0;s<16;s++)
 WriteLcdDat(str2[s]);
LEDG=0;
BUZ=0;
delay_10ms(20);
LEDG=1;
BUZ=1;
WriteLcdCom(0x01);
input[0]=" "; }
else if((n<10)&&(P1==0xbd))
{ WriteLcdCom(0x01);   //清屏
WriteLcdCom(0x80);  //第一行数据指针地址
for(s=0;s<16;s++)
WriteLcdDat(str4[s]);
LEDR=0;
for(s=0;s<5;s++)
{ BUZ=0;
delay_10ms(20);
BUZ=1;
delay_10ms(20); }
LEDR=1; }

4.4 数据采集子程序

执行程序之前, 首先要设置串口波特率等相关串口参数, 然后上位机通过串口向下位机发送命令, 并进入串口中断。 下位机根据接收 SBUF 的值做相应的处理。

RFID门禁系统过程描述_课程设计_11

核心程序

uchar uart_process(void)
{uchar cmd;
uchar cStatus;
cmd = g_cReceBuf[1];
switch(cmd)
{case 0x20: // 寻卡, 防冲突, 选择卡返回卡系列号(4 bytes)
cStatus =IicSendHY502(g_cReceBuf);  // 发送寻卡命令
cStatus =IicReadHY502(cp);   // 读取卡号并存入到 cP
if((cStatus==SUCCESS)&&(cp[1]==CARD_SN))
{memcpy(&g_cReceBuf[0],&cp[2],4);
eeprom();}}//将读取到的卡序列号与 E 2 PROM 里存储的进行比较
return cStatus;}
开始
上位机发送读卡命令
Y
Y
N
N
有感应卡 ?
验证感应卡权限
权限满足?
开门, 显示正确信息
报警, 显示错误信息
延时后, 自动关门
结束

4.5 显示子程序

显示子程序的主要功能是对当前的门控状态进行显示, 显示函数首先判断是写命令操作还是写数据操作, 若是写命令操作, 则根据命令进行相应的操作, 如清屏、 设置显示模式等; 若是写数据操作, 则在显示器上显示相应数据。

RFID门禁系统过程描述_python_12

核心程序

void LcdShowError()
{ WriteLcdCom(0x38);  //显示模式设置
WriteLcdCom(0x0c);  //开显示, 无光标, 光标不闪烁
WriteLcdCom(0x06);  //读写字符后地址指针加一设置
WriteLcdCom(0x80); //第一行数据指针地址
for(k=0;k<16;k++)
{WriteLcdDat(str3[k]);
delay(20); }
WriteLcdCom(0xc0); //第二行数据指针地址

for(k=0;k<16;k++)
{ WriteLcdDat(str4[k]);
delay(20);}
WriteLcdCom(0x01);  }
void WriteLcdCom(unsigned char c)
{ LCDRW =00;
LCDRS=0;   //切换到写命令
P0=c;
LCDE=1;
LCDE=0;
for(a=0;a<20;a++);}
void WriteLcdDat(unsigned char d)
{ LCDRW =00;
LCDRS=1;    //切换到写数据
P0=d;
LCDE=1;
LCDE=0;
for(a=0;a<20;a++);}

4.6 存储子程序

本设计中数据的存储芯片选用的是 AT24C04, 该芯片是串行的 E 2 PROM,支持 I 2 C 总线数据传送协议。

RFID门禁系统过程描述_课程设计_13

核心程序

void eeprom()
{write_byte(0,0x1e);
write_byte(1,0xda); write_byte(2,0x62); write_byte(3,0xb6);
write_byte(4,0x25); write_byte(5,0xee); write_byte(6,0xde);
write_byte(7,0xb6); write_byte(8,0x05); write_byte(9,0xc8);
write_byte(10,0x43);write_byte(11,0xb8);write_byte(12,0x3a);
write_byte(13,0x04);write_byte(14,0x5d);write_byte(15,0xb6);}
bit shout(uchar write_data)// 从 MCU 移出数据到 AT24C04
{uchar i; bit ack_bit;
for(i = 0; i < 8; i++) // 循环移入 8 个位
{SDA1 = (bit)(write_data & 0x80);
_nop_();
SCL1 = 1;
delayNOP();
SCL1 = 0;
write_data <<= 1; }
SDA1 = 1;  // 读取应答
delayNOP();
SCL1 = 1;
delayNOP();
ack_bit = SDA1;
SCL1 = 0;
return ack_bit;  // 返回 AT24C04 应答位
}
void  write_byte(uchar  addr,  uchar write_data)  //  在 指 定 地 址 addr 
处写入数据 write_data
{ start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delay_10ms(1); }

5 指纹识别部分

5.1 指纹识别模块的程序设计

指纹识别模块需要完成的工作有:获取指纹图像,生成指纹特征模板,储存指纹特征模板和匹配指纹等工作,单片机根据模块的指令系统,给模块发送指令信息,来控制模块完成相应的工作。

5.2 指纹录入

指纹录入过程, 用于新用户的注册, 当有新用户需要注册时, 就先在指纹头处获取用户的指纹图像, 在将之生成指纹特征模板, 在储存起来, 这样就完成了新用户的注册。

RFID门禁系统过程描述_RFID门禁系统过程描述_14

5.3 指纹识别代码流程

RFID门禁系统过程描述_stm32_15

5.4 显示屏程序设计

RFID门禁系统过程描述_课程设计_16

5.5 整体业务逻辑代码流程

软件使用 Keil C51 版本, 主程序采用 c 语言编写。 单片机对指纹识别模块发送命令, 得到识别结果, 在根据这个结果来控制显示模块、 语音模块和电子锁模块。 程序的主流程图如下所示:

RFID门禁系统过程描述_RFID门禁系统过程描述_17

6 最后

🧿 项目分享:

https://gitee.com/sinonfin/sharing