系统简介

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

关键词:人脸识别;STM32F103C8T;门禁系统

1. 绪论

1.1课题背景和意义
门禁管理系统的主要应用范围是:高级职员办公室、研发中心、实验中心、金融中心、网络管理中心,安全中心、基础设备室、社区出入口、高档宾馆房间门等重要场所。
目前,中国有很多人使用机械门禁设备。由于机械门系统中缺乏电子设备,因此相对可靠。可以说,这是一种带有密码的机械访问控制。门的内部结构非常简单,但安全系数很低,经常发生盗窃事件。车门视频识别系统利用电子电路与车门外壳协同工作,实现车门开关功能。相对较新,可以使用键盘手动登录,也可以通过指纹或视频识别实现访问控制。智能门凭借其卓越的性能,成为了现代门禁系统的佼佼者。其高度灵敏的识别能力,保证了用户操作的即时响应,为用户带来流畅的使用体验。同时,其高保密性设计,有效抵御了非法入侵,为用户的安全保驾护航。更重要的是,智能门的安全性极高,为用户提供了全方位的防护。值得一提的是,智能门的设计中摒弃了传统的移动部件,这不仅减少了维护和更换的频率,还大大延长了使用寿命。此外,无衣物和无撕裂的设计特性,更确保了门的稳定与美观,使得其在长期使用过程中依然保持如新的状态。正因为智能门拥有如此多的优势,它才深受人们、安全专家以及大企业家的喜爱。而本实验设计的微控制器,其核心部件为STM32F103C8T6单片机,正是智能门实现多功能视频识别功能的强大支撑。通过精密的电路设计和智能算法,该微控制器使得智能门在识别速度、准确性以及稳定性上均达到了行业领先水平。
我们将创建了一个可以进行视频监控的门禁系统,它能够使用传统密码和面部识别开门。在关键时刻,也可以触发警报,毫无疑问人脸识别比现在所使用的门禁模式更安全。
1.2国内外发展现状
在应用方面,人脸识别技术的主体可以分为人脸识别,人脸识别提取以及人脸识别身份认证等。目前,我国已进入到生物特征识别时代,生物识别技术在不同的领域都具有广阔的应用前景。在二十一世纪初,我国举办的奥运会就用到过这项技术。从那时候起,生物识别技术开始出现在人们的视野当中,在中国安全领域的应用中生物识别技术开始发挥无可替代的作用[1]。
人脸识别的研究一般分为这两种技术,其一是人脸检测技术另一种则是人脸识别技术。对于不同的图像使用某种的搜索策略来确定图中有没有人的图像就算是人脸识别检测。这种检测中,会对旋转人面进行定位,识别其尺寸及方位来进行识别。[2]对于当时的人们来说,这是一个复杂而具有挑战性的问题。由于人脸在现实生活中存在大量的应用场合,因此其重要性不言而喻。对那个时代的人而言,这无疑是个既复杂又富有挑战的课题。因为在现实生活中,我们经常会遇到一些人脸与背景之间存在差异的情况。与此同时,要实现人脸识别的实用化,准确与快速也是亟待解决的两大难题。因此,如何在这两大方面都取得进展就成为人脸识别领域中的重点之一。从20世纪90年代开始,人脸检测精度得到显著提升,但是不能满足用户对于应用系统满意的程度。由于人在自然状态下面部器官不存在明显差异,因此人脸检测技术一直没有取得突破性进展。一直到研究者Viola对AdaBoost算法人脸检测器发表之后,人脸检测在速度上才有了本质提升。这一算法的推出,也促进了研究人员对于人脸检测的深化研讨。当前看来,人脸检测已经成为计算机视觉领域中一个十分重要的分支。人脸识别的发展大致经历了如下三个阶段:
第一个时期是机械识别:最初的面部识别是基于捕捉Bertillon、Alan和Parker呈现的面部图像。该系统使用一个简单的语句将个人面部数据链接到数据库,并将其与指纹分析相结合,以提供一个强大的识别系统。[3]
首先找出构成人脸主要成分,分别分析其位置和大小,然后使用这些成分之间的常见几何分布关系和参数比率来识别最吻合的人。这就是第二阶段中所使用方法。其中不同的研究人员用不同的方法来进行人脸识别。例如Goldstein等人使用21个测量向量来表示面部特征;Kaya和Kobayashi使用不同面部器官之间的欧氏距离来表示人脸特征。这些都是以简单而直观的方式描述人脸视觉特性。在实验中发现该算法具有良好的性能,能有效提高识别率。Kanad所设计的系统达到了处理速度快,实时性强的目的,将人脸识别系统推向了现实的应用领域。在此基础上,本文还对一些算法进行改进,以提高识别率。不足之处在于这类方法还需借助操作者的一些先验知识,依然无法摆脱需要人们的介入。[4]
统计视图模型和二维统计人脸图像模型是现阶段的关键技术。然而,在一些环境条件不好的环境下,人脸的识别速度肉眼可见的下降。对现阶段的人们来说,创造出一个适用性广的人脸识别系统是有一定的难度的。环境条件不佳的情况下(尤其是在照明和站姿条件不吻合时),在人脸识别中,用户是否合作、大型人脸数据库之间的人脸识别问题,已经成为研究的热点。
总的来说,密码和人脸识别相结合是国内外控制人脸识别的主要趋势。在于芯片选取的集成芯片则会导致成本高昂,使得国内外家庭难以支持购买视频门禁控制系统。因此,本次设计一款STM32F103C8T6单片机用于门禁识别,主要趋向成本低,适合绝大多数群众。
1.3设计内容
(1)参考相关文献。回顾人脸识别出入控制系统开发的背景研究、当地和国际发展以及道路规划的现状;
(2)明确人脸识别门禁系统的总体概念和架构,制定出详细设计内容,发展设计理念,明晰总体方案,编制出总体系统图并分析该计划的可行性;
(3)该系统的硬件设计部分,需要介绍人脸识别系统的硬件组件,每个模块中使用的设备插入的不同组件,都需要选择合适的规格和型号,并解释其在系统中的功能;
(4)该系统的软件设计部分,对系统编程、编辑软件流程图、流程编程和关键程序进行综合设计;
(5)针对人脸识别系统进行描述,以全面的观点对整个系统运行情况进行综合描述,说明程序与硬件相结合如何取得成功并实现功能。
1.4章节分布
本文共分为五个章节,从不同方面详细介绍了视频识别的门禁控制系统结构及其功能的实现:
第一章,我们聚焦于绪论部分,深入探讨了人脸识别门禁管理系统的研究背景及其深远意义,同时概览了该系统在国内外的发展现状和趋势。
第二章,我们详细描述了视频识别门禁控制系统的整体架构。通过绘制方案框图,我们清晰地展示了系统的组成和布局。此外,本章还涵盖了系统硬件的合理选型,旨在确保所选设备能满足系统的性能和可靠性需求。我们还将对这些选型进行可行性分析,以确保系统的稳定性和实用性。
第三章,我们专注于系统硬件设计。在这一章中,我们将详细介绍人脸识别门禁管理系统的主要硬件构成,包括各个模块及其关键器件的选择。我们将详细阐述每个模块在系统中的功能,以及它们如何协同工作以实现系统的整体目标。
第四章,我们转向系统软件设计。在这一章中,我们将探讨软件制作的多种方案,并通过流程图的形式直观地展示软件的各个组成部分。这将有助于读者更好地理解我们在程序设计中采用的各种方案思路,从而更深入地理解系统的功能和运行机制。
第五个章节是关于人脸识别的门禁控制系统的实现,对整个系统的运行,结合软硬件来进行叙述能否成功实现其功能。

2. 总体设计方案的确定

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

图2.1 系统框图
要求达到功能如下:
(1)可从键盘进行相关设定和功能选择等;
(2)实现对到访人员人脸的视频检测功能,能够对用户人脸信息进行录入、删除、修改、识别等功能;
(3)能够实现键盘密码输入、在密码正确时解门禁,三次输入密码错误时,在一定时间内禁止密码输入并且蜂鸣器报警;
(4)LCD12864液晶可对相关信息进行显示;相关的报警信息会使用蓝牙模块发送到手机APP,可以使用手机APP远程对门禁的开启操作。
2.2 设计硬件方案选择
2.2.1主控芯片的方案选择
方案一:采用STC89C52单片机作为主控芯片
STC89C52为宏晶科技公司推出的8位带8K芯片在线可编程闪存低功耗微处理器。它能够提供强大而丰富的外设和系统应用接口以及灵活的编程方式,并且支持多种标准的通信协议。在此介绍一种新技术——通过利用该芯片内置的存储器来实现对外设存储空间的访问,从而使其能够应用到更多的场合。比如芯片具有4K内存,如需利用内存数据时,可直接利用微控制器内部内存,这样就不必用外部内存芯片来保存。在此芯片上还可实现对视频图像、声音等多媒体信息的采集和处理,以及其他一些复杂应用。这类微控制器研制简便,不失为一种较好的方案,它具有在线编程简便、成本低等优点。
方案二:采用STM32单片机作为主控芯片
STM32单芯片微机,作为一款出色的主控芯片,以其易于开发的特性在各个领域展现出广泛的应用潜力。这款芯片采用了ARM公司顶尖架构的Cortex-M3内核,不仅保证了强大的处理性能,同时也在体积上做到了极致的紧凑,封装后的体积小巧轻便。STM32的优势不仅体现在其强大的算力上,更在于其出色的性价比。相较于同规格的其他芯片,STM32的价格更为亲民,而性能却远超传统的8位单片机,这使得它成为了一种极具吸引力的解决方案。其高效的功耗控制机制,使得在功耗与性能之间取得了完美的平衡。
不仅如此,STM32还具备出色的集成能力,可以将多个功能模块集成于一个芯片之上,大大简化了系统的设计复杂度。同时,其实时性能卓越,能够确保在各种应用场景下都能迅速响应。而在外观设计上,STM32也展现出了独特的创意,使得它不仅在功能上强大,在外观上也别具一格。
在这里插入图片描述

图2.2 STM32单片机
2.2.2按键的方案选择
选项一:输入设备-独立按钮
该按钮支持独立功能,并配备了与发现数量相对应的特殊I/O端口。如果按钮的数量增加,随着门的数量不断增加,系统的复杂性也随之上升,这可能会导致原本用于连接其他设备的接口空间减少甚至消失。更为关键的是,随着线路数量的急剧增加,整个系统的反应速度也将受到显著影响,响应变得更加迟缓。
选项二:输入组件-矩阵键盘
在另一个场景中,当我们谈到输入组件时,矩阵键盘作为一种常见的输入设备,其连接方式具有独特的优势。具体来说,矩阵键盘的两个主要端口通过精心设计的行和列进行连接,这种布局不仅简化了连接过程,还提高了输入设备的灵活性和可靠性,每行和列都分别连接到单片机。基本规则由编程决定。这种方法有较高的编程难度,但可以减少I/O端口。
根据本项目的内容,按钮使用不多,因此选择了选项1,并使用独立的按钮作为子系统的按键输入。
2.2.3显示模块的方案选择
选项一:OLED液晶显示设备
如图2.3所示,有机发光二极管(OLED),由于其独特的特性,如自发光、无背光、广角较大、快速响应、简单的结构和生产工艺等等,这些因素的叠加下毫无疑问它将会是现在主流的技术。
选项二:LCD液晶屏
这里主要是介绍LCD1602液晶屏,这个显示屏可以显示不同的符号。最多可以显示16×2个字符,也可以选择直接显示32个字符的整个序列。即使是用户自行要求定义的字符也可以显示出来。显示控制的原理也非常简单,应用间隔相对较窄。屏幕上显示的字符是网格组合,网格大小为5*7。数据传输方法是串行数据传输。
最终考虑采用选项一。
在这里插入图片描述

图2.3 OLED屏幕实物图
2.2.4通信模块的方案选择
选项一:蓝牙技术
如图2.4所示,蓝牙模块在传输数据时,与无线2.4G传输共享了相同的频段,但采用了迥异的协议,从而赋予了它在不同领域中的广泛应用能力。与传统的2.4G产品相比,如2.4GHz无线鼠标,这类设备通常需要额外配置一个纳米接收器以实现连接。然而,我们所选择的蓝牙模块则通过其独特的兼容性,能够直接与支持蓝牙的设备进行无缝连接,无需额外的接收器,为用户带来了极大的便利。
选项二:ZIGBEE传输模块
ZIGBEE传输技术,基于IEEE802.11b局域网协议,展现出了其独特的优势。它的传输范围可达100米,最高速度达11Mbps,并且在22 MHz频段上拥有宽广的带宽。与传统的点对点传输模式相比,ZIGBEE的最大亮点在于其支持同时向多个终端传输数据的能力。作为WLAN无线局域网的一部分,ZIGBEE实现了向多个终端同时传输的网络模式,为各种应用场景提供了高效、稳定的无线通信解决方案[6]。综述,蓝牙的性价比高,最终选择蓝牙模块。
在这里插入图片描述

图2.4 HC-05实物图

第3章 硬件电路设计

3.1 整体硬件电路设计
本次设计的硬件电路使用的是Altium Designer16,这是一款开发于二零零六年的软件。该软件集成了原理图设计、PCB绘制和编辑、电路仿真和设计输出等技术,这给我们提供了不同的思路,能够轻松地进行设计。使我用这个软件的时候可以提高设计的效率。[7]
这次的系统运用了Altium Designer16进行绘制电路原理图的硬件电路,用来画出系统的电路图[8],系统电路图如图3.1所示:
在这里插入图片描述

图3.1 电路原理图
3.1 STM32单片机系统电路
在本次设计中,我们选用了STM32F103RC8T6作为核心的主控芯片,这款芯片以其卓越的性能和丰富的资源而备受瞩目。首先,它要求稳定的3.3V电压供电,确保了稳定的运行环境。同时,其拥有的51个串行端口为各种应用场景提供了充足的连接选择。在定时和控制方面,STM32F103RC8T6更是配备了四个16位定时器,为精确的时间控制提供了可靠保障。此外,三个SPI、两个I2C硬件接口以及五个串行USARTS端口,为数据传输和通信提供了强大的支持。在存储方面,这款芯片配备了512KB的系统闪存和64KB的SRAM,为数据存储和程序运行提供了充足的空间。而其高达72MHZ的最大工作频率,更是确保了数据处理的高效性和实时性。

STM32单片机的一大亮点是其众多IO接口,这些接口不仅可以作为输入口,而且支持多种触发方式,包括上升触发、下降触发以及手动触发,为各种复杂的控制需求提供了灵活的解决方案。
尽管STM32在设计上展现出了极高的灵活性和强大的性能,但其价格相对较高,对于初学者而言,可能存在一定的使用门槛。然而,通过本次设计,我们选择了STM32F103C8T6作为主控芯片,并通过图3.2展示了其最小系统的设计,旨在帮助初学者更好地理解和掌握STM32单片机的应用。
在这里插入图片描述

图3.2 STM32F103C8T6芯片最小系统图

第4章 系统软件设计

4.1主程序模块 就去掉一些部分,老师都标出来了自己用啊word画啊
这个软件设计由以下几种程序组成:主程序、初始化程序、键盘扫描程序、EEPROM读写程序、LCD显示程序、键功能程序、密码设置程序和延时程序等组成。[13]主程序设计流程图如下所示:
在这里插入图片描述

图4.1 主程序的流程图
4.2 键盘扫描子程序
在这里插入图片描述

图4.2 键盘扫描程序流程图
4.3 系统模块密码设置子程序
由于该项目是在逐个不同的模块上进行的,由不同的系统组合拼接成一个完整的系统。这个做法让我们能够方便阅读,发现哪一个部分有问题,也能够及时修改。每个功能模块都有自己的子程序。例如显示初始化子程序、关闭状态显示子程序、LCD忙检测子程序、密码输入及修改状态显示子程序、开锁状态显示子程序、密码输入错误后的提示子程序等。[14]如下图4.3为密码修改子程序流程图。
在这里插入图片描述

图4.3 设置密码子程序








附录B  主要代码
#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;    
                }
            }
			
        }                
        
    }     
}

结 论

硬件设计的部分,因为前期准备不够充分,使得我是一边做实物一边增加硬件,导致时间变得紧张起来,例如这次的设计需要使用单片机作为整个系统的控制核心;然后要连接上显示设备,让我们更加直观的看到实际效果;其次是要安装按键模块,这是信号输入以及进行对应的控制操作所必须的;紧接着我加装了人脸识别模块与密码部分用以开锁。正当我认为硬件部分要完工的时候,朋友提醒我,忘记加装报警系统以及电源模块了,最后我在朋友的帮助下才把硬件设计部分搞好。在进行调试的时候使用的软件是Keil,编写完代码,生成文件后用下载器下载到单片机上,就能够进行程序的调试了,本次设计实现了预先设定的目标,达到了预期的效果。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐