基于单片机的人脸识别的智能门禁系统设计

news2024/11/18 3:43:16

文章目录

  • 前言
  • 资料获取
  • 设计介绍
  • 功能介绍
  • 设计清单
  • 核心代码
  • 具体实现截图
  • 参考文献
  • 设计获取


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

普遍来讲门禁管理系统的主要在以下的范围使用:职员办公室、数据中心、实验室、社区出入口、高档宾馆房间门等重要场所。如今,门禁控制大多是机械结构的,由于机械门禁系统中缺乏电子设备,因此相对可靠。可以说,这是一种带有密码的机械密码门禁。机械门禁的内部结构非常简单,但安全系数很低,这也导致了时常会发生盗窃事件。
在当前的技术背景下,本文精心打造了一款前沿的视频识别门禁控制系统。该系统以STM32F103C8T6作为核心控制单元,用SG90作为舵机驱动开关门,TFT彩屏可以显示具体信息。该系统不仅支持传统的键盘手动输入方式,更融合了先进的人脸识别技术,为用户提供了更为便捷、智能的开门体验。这款智能门禁系统凭借其卓越的性能,展现了多个显著优势。首先,其高度灵敏的识别能力确保了用户操作的即时响应;其次,强大的保密性设计使得系统能够抵御各类非法入侵,保障用户安全;再者,高安全系数的设计使得系统更加稳定可靠,为用户提供了持久的安全保障。此外,系统内部活动部件的稀少或不存在,极大地减少了磨损,从而延长了使用寿命,为用户带来了更加经济实惠的选择。本文所设计的视频识别门禁控制系统,以其卓越的性能、便捷的操作体验和长久的使用寿命,无疑将成为未来门禁系统发展的新标杆。

功能介绍

本次设计的人脸识别的门禁控制系统其硬件部分是以STM32F103C8T6为核心的单片机,采用0V2640摄像头对人员的人脸识别,采用矩阵按键对系统的操作以及密码的输入,使用蜂鸣器来作为报警模块,开门装置是电子锁控制,显示设备采用OLED液晶显示,无线模块在一番思索后选择了蓝牙模块传输。[5]系统框图如图2.1所示:
在这里插入图片描述

图2.1 系统框图
要求达到功能如下:
(1)可从键盘进行相关设定和功能选择等;
(2)实现对到访人员人脸的视频检测功能,能够对用户人脸信息进行录入、删除、修改、识别等功能;
(3)能够实现键盘密码输入、在密码正确时解门禁,三次输入密码错误时,在一定时间内禁止密码输入并且蜂鸣器报警;
(4)LCD12864液晶可对相关信息进行显示;相关的报警信息会使用蓝牙模块发送到手机APP,可以使用手机APP远程对门禁的开启操作。

设计清单

步进电机元件清单
1.7*9万用板
2.四位一体共阳.36数码管
3.STC89C51
4.步进电机

核心代码

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key_m.h"
#include "lcd1602toOLED.h"
#include "buzzer.h"	
#include "stmflash.h"
#include "password.h"
#include "IOout.h"
#include "usart.h"
#include "usart2.h"
u8 err=0;
//u8 error = 0;
enum MODE_e{
    OPENDOOR=0,//搜索授权
    LOGIN_IC,//注册IC卡
    LOGOUT_IC,//注销IC卡
    LOGIN_FG,//注册指纹
    LOGOUT_FG,//注销指纹
    RESET_PW //重置密码   
};
//刷卡用
u8 ICbuf[4]={0};//IC缓存
char str[]="0123456789abcdef";
u8 refresh = 1;
u8 sta;
u8 error = 0;
u8 consgOK=0;
u8 size[4];
const u8 cmd1[]={0xEF,0xAA,0x12,0x00,0x00,0x00,0x00,0x12};//识别指令
const u8 cmd2[]={0xEF,0xAA,0x13,0x00,0x00,0x00,0x00,0x13};// 注册指令
void Relay(u8 _sta);
//显示函数
void DisIC_hex(void);
void Dis_LOGIN_IC(void);
void Dis_LOGOUT_IC(void);


void sendAPP(void);

void OPEN_THE_DOOR(u8 id)
{
    char str2[50];
	err = 0;
     LCD_GotoXY(3,1);
            //"0123456789abcdef"
    LCD_Print("授 权 进 入");
    switch (id)
    {
    	case 0://密码开锁
            sprintf(str2,"密码正确.-->已开锁\r\n");
    		break;
    	case 1://IC卡开锁
            sprintf(str2,"IC%02X%02X%02X%02X-->已开锁\r\n", ICbuf[0],ICbuf[1],ICbuf[2],ICbuf[3]);           
    		break;
        case 2://指纹开锁
            sprintf(str2,"人脸识别正确-->已开锁\r\n");
            
            break;
        case 3:
            sprintf(str2,"wifi ctrl-->已开锁\r\n");
			//printf()
            break;
    	default:
    		break;
    }
	APPsendValue(str2,"","",0,0,0);
	delay_ms(1000);
    RelaySW(1);
    delay_ms(2000);
    RelaySW(0);   
	APPsendValue(" "," ","",0,0,0);	
}
extern void SaveFlash(void);
extern void ReadFlash(void);  
char str1[50];
int main(void)
{
    u8 cnt;
    u8 key;
    u8 sta;
    u8 mode=OPENDOOR;
  
    s8 i;
        u8 errCnt;
    //使用内部高速晶振HSI RC(8Mz)
    //配置SYSCLK->36MHz,HCLK->36MHz 
    //APB1->36MHz,APB2->36MHz,ADC1,2->18MHz
    sysClockHSI_Config();
    MY_NVIC_PriorityGroupConfig(2);        
    delay_Init(SysClockFreq/1000000);
    uart_init(SysClockFreq/1000000,9600);
	USART2_Init(36,115200);	
    LED_Init();
    delay_ms(50);
    LCD_Init();
    Buzzer_Init();
    KeyM_Init();
    RelaySW(0);
    ReadFlash();
    LCD_GotoXY(0,1);
//    LCD_Print(str); 
    delay_ms(1000);   
    Beep(200);
Start:      
    mode=OPENDOOR;
    LCD_Clear();
	LCD_GotoTitle(20);
    LCD_Print(" 人脸识别密码锁");
    disHome(); 
	APPsendLable0("信息","提示","","","","");
    while(1)
    {
        delay_ms(1);
        cnt++;
        if(cnt>200)
        {
            cnt = 0;
            LED = !LED;
			//人脸识别成功
			if(consgOK==1)
			{
				LCD_GotoXY(0,1);
				LCD_Print("  face id   ok  ");	
				SetBeep(1);
				delay_ms(1000);
				LCD_GotoXY(0,1);
				LCD_Print("    --------    ");
				SetBeep(0);
				consgOK = 0;
				
				 Clr_InputPW();
                    buzzer=1;
                    LCD_GotoXY(0,0);
                    LCD_Print("Authorization OK");
                    LCD_GotoXY(0,3);
                    LCD_Print(" Open The Door  ");
                    delay_ms(600);
                    buzzer=0;
                    delay_ms(900);
                     OPEN_THE_DOOR(2);
					error=0;
                    delay_ms(500);
                    goto Start;
			}
			//人脸识别失败
			else if(consgOK==2)
			{
				LCD_GotoXY(0,1);
				LCD_Print("  face id   err ");
				SetBeep(1);	
				delay_ms(1000);
				LCD_GotoXY(0,3);
				LCD_Print("    --------    ");
				SetBeep(0);
				consgOK = 0;
				
				 LCD_GotoXY(0,1);
                    LCD_Print(" password error!");
                    Beep(100);Beep(100);Beep(100);
					error++;
					if(error>=3)
					{
						while(1)
						{
							Beep(100);
						}
					}
                    delay_ms(800);
                    goto Start;
			}
			//sendAPP();
            if(err>=3)
            {
                errCnt = 0;
                while(errCnt<50)//锁机时间
                {
                    errCnt++;
                    Beep(200);
					 while(1){Beep(200);}
                }
                err = 0;
            }            
                     
        }
        key = Key_Map(KeyScan(0));//扫描矩阵按键
        if(key==0)
        {
            if(keyUSART)
            {
                key = keyUSART;
                keyUSART = 0;
            }
        }
        if(key)
        {
            Beep(200);              
			if(key=='C')//人脸注册
			{
				for(i=0;i<8;i++)
				Send_Char_Com2(cmd2[i]);		
				LCD_GotoXY(0,1);
				LCD_Print(" reg face  id   ");				
				delay_ms(1000);
				LCD_GotoXY(0,1);
				LCD_Print("    --------    ");			
			}
			else if(key=='D')//人脸识别
			{
				for(i=0;i<8;i++)
				
				Send_Char_Com2(cmd1[i]);
				LCD_GotoXY(0,1);
				LCD_Print(" conf face id   ");				
				delay_ms(1000);
				LCD_GotoXY(0,1);
				LCD_Print("    --------    ");			
			}
            else 
            {
                sta = InputPassword(key);
                
                if(0xFF == sta)
                {
                    LCD_GotoXY(0,0);
                            //"0123456789abcdef"
                    LCD_Print(" Input A New PW."); 
                    disHome();        
                    mode = RESET_PW;
                }
                else if(0x0F==sta)//开门
                {
                    OPEN_THE_DOOR(0);
                    goto Start;
                }
                else if(0xEE==sta)//密码错误
                {
                    LCD_GotoXY(0,1);
                            //"0123456789abcdef"
                    LCD_Print("password [error]");
                    //printf("password [error]");
					APPsendValue("password [error]","","",0,0,0);
                    Beep(200);Beep(200);Beep(200);
                    delay_ms(1000);
                    err++;
                    goto Start;
                }
            }            
        }
        while(mode == RESET_PW)//重置密码
        {
            key = Key_Map(KeyScan(0));
            if(key==0)
            {
                if(keyUSART)
                {
                    key = keyUSART;
                    keyUSART = 0;
                }
            }            
            if(key=='A'||key=='B'||key=='C'||key=='D')goto Start;//放弃密码重置
            else if(key)
            {
                Beep(200);
                
                sta = SetPassword(key);
                if(sta==0xFF)
                {
                    LCD_GotoXY(0,1);
                            //"0123456789abcdef"
                    LCD_Print("reset PW. [OK]  ");
                    //printf("reset PW. [OK]\r\n");
					APPsendValue("reset PW. [OK]","","",0,0,0);
                    Beep(1000);
                    delay_ms(1000);
                    goto Start;    
                }
                else if(sta==0xEE)
                {
                    LCD_GotoXY(0,1);
                            //"0123456789abcdef"
                    LCD_Print("reset PW. [err] ");
                    //printf("reset PW. [err]\r\n");
					APPsendValue("reset PW. [err]","","",0,0,0);
                    Beep(200);Beep(200);Beep(200);
                    delay_ms(1000);
                    goto Start;    
                }
            }
			
        }                
        
    }     
}


具体实现截图

请添加图片描述

在这里插入图片描述

参考文献

[01]贾川. 浅谈人脸识别技术应用及发展趋势[J]. 中国安防,2010,(03):91-94
[02]崇玉海. 基于二维图像表示的人脸检测与识别技术研究[D]. 中国优秀硕士学位论文全文数据库,2014,(03):
[03]姚丽君. 人脸识别技术的发展与应用[J]. 科技创新导报,2010,(21):35
[04]张红岩. 基于神经树的人脸识别方法研究[D]. 中国优秀硕士学位论文全文数据库,2011,(06):
[05]杨敏英, 陈辉煌, 杨阿弟, 佘明辉. 一种家庭智能门禁语音报警控制设计与实现[J]. 长春大学学报,2016,(4):6
[06]刘康, 林如威, 熊宇, 崔晓, 曾贵娥. LED控制器设计[J]. 电子技术与软件工程,2022,(17):4
[07]曹义 邢玉秀 张琳 刘亿文. PCB设计课程项目驱动教学改革的探索[J]. 电子世界,2014,(01):178-179
[08]田雅楠. 基于单片机的肥箱料位检测装置设计与试验研究[D]. 中国优秀硕士学位论文全文数据库.2020,(09):
[09]韩兴会. 基于STM32和LwIP的无线传感器网络网关研究与应用[D]. 中国优秀硕士学位论文全文数据库2018,(02):
[10]王静. 基于单片机的数据串口通信[D]. 中国优秀硕士学位论文全文数据库,2013,(02):
[11]王伟. 基于STM32的大功率LED老化电源的设计[D]. 中国优秀硕士学位论文全文数据库,2017,(04):
[12]陈隐宏. 简易船舶GPS、艏向显示仪的设计[D]. 中国优秀硕士学位论文全文数据库,2015,(11):
[13]孙强强, 丁小伟. 基于52单片机的机场智能寄存柜设计[J]. 长江信息通信,2021,(05):113-115
[14]周文龙. 基于单片机控制的电子密码锁设计[J]. 大众商务:下半月,2009,(3):2
[15]牛国锋. 基于瑞萨MCU的温度预警系统设计与实现[D]. 中国优秀硕士学位论文全文数据库,2013,(10):

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity Addressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统&#xff0c;并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址&#xff08;Addressable&#xff09;时&#xff0c;您可以使用该资源的地址从任何地方加载它。无论资源是在…

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【PWN · 栈溢出 | GOT劫持】[2024 · 长城杯]consumption

通过代码审计&#xff0c;找到栈溢出漏洞点&#xff0c;覆盖关键栈变量&#xff0c;实现任意地址写 前言 本题主要是套壳了Cjson&#xff0c;实则是约定了输入格式。通过仔细代码审计&#xff0c;即可找到栈溢出&#xff0c;并实现利用 一、题目 查阅网上资料&#xff0c;得知…

如何提取视频中的音频?新手也能轻松搞定

在数字媒体处理中&#xff0c;从视频文件中提取音频是一个常见需求。无论你是希望为视频制作单独的音频版本&#xff0c;还是想将某段视频的背景音乐用于其他项目&#xff0c;掌握音频提取技术都至关重要。本文将详细介绍几种提取视频中音频的方法&#xff0c;帮助你轻松实现这…

【自考zt】【软件工程】【21.04】(部分)

一、单选 二、填空 三、简答 四、应用 小结&#xff1a;

DeepSeek缓存命中技术,成本降低10倍

DeepSeek系列升级&#xff1a; DeepSeek发布最新的缓存命中技术&#xff0c;有效降低成本至0.1元/百万tokens&#xff0c;适用于文件读取和固定提示词。 点评&#xff1a;由于token消耗大部分是在系统提示词中&#xff0c;妥善使用确实可以极大降低成本&#xff0c;同时还能保证…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…

[git操作] git创建仓库上传github报错

操作流程如下 使用 git init使用 git remote add origin 项目ssh链接git add . 报错如下 Bus error (core dumped)然后执行任何别的操作都会报错&#xff1a; fatal: Unable to create path .. /.git/index.lock: File exists.Another git process seems to be running in …

​全国计算机软件中级资料分享

全国计算机软件中级资料分享 软考资料分析 软件设计师中间 免费资料 链接:https://pan.baidu.com/s/1GqbgIq_D0uZd-uuhIhG-Sg?pwd2atp 提取码:2atp 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 求个免费关注不过分吧。

vue实现评论滚动效果

vue插件实现滚动效果 一、安装组件 官网地址&#xff1a;https://chenxuan0000.github.io/vue-seamless-scroll/ 1、vue2安装 npm install vue-seamless-scroll --savevue3安装 npm install vue3-seamless-scroll --save二、组件引入 <template><div v-if"…

OpenCV 与 Matplotlib 的结合使用:轮毂检测与目标跟踪

目录 绘制轮廓图像 实现思路 1. 读取图像并转换为灰度图像 2. 二值化处理 3. 查找轮廓 4. 绘制轮廓 5. 显示结果 代码实现 效果展示 动态逐步显示轮廓结果 实现思路 1. 读取图像并缩放 2. 转换为灰度图像 3. 二值化处理 4. 查找轮廓 5. 动态显示轮廓 6. 显示最…

基于图神经网络的最大独立集问题的目标分支

文章目录 Abstract1 Introduction2 Related Work分支顶点选择图神经网络Abstract 分支归约方法结合了分支约束原则和归约规则,在处理以前无法管理的现实世界实例方面特别成功。分支策略决定下一个要在哪个顶点上进行分支。最近,最广泛使用的策略是选择最高度的顶点。 在这项…

C++为什么要引入智能指针?

智能指针的必要性 C 引入智能指针主要是为了解决手动管理动态分配内存时可能出现的几个问题&#xff0c;特别是内存泄漏、野指针和异常安全等问题。智能指针通过封装原始指针的操作&#xff0c;提供自动化的内存管理机制&#xff0c;以减少这些问题的发生。 具体来说&#xff…

c++基础补充

c基础补充 函数补充函数声明函数的分文件编写 指针补充占用大小空指针坏指针野指针 C内存分区模型 函数补充 函数声明 #include <iostream> using namespace std;int max(int a,int b);int main() {int result max(1,3);cout << result << endl;return 0;…

皮肤表皮层

表皮层的细胞大都是由基底层细胞分裂分化而来, 1:角质层 2:透明层 3:颗粒层 4:棘状层 5:基底层角质层 组成:由10-20 死细胞组成 细胞膜很厚 细胞核及胞器消失 细胞间隙被脂质连接 透明层 只出现在手掌和脚掌中 颗粒层 2-4层细胞角质细胞 活细胞 棘状层 有免疫…

chapter13-常用类——(Date、Calendar、LocalDate)—day17

目录 488-Date介绍 489-Date应用实例 490-Calendar介绍 491-Calendar应用实例 492-第三代日期使用 493-第三代日期方法 494-String翻转 495-注册处理题 496-字符串统计 497-String内存布局测试题 488-Date介绍 IDEA里面的properties是set/get方法 489-Date应用实例 49…

网络编程(UDP)

UDP编程 UDP&#xff1a;全双工通信、面向无连接、不可靠 UDP&#xff08;User Datagram Protocol&#xff09;用户数据报协议&#xff0c;是不可靠的无连接的协议。在数据发送前&#xff0c;因为不需要进行连接&#xff0c;所以可以进行高效率的数据传输。 适用场景 发送小尺寸…

transforemr网络理解

1.transformer网络中数据的流动过程&#xff1a; 2.transformer中残差的理解&#xff1a; 残差连接&#xff08;Residual Connection&#xff09; 的核心思想就是通过将输入与经过变化的输出相加&#xff0c;来最大限度地保留原始信息。 transforemr中注意力层网络和前馈神经…

国行 iPhone 15 Pro 开启苹果 Apple Intelligence 教程

一、前言苹果在 iOS 18.1 测试版上正式开启了 Apple Intelligence 的内测&#xff0c;但国行设备因政策原因不支持&#xff0c;且国行设备在硬件上被锁定。不过&#xff0c;我们可以通过一些方法来破解国行 iPhone 15 Pro&#xff0c;使其能够开启 Apple Intelligence。 以下是…