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

文章目录


前言

💗博主介绍:✌全网粉丝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): ## 设计获取 > **文章下方名片联系我即可\~** > > 精彩专栏推荐订阅:在下方专栏👇🏻 > > [**毕业设计精品实战案例**](https://blog.csdn.net/qq1928499906/category_12766262.html) > > **收藏关注不迷路!!** > > **🌟文末获取设计🌟**

相关推荐
be to FPGAer35 分钟前
设计约束命令和SDC命令
单片机·嵌入式硬件
C^h1 小时前
RT thread使用u8g2点亮oled显示屏
linux·单片机·嵌入式硬件·嵌入式
UTP协同自动化测试2 小时前
智能家居中控屏测试:触摸屏操作 + I2C 读取传感器 + UART 与子设备通信 + GPIO 控制
功能测试·单片机·嵌入式硬件·测试工具·智能家居
fLDiSQV1W2 小时前
【MongoDB】MongoDB 概述
数据库·mongodb
CET中电技术2 小时前
“事后维护”到“主动预防”排除故障,CET中电技术为电动机的安全运行保驾护航
单片机·嵌入式硬件
辰哥单片机设计2 小时前
STM32智能鞋柜(机智云)
stm32·单片机·嵌入式硬件
xuxie992 小时前
N18 RTC
单片机·嵌入式硬件·实时音视频
惶了个恐2 小时前
嵌入式硬件第九弹——ARM(5)
arm开发·单片机·嵌入式硬件·arm·硬件工程
XDHCOM2 小时前
NoSQL查询语言问世,CouchDB与SQLite联手革新数据库交互方式,让数据操作更高效
数据库·nosql·couchdb
charlie1145141912 小时前
嵌入式C++教程实战之Linux下的单片机编程(6):从点亮第一盏LED开始 —— 我们为什么要用现代C++写STM32
linux·c语言·开发语言·c++·stm32·单片机