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

文章目录


前言

💗博主介绍:✌全网粉丝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):

设计获取

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

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

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

相关推荐
南城花随雪。14 分钟前
单片机:实现驱动超声波(附带源码)
单片机·嵌入式硬件
yutian06069 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
你的微笑,乱了夏天10 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
析木不会编程12 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
404NooFound12 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
枯无穷肉16 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名67716 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式大圣16 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室17 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费17 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件