本课题为基于单片机的智能门禁系统,整个系统由AS608指纹识别模块,矩阵键盘,STM32F103单片机,OLED液晶,RFID识别模块,继电器,蜂鸣器等构成,在使用时,用户可以录入新的指纹信息,注册新的IC卡,修改新的密码,也可以删除旧的指纹,注销旧的IC卡,用户可以通过密码,IC卡或者指纹三种方式打开门禁,当输入信息正确时继电器会动作打开门禁,如果信息错误蜂鸣器会进行报警提示。本系统从原理图设计,C语言编写等多个角度完成了整个系统的设计,并最终通过制作实物完全了目标,经过测试达到了预期效果。
资料下载:待更新。。。。
1、实现功能
(1)用户管理需求
注册新用户:系统需要提供注册新用户的功能,包括录入新的指纹信息、注册新的IC卡和设置新的密码。用户可以通过其中一种或多种方式进行身份验证。删除用户:系统需要提供删除旧用户的功能,允许管理员删除指纹信息、注销IC卡或重置密码。
(2)身份验证需求
密码验证:系统需要支持用户通过输入正确的密码来验证身份。IC卡验证:系统需要支持用户通过刷卡的方式进行身份验证。指纹验证:系统需要支持用户通过指纹识别模块进行身份验证。
(3)门禁控制需求
继电器控制:系统需要通过继电器实现对门禁的控制。当用户通过正确的身份验证方式后,继电器应该动作,打开门禁。报警提示:系统需要通过蜂鸣器进行报警提示,当用户输入的信息不正确时,蜂鸣器应该发出警报。
(4)用户界面需求
显示屏:系统需要配备OLED液晶屏幕,用于显示用户信息、菜单选项和操作结果等。用户可以通过液晶屏幕进行交互和操作。
(5)安全性需求
数据保护:系统需要保护用户数据的安全性,包括指纹信息、IC卡数据和密码。数据应该被加密存储,并采取相应的措施防止未经授权的访问。防止暴力破解:系统应该设置安全机制,如密码输入错误次数限制、防止暴力破解的策略。
(6)扩展性需求
RFID识别模块支持:系统需要支持RFID识别模块,允许用户通过刷卡方式进行身份验证。多用户管理:系统需要支持多个用户的管理,包括新增用户、删除用户和权限设置等功能。
可增加的功能:
主要元器件:
STM32F103C8T6最小系统板、
2、硬件
硬件框图
本课题为基于单片机的智能门禁系统,整个系统由AS608指纹识别模块,矩阵键盘,STM32F103单片机,OLED液晶,RFID识别模块,继电器,蜂鸣器等构成,在使用时,用户可以录入新的指纹信息,注册新的IC卡,修改新的密码,也可以删除旧的指纹,注销旧的IC卡,用户可以通过密码,IC卡或者指纹三种方式打开门禁,当输入信息正确时继电器会动作打开门禁,如果信息错误蜂鸣器会进行报警提示。
实物
3、代码
STM32代码采用C语言,标准库编写,软件是keil5,关键代码有中文注释,看不懂可以VX问我
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "usart.h"
#include "timer.h"
#include "key4_4.h"
#include "stmflash.h"
#include "OLED.h"
#include "as608.h"
#include "rc522.h"
#include "rc522_user.h"
#include "IO_Init.h"
extern void Beep_Init(void); //蜂鸣器
int key;
u8 open_door_flag=0; //开门标志位
u16 user_ID=0; //保存指纹模块返回的用户ID,用于判断用户
u8 Password[6], Password2[6]={"123456"}; //六位用户密码,管理员密码
u8 password_eeror,rc522_error,figer_error; //错误次数
u16 Locked_time;
void open_door() //开门函数
{
u8 i;
if(open_door_flag>0) //ok,就开门
{
OLED_Clear();
Relay=0;
for(i=58;i<62;i++) //门已打开
{
OLED_ShowCH(32+i*16-16*58,1,i);
}
delay_ms(1700);
delay_ms(1700);
OLED_Clear();
Relay=1;
if(open_door_flag==1) //非管理员密码,自动回复原始状态
open_door_flag=0;
USART1_RX_STA=0;
memset(USART1_RX_BUF,0,sizeof(USART1_RX_BUF));
}
}
void admin_show() //总管理界面显示
{
int i;
OLED_ShowStr(0,0,"A:",2);
for(i=9;i<=10;i++) //指纹
{
OLED_ShowCH(i*16-16*8,0,i);
}
for(i=111;i<=112;i++) //管理
{
OLED_ShowCH(i*16-16*108,0,i);
}
OLED_ShowStr(0,4,"C:",2);
for(i=17;i<=18;i++) //密码
{
OLED_ShowCH(i*16-16*16,4,i);
}
for(i=111;i<=112;i++) //管理
{
OLED_ShowCH(i*16-16*108,4,i);
}
OLED_ShowStr(0,6,"D:IC",2);
for(i=111;i<=112;i++) //管理
{
OLED_ShowCH(i*16-16*108,6,i);
}
}
void oled_show() //界面显示
{
u8 i;
for(i=42;i<=45;i++) //欢迎使用
{
OLED_ShowCH(32+i*16-16*42,0,i);
}
for(i=115;i<=117;i++) //多功能
{
OLED_ShowCH(i*16-16*114,2,i);
}
for(i=39;i<=41;i++) //电子锁
{
OLED_ShowCH(i*16-16*35,2,i);
}
for(i=46;i<=49;i++) //请您开锁
{
OLED_ShowCH(32+i*16-16*46,6,i);
}
// u16 i;
// for(i=116;i<=118;i++) //实验室
// {
// OLED_ShowCH(40+i*16-16*116,0,i);
// }
// for(i=119;i<=124;i++) //智能门禁系统
// {
// OLED_ShowCH(16+i*16-16*119,2,i);
// }
// for(i=125;i<=129;i++) // 设计与实现
// {
// OLED_ShowCH(24+i*16-16*125,6,i);
// }
}
void oled_init_show() //初始化界面显示
{
u8 i;
for(i=42;i<=45;i++) //欢迎使用
{
OLED_ShowCH(32+i*16-16*42,0,i);
}
for(i=113;i<=115;i++) //多功能
{
OLED_ShowCH(i*16-16*112,2,i);
}
for(i=39;i<=41;i++) //电子锁
{
OLED_ShowCH(i*16-16*35,2,i);
}
for(i=46;i<=49;i++) //请您开锁
{
OLED_ShowCH(32+i*16-16*46,6,i);
}
}
void finger_check() //刷指纹开门验证
{
u16 uid,i;
uid=press_FR();
if((uid<300)&&(uid>0))
{
open_door_flag=1;
OLED_Clear(); //清屏
for(i=70;i<72;i++) //用户
{
OLED_ShowCH(i*16-16*70,4,i);
}
OLED_ShowStr(32,4,"ID:",2);
figer_error=0;
OLED_ShowNum(56,4,uid,3,16);
delay_ms(1000);
OLED_Clear(); //清屏
}
else if(uid==0xffff)
{
OLED_Clear(); //清屏
for(i=66;i<70;i++) //指纹错误
{
OLED_ShowCH(32+i*16-16*66,1,i);
}
Beep_Work(500,4);
figer_error++;
OLED_Clear(); //清屏
}
}
void ADD_finger() //添加指纹
{
int i=0;
OLED_Clear();
for(i=23;i<27;i++) //请按手指
{
OLED_ShowCH(16*i-23*16,0,i);
}
i=Add_FR();
if(i>0)
{
for(i=27;i<31;i++) //添加成功
{
OLED_ShowCH(16*i-16*27,4,i);
}
for(i=70;i<72;i++) //用户
{
OLED_ShowCH(i*16-16*70,6,i);
}
OLED_ShowStr(32,6,"ID:",2);
OLED_ShowNum(56,6,user_ID,3,16);
delay_ms(1000);
}
else
{
for(i=31;i<35;i++) //添加失败
{
OLED_ShowCH(16*i-16*30,4,i);
}
delay_ms(1000);
}
OLED_Clear();
}
void figer_show() //指纹管理界面显示
{
int i;
OLED_ShowStr(0,0,"A:",2);
for(i=7;i<=10;i++) //添加指纹
{
OLED_ShowCH(i*16-16*6,0,i);
}
OLED_ShowStr(0,2,"B:",2);
for(i=11;i<=14;i++) //删除指纹
{
OLED_ShowCH(i*16-16*10,2,i);
}
}
void finger_admin() //指纹管理
{
int i;
OLED_Clear();
while(key!='*') //*退出
{
key=Key44_Scan();
switch (key)
{
case'A' :ADD_finger();break;//添加
case'B' :PS_Empty();OLED_Clear(); for(i=97;i<103;i++) { OLED_ShowCH(16+16*i-16*97,2,i);}delay_ms(1800); OLED_Clear();break;//删除
default :figer_show();break;//管理显示界面
}
}
OLED_Clear();
}
void Esp8266_AP_Init() //ESP8266局域网开热点等待手机APP链接
{
UsartPrintf(USART1,"AT\r\n");
delay_ms(1000);OLED_Clear();
OLED_printf(0,0,"1 AT+CWMODE ");
UsartPrintf(USART1,"AT+CWMODE=2\r\n"); //设置路由器模式1 station,模式2 AP,模式3 station+AP混合模式
delay_ms(1000);OLED_Clear();
OLED_printf(0,0,"2 AT+CWSAP ");
UsartPrintf(USART1,"AT+CWSAP=\"WIFI\",\"123456789\",11,4\r\n"); //AT+CWSAP="wifi_yuan","123456789",11,4 设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)
delay_ms(1000);OLED_Clear();
OLED_printf(0,0,"3 AT+CIPMUX ");
UsartPrintf(USART1,"AT+CIPMUX=1\r\n"); //开启多连接模式,允许多个各客户端接入
delay_ms(1000);OLED_Clear();
OLED_printf(0,0,"4 AT+CIPSERVER ");
UsartPrintf(USART1,"AT+CIPSERVER=1,5000\r\n"); //启动TCP/IP 实现基于网络//控制
delay_ms(1000);OLED_Clear();
OLED_printf(0,0,"5 AT+CIPSTO ");
UsartPrintf(USART1,"AT+CIPSTO=0\r\n");
delay_ms(1000);OLED_Clear();
}
int main(void) //主函数
{
vu16 falsh,reclen,t;
SystemInit();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2组中断分组
Relay_Init(); //继电器初始化
Relay=0;
Beep_Init(); //蜂鸣器初始化
Beep = 0;
OLED_Init(); //OLED初始化
Relay=1;
Beep =1;
usart2_Init(57600); //串口2初始化
RC522_Init();
Key44_Init(); //矩阵按键初始化
oled_show(); //界面显示
STMFLASH_Read(FLASH_PASSWORD_SAVE_ADDR,(u16*)Password,6); //读取密码 下载程序后,数据是0XFF
STMFLASH_Read(FLASH_ICcard_SAVE_ADDR,(u16*)ICCard_Name,IC_Card_Num*4); //读取密码 下载程序后,数据是0XFF
TIM2_Int_Init(4999,7199);
while(1)
{
delay_ms(1);
if(pass_cnt==0) //没有在密码输入的时候
{
IC_check();
if(t++>50)
{
t=0;
finger_check(); //指纹检验
}
}
password_cheak(); //密码检验
oled_show(); //显示
open_door(); //开门函数
if(password_eeror>=3)
{
password_eeror=2;
Locked_time = 30;
while(Locked_time--)
{
OLED_printf(0,4," Locked:%d ",Locked_time);
Beep_Work(1000,1);
}
OLED_printf(0,4," ");
}
while(open_door_flag==2) //输入管理员密码进入设置
{
key=Key44_Scan();
switch (key)
{
case'C' :password_admin();break; //密码管理
case'A' :finger_admin(); break; //指纹管理
case'D' :rc522_admin();break; //IC卡管理
case'*' :open_door_flag=0;OLED_Clear(); break;//退出
default :admin_show();break; //管理显示界面
}
}
}
}
4、原理图/PCB
原理图和PCB都使用立创EDA绘制,对新手较为友好。可以导出为AD格式的文件
5、论文
本设计基于单片机的智能门禁系统,主要是结合单片机技术立足于产业应用而展开,全文针对目标功能进行关键器件的选择,电路图绘制,软件程序编写等等,在整个文章的章节结构上,大致如下:在第一章绪论对基于单片机的智能门禁系统课题的理论背景进行分析并引申出设计的必要性,在第二章则围绕基于单片机的智能门禁系统课题进行总体框架设计,确定整个系统中使用到的关键器件,在第三章则从硬件设计的角度,对每个模块完成硬件电路设计,从单片机最小系统到各个传感器应用电路,在第四章则对各模块完成程序流程的分析和绘制,在第五章则进行系统测试,针对硬件和软件进行联调,并最终完成整个系统的功能和测试。