版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于指纹识别的门禁系统设计摘要本文设计的基于指纹识别的门禁系统,采用AS608指纹识别模块与矩阵键盘的互补方式的密码输入,实现可以对输入密码进行设置以及更新指纹锁的功能。同时,当输入正确的指纹或者数字密码后,单片机可以通过驱动继电器来控制门禁的开关,从而完成了局域指纹识别的门禁系统的设计。该设计中,最为关键的就是指纹识别与密码储存。由于STM32自身的FLASH可以用作储存器,所以将密码信息存入FLASH中,通过对FLASH的读取,完成输入密码的比对,从而实现指纹与密码对门禁的控制。通过该系统,可以减少目前开门禁需要带门禁卡的烦恼,减少了开门禁的繁琐,增加了在生活上的便利。关键词:STM32、指纹识别、密码输入、FLASH、门禁目录第一章绪论 第一章绪论1.1研究背景和意义随着现代智能科技的发展,指纹识别技术已经在生活中越来越来越常见了。由于其安全性与保密性,越来越多的门禁系统也采用了指纹识别模式,最开始,锁都是通过钥匙进行解锁的,但是随着数字科学的发展,数字密码锁慢慢统治了锁的领域,特别是在电子领域。但是科技在进一步的发展,由于每个人的指纹都是独特的,基于这种特性,随着指纹识别技术的发展,指纹锁也是在日常生活中越来越常见。从最开始高端智能手机使用指纹锁,到现在基本所有手机都具备指纹锁。不仅如此,指纹锁在防盗门以及门禁领域的使用也是与日俱增。特别是在大公司以及校园生活中,几乎所有的门禁系统都会有指纹识别的功能。当然,随着近几年来人脸识别的发展,人脸识别在门禁中的使用也是迅速发展。目前的门禁系统大多还停留在刷卡开门禁的环节,但是要刷卡就需要带门禁卡,忙碌的生活导致很多时候人们出门都是会忘记带卡,这就对出现带来不便。但是如果能够使用指纹的话,这不仅能够大大减少忘记带卡人的烦恼也可以很大程度上保证安全性。因为每个人指纹都不同,而手又不会忘带。因此,对基于指纹识别的门禁系统的开发、实验还是很有需要的。1.2研究主要工作本次所设计的指纹识别系统应具有以下几个功能,一个是在正确的密码输入下正常解锁,其次还要在多次输入密码是可以报警,提示非法进入,不仅如此输入密码的方式还能采用指纹输入。设计基于指纹识别的门禁系统,能够识别不同类型的指纹图像,当检测到预先设置的图像时门禁锁开,否则处于关闭状态,当多次识别错误是蜂鸣器就会产生报警。该系统的开发既需要硬件的使用也需要软件的配合,相关资料的查询要实现主要通过以下方式完成:查询与之相关的文件资料:通过知网相关论文的学术阅读以及相关开发技术的学习。学习相关元器件的工作原理,掌握图像处理,数据传输,指纹信息如何录入、存储,显示模块如何工作,报警模块的工作原理,整个电路的连接等等。2、硬件模块对照:先考虑本次实验所需要用到的硬件模块具备什么功能,在根据自己此前所学的知识去选择合适的硬件,如单片机,识别模块等等。3、模块实验验证:确定好硬件选择之后,对硬件模块进行检测看是否满足需求,检测成功以后利用软件对各个模块进行初始化,完成对应的检测工作,确定各规格的硬件模块工作正常。4、相关单片机开发学习:不懂得地方向老师请教或者上网查阅资料,学习相关单片机开发与调试。1.3研究安排说明本次设计的基于指纹识别的门禁系统通过以单片机为控制主体、使用C语言进行编程逻辑控制、借助指纹识别模块、矩阵键盘、显示屏,实现对门禁的开关控制。本次书写的文章通过对硬件设计以及软件设计的结合开发,实现各种功能的实现。各个模块应的内容如下所示:第一章绪论:在网上或者书上查阅相关文章,介绍对指纹门禁系统研究的背景与意义并介绍本次研究的工作安排。第二章方案设计:设计一个大致可行的实现方案,给出框图。比较两种控制芯片的性能,从而选择出最适合本次开发的芯片;对比按键输入的方式以及对显示屏的选择。第三章硬件设计:给出系统设计实现中要使用的模块,并对各个模块具体性能进行介绍,包含单片机模块、传感器、报警模块等主要的模块。第四章软件设计:在硬件设计的基础上,介绍门禁系统在程序设计上的逻辑实现,不仅如此,在该部分体现主要的控制思想。第五章设计调试:对于所设计的门禁系统进行详细的实际测试,如密码输入功能检测,指纹录入功能检测,以及报警功能检测,看设计目标能否实现。第二章方案设计2.1总设计方案本次设计的基于指纹识别的门禁系统显然是以单片机以及指纹识别模块为核心,辅以键盘与显示屏。整个门禁系统开门的方式有两种,一种是键盘密码输入,还有一种是指纹输入,密码输入模式需要先进行密码设置,以管理员的身份进行解锁,应用指纹解锁也是先进行指纹的录入,在检测到实现预设的指纹时方可解锁。两种方式任一种正确都能将门禁打开。当密码错误或者指纹不对时,门禁上的警报就会响,用于报警。整个系统框图如下:图2.SEQ图表\*ARABIC1总体框图2.2主控模块选择在本次对指纹识别的门禁系统的设计中,主控芯片是整个系统的核心,所以对控制芯片的选择很重要。控制芯片的选择这里有两种:方案1:首先。我们考虑的是STM32芯片。这是一类属于ARM系列的芯片。它可以处理各种微信号。该芯片最主要的两大特点是高效干扰保护以及高稳定性。STM32单片机是以ARM为内核的32位的控制器单片机。作为系统的控制中心具有强大的功能,数据处理能力相比起51单片机和其他单片机,有大幅度提升。强大的数据处理能力,极低的功耗使得该产品是一个非常优秀的选择。虽然内核使用的是ARM系列的低端产品,但也已经超出普通单片机很多,效率很大程度的提高了。ADC模数转换器,捕捉定时器,UART接口、IIC通信接口,由于它具有一系列优点,例如占据很高市场份额,快速发展和很高利用率。所以该单片机具有大量得开发学习资料以及丰富的库函数,非常适合各种各样的开发人员。不仅如此,STM32系列芯片的内部FLASH也较大,可以用于储存数据。【1】方案2:STC89C52单片机也是其中可供选择之一。STC89C52微控制器是51内核基础上设计的微控制器。STC89C52微控器具有串口通信接口,可以实现与别的机器进行串口通信。功耗较低是STC89C52微控制器的一个优点。但是STC89C52单片机只能存储8KB的程序代码,如果面对控制算法较大的程序,代码量多,则无法完成设计。同时该单片机的I/O资源有限。上述两种类型的微控制器相比,这两种单片机在设计方面都有一定的优势,但是相对于STC89C52单片机,STM32系列微控制器具有运行速度更快快,复用功能更多的优点。不仅如此,STM32还可以利用库函数进行开发,因此在多种因素以及我们系统开发出来的健壮性以及高效性我们选择通过STM32系列作为主逻辑处理系统。而且,相对于STC89C52,STM32系列芯片内部的存储空间更大,由于在本次设计中需要将指纹信息存储,所以需要一定的内部储存空间用于储存指纹信息,而STC89C52内部的储存空间太小,能储存的信息太少,所以最终选择使用STM32系列的STM32F103C8T6作为控制芯片。2.3按键输入方式选择在本次设计中,需要输入密码等操作,所以需要有输入的方式。就目前而言,对数字等输入一般采用按键输入或者采用触摸屏上的模拟按键进行输入。采用触摸屏进行模拟按键输入的方式在目前的科技产品中很是常见,但是不可否认,使用这种方式必然需要使用到触摸屏,而市面上的屏幕中,带触摸功能的屏幕价格都是相对较高。不仅如此,要使用触摸屏模拟的按键,必然是增加了开发难度。使用普通屏幕的话成本必然下降,所以采用普通按键的方式进行输入。普通按键输入根据电路连接方法也分两种。由于需要输入数字密码外加选择按键,按键的数量很轻松就突破了10,如果采用一个按键一个IO口的方式,必然会在很大程度上占用许多的IO口,这样其他功能使用的IO口就会变得十分拮据。所以这里并不采用这种普通接法,而是采用矩阵按键电路,这样就可以用较少的IO口实现多个按键的功能。【2】2.4显示屏选择LCD1602液晶显示器是作为文字型液晶显示模块被广泛使用。由字符型液晶显示器(lcd)和控制驱动主电路hd44780构成,在pcb底板上封装有包括扩展驱动电路hd44100在内的少量电阻、电容元件、结构部件等。。该显示屏价格便宜,仅在十多元左右,而且该显示屏功耗小,适合许多不需要画面仅需要字符数字显示的场景。1.8寸TFT彩色屏是一款液晶显示屏,该显示屏能够显示图案,可以自己利用软件生成需要字符汉字的字库。不仅如此,这款显示器显示分辨率高在1.8寸的屏幕上拥有128×160的分辨率、安装方便、性能稳定、可靠性高。这款显示器采用SPI串口通信协议,至少需要4个IO口驱动。而该显示模块再带驱动IC:ST7735。不过价格相对较高,功耗也会偏高。LCD12864显示屏是带中文字库的128X64点阵的显示屏,它是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字,也可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。对比两种显示屏,结合本次设计的需求可以知道,应该选用LCD1602显示屏。首先该屏价格便宜,而本次设计仅需要显示电流大小以及量程,对显示分辨率以及图案没有要求,更不需要屏幕彩色显示。而且对于IO口资源的限制,应该使用管脚少的显示屏,但LCD1602显示屏与移位寄存器74LS164配合使用,驱动LCD1602时仅需输出SPI时序即可。所以最终选用LCD1602。2.5系统主要特点(1)反应迅速:在当今社会中,技术越来越先进,产品淘汰的很快,因此,人们对产品的性能提出了更高的要求,其中反应速度就很关键。该系统设计的门禁系统首先需要能够及时获得键盘以及指纹识别模块的实时数据。检测到指纹特征后,特征数据还要迅速传送给单片机,单片机能将特征数据进行快速存储,使用时还能快速读取,达到录入指纹后迅速打开门禁的效果。如果这个反应速度很慢,用户的使用体验就会很差。所以整个系统的反应速度可以大程度上影响用户体验,因此需要重视产品的反应速度。(2)可靠性:系统除了需要实现设计的功能以及使得反应速度快以外,整个系统需要保证长时间的稳定性,如果出现经常故障的情况,就不能满足人们的需求,带来很多不便,不能检查使用时是可以工作的,过一段时间门禁系统就出现各种故障。拥有长时间的可靠性的设计是我们所有人所期待的,因此在整个开发过程中,我们应该加强硬件设计的可靠性,对硬件制作需要精良,同时加上质量可靠的控制代码,从而实现设计的系统能够保持长时间的稳定性,拥有长久的使用寿命。(3)以后故障的排查:在我们对本次设计的过程中,我们必须首先站在使用者的角度。很多时候,设计出来的实物在一定时间后必然会出现一些问题。这些问题是各种各样的,如果在设计出就考虑可能出现的故障或者考虑到之后受某些原因会造成什么样的问题,提前在硬件中留出之后的测量接口,这样对后续的排查就会简化许多。(4)性价比高:在科技发达的今天,各种高科技产品层出不穷,各种奇思妙想的设计也是琳琅满目。要提高产品的竞争力,就要在高性价比上下功夫。这就需要在设计方案时,寻找出一种能保证相同功能但又能降低成本的设计。
第三章硬件设计3.1主控模块3.1.1主控芯片介绍正如在主控模块选择中所述,本次设计使用的控制芯片是STM32F103C8T6,将该芯片与对应的电路想组合就可以组成我们所需的主控模块。STM32F103C8T6是一款基于ARMCortex-M内核STM32系列的32位的微控制器,且使用广泛,该芯片内部程序存储器容量是64KB,同时芯片拥有48个引脚(如下图),除了必要的供电以及晶振等引脚,可供使用的引脚有34个I/O口,在本次设计中完全够用。2V~3.6V的供电电压使得该芯片的功耗比不大,-40°C~85°C的工作温度使其能使用日常生活中大部分环境。图3.1stm32芯片引脚图3.1.2供电模块整个系统是通过USB接口进行供电的。在日常生活中,几乎随处可见USB插口,门禁系统使用USB进行供电就会十分方便。而对USB接口的连接电路如下,在电路中可见,一般USB接口要连接电压正负极、数据的D-与D+、还有USB的ID。由于在这里,USB只是用于给系统供电,所以不需要来接ID与数据线,仅需要连接电压正负极即可。【3】图3.SEQ图表\*ARABIC2USB供电电路而这个USB供电的低压都是在5V,但是STM32F103芯片的供电电压在2V~3.6V,如果直接使用5V供电很可能会对芯片造成损害,所以需要对5V进行降压稳压。在本次设计中,计划将5V降压为3.3V供给STM32芯片。这部分的降压电路是以RT9193以及滤波电容组成。RT9193的功能是将5V转为3.3V,这是芯片自身的功能。而在输入端,当接入电源时,其幅值是从零起始的,波动非常大,加入足够容量的电容进行滤波后,因电容的充放电效应,该脉动直流变成纹波不大的直流电,这是输入滤波的作用。在输出端,稳压电路的工作过程需要从输出采样,然后根据其反馈值调节输出以达稳压的目的。如果此时没有输出滤波电容,只要因负载变化带来的电压波动频率恰好与稳压电路的调节速率差不多就会产生振荡效应,导致输出失控,所以稳压输出也必须加滤波电容,而且增加滤波电容也可以进一步增加稳压输出的稳定性。其电路如下所示。图3.SEQ图表\*ARABIC35V转3.3V电路要想获得稳定的供电电压,并且滤除杂波,我们还必须添加去耦电容,电路图如下所示,保持引脚电压的稳定。这些电容也尽量离芯片相关引脚近一点,分布在芯片四周即可。【4】图3.4去耦电容3.1.3晶振与复位芯片的外围电路中,最为重要的就是晶振电路和复位电路。晶振可以为单片机提供系统时钟在一定程度上决定了芯片的运算速度,虽然STM32F103C8T6有内部RC震荡电路可以提供时钟,但众所周知RC震荡是十分容易受温度影响的,当温度变化时RC振荡器的充放电时间就会改变引起时钟的不准确,所以我们需要在外部加上晶振,这样可以提供更加准确的系统时钟。这个外部晶振电路如下图所示。高速外部时钟OSC,频率范围4-16MHz,当然这里选取的是8MHz的。【5】图3.5晶振电路同时,对于该系统而言,复位电路也是必不可少的。当系统出现问题,例如STM32的程序运行出现了问题,而此时又不能断电,这时,一个复位电路就可以派上很大的用场。此处增加的复位电路是针对STM32的,由于STM32芯片是核心,所以该芯片复位就会带动所有部件复位。而STM32自身有复位的引脚,只要该引脚拉低一定时间就会复位。其电路如下图所示。复位引脚通过电阻连接3.3V的电压,然后连接按键,按键另一段连接GND,这样当按键按下时,该引脚就会被拉低从而实现复位。【6】图3.6复位电路3.2指纹识别模块指纹的识别准确的来说不是一种算法而是一种识别的系统,它是表示的一种特征值,是在1:N的模式下来进行指纹的匹配的。它是从多个指纹模板中识别出一个特定指纹的过程。其结果是,“有”或者“没有”。有时会给出“是谁”的信息。【7】指纹验证是指在1:1模式下匹配指纹特征值。它是拿待比对的指纹特征模板与事先存在的另一个指纹特征模板进行一次匹配的过程。其结果是“是不是”。在一个系统中既可以采用1:1模式也可以采用1:N模式,这是取决于应用系统的特点和要求。有时候还可以业务模式的需要,把1:N模式转化为1:1模式以提高系统安全性和比对速度。ATK-AS608指纹识别模块是ALIENTEK推出的一款高性能的光学指纹识别模块。ATK-AS608模块采用了国内著名指纹识别芯片公司杭州晟元芯片技术有限公司(Synochip)的AS608指纹识别芯片。芯片内置DSP运算单元,集成了指纹识别算法,能高效快速采集图像并识别指纹特征。模块配备了串口、USB通讯接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简单的串口、USB按照通讯协议便可控制模块,要实现指纹输入与识别,必然要有指纹识别传感器以及一个能够储存指纹信息的空间。在本次设计中就是使用AS608指纹模块进行指纹的输入以及STM32自身FLASH空间进行数据存储。【8】3.2.1指纹识别传感器AS608指纹识别模块主要是指采用了杭州晟元芯片技术有限公司的AS608指纹识别芯片而做成的指纹模块,是一个可供2次开发的指纹模块。AS608模块有8个引脚,其中供电电压为3.3V,不能使用5V供电;通信总线有两种,分别为串口通讯(TX、RX)和USB通讯(D+、D-);如果采用串口通讯,编程相对简单,也是比较常用的一种,但是兼容性不好;而采用USB通讯,编程相对较难,但USB作为最常用的总线接口,有很好的兼容性。在本次设计中是采用串口通信的方式。其引脚功能见下表:表3.SEQ表格\*ARABIC1AS608引脚功能引脚号名称类型功能描述1+3.3vIN模块电源正输入端2TXOUT串行数据输出3RXIN串行数据输入4GND_信号地,内部与电源地连接5TouchOUT高电平有效6TOUCHVININ触摸感应电路输入端7D+_USBD+8D__USBD_由于采用的是串口通讯,所以是需要连接电源正负极、串口通讯的RX与TX、还有就是感应信号输出端,其连接电路如下图所示。图中的WAK就是感应信号输出端。图3.7指纹模块连接电路3.2.2储存FLASHSTM32自身是不带EEPROM的,但是考虑到STM32具有IAP(在应用编程)功能,因此,在设计开发过程中可以将FLASH当成EEPROM来使用。stm32的flash地址起始于0x08000000,结束地址是0x08000000加上芯片实际的flash大小,不同的芯片flash大小不同。STM32F103C8T6的FlASH大小为64KB。其中RAM起始地址是0x20000000,结束地址是0x20000000加上芯片的RAM大小。不同的芯片RAM也不同。Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失,RAM可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失。STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。stm32的外设地址从0x40000000开始,可以看到在库文件中,是通过基于0x40000000地址的偏移量来操作寄存器以及外设的。一般情况下,程序文件是从0x08000000地址写入,这个是STM32开始执行的地方,0x08000004是STM32的中断向量表的起始地址。而要将指纹存入FLASH中,就是在FALSH的地址中找一块没有用于储存代码和一些const类型的变量的区域,在这些空的地方对数据进行储存,这样掉电后数据依然存在,不会丢失。【9】3.3按键输入模块对于输入按键,采用的是4×4的矩阵键盘,该键盘的实物如下图所示。图3.8矩阵键盘实物该键盘模块有8个引脚与STM32的IO口相连,其内部电路如下图所示,按键程矩阵状排列,每个按键两端都与IO口相连。按键的扫描是分为两种方式的,一种是使用低电平来对键盘进行四位的轮流检测的逐行扫描,如果有按键按下,则检测到的数据四位不都是1,接着,判断为0的数据对应的按键来确定是哪一个按键被按下了。还有一种叫做行列扫描的方式。这种方式在进行检测时,会向列四位来进行高电平的输出,向行四位来进行低电平的输出,这时是通过输出的高电平来进行判断的,只有在列四位不都是高电平的时候才是有按键按下的时候,然后就可以通过接收到的准确数据来判断具体的按键。此步骤完后之后还是要进行检测的,就是把上一个步骤进行交换,行四位来负责高电平,列四位来负责低电平,再根据数据进行具体的按键的判断。【10】图3.9矩阵电路连接电路3.4显示模块本次设计使用的显示屏为LCD12864,这种显示屏最大的不同就是能够显示汉字,而且字库不需要使用者去制作。该显示器的分辨率为128×64,所以命名为LCD12864,其中字库包含了8192个16*16点汉字,还有128个16*8点ASCII字符集。同时该显示模块的通信方式也是有多种,包括4位/8位并行、2线或3线串行多种接口方式,在本次设计中采用的是2线串行通信方式。这样就可以很大程度上节约了IO口资源。其具体的连接方式如下图所示,在图中可见,其供电电压为5V,且其背光不可调,其LCD的dat引脚连接的是STM32的PB13,LCD的sck连接的是STM32的PB12,而片选引脚则是连接在5V上。【11】图3.10LCD12864连接电路3.5报警与门禁开关在本次设计中,需要实现对门禁的控制以及对错误密码输入时的警报。这里采用的是蜂鸣器来警报,用继电器来控制门禁开关。由于STM32单片机IO口输出电流过小,仅为8mA,无法驱动蜂鸣器,所以需要使用三极管搭建开关电路,下图即为在本次设计中使用的电路。电路中R1电阻右侧输入IO口的电平信号,右侧连接三极管。当Beep信号为高电平时,三极管导通,蜂鸣器就响,Beep为低电平时,三极管就断开,蜂鸣器就不响。图3.11警报电路单片机IO口输出的电流不足以驱动设备,因为该引脚输出的电流不具备驱动能力,因此需要配备相应的继电器。继电器用作控制外部设备是否工作的开关。单片机只需要控制继电器的闭合和断开即可。不幸的是,单片机IO口连驱动继电器的功率都没有,所以需要增加NPN搭建的开关电路去驱动。【12】图3.12门禁开关电路图3.13指纹锁连接原理图
第四章软件设计4.1程序总流程上一章主要讨论了本系统硬件部分的设计,本章主要研究软件部分的设计。单片机主要的程序流程如下图所示,系统开始工作后,首先是对各个模块进行初始化。然后是通过按键进行模式设置,当为修改密码时,可以是设置数字密码也可以是输入指纹密码,完成后,这些密码就会存入FLASH中。当为输入模式时,输入的数字密码与指纹密码会与FLASH中的信息进行对比,如果是一致的,则会打开门禁,如果信息不一致,则无法开锁,如果多次失败则或驱动蜂鸣器进行警报。图4.1单片机主要流程4.2指纹录入识别4.2.1指纹的录入指纹录入是将指纹录入到系统的指纹库中。为了保存使用者的指纹,系统将采集到的指纹特征输入到指纹库之后,再为该指纹添加一个唯一的ID号,将ID号存储到与之对应的指纹库中进行指纹录入时,对于同一个指纹要录入两次,然后系统会对这两个指纹进行比对,如果两次录入的指纹比对结果相同,则可生成一个指纹模板,并添加一个指定的指纹ID号存入到指纹库中,这就完成了一个指纹的录入过程。利用光的折射和反射原理,光从底部射向三棱镜,并经棱镜射出,射出的光线在手指表面指纹凹凸不平的线纹上折射的角度及反射回去的光线明暗就会不一样。CMOS或者CCD的光学器件就会收集到不同明暗程度的图片信息,就完成指纹的采集指纹的录入是通过AS608指纹识别模块采集指纹信息,并将信息传递给单片机来实现的。AS608具体是如何实现指纹采集的这里不详细解释,因为这就是模块的功能。这里主要讲解AS608与STM32之间的数据传输。 图4.2指纹录入流程图AS608是目前最普遍的指纹识别模块,他通过多次的指纹录入来确定特征点,若多次录入指纹一样,则系统成功录入指纹信息,作为开锁指纹,否则,指纹信息录入不成功。【13】由于在本次设计中,AS608与STM32之间的通信使用的是串口通信,而对于串口通信需要设置好波特率等参数,否则无法通信。其主要代码如下。从中可见其波特率为57600,数据长度为8位,还有一位停止位,无奇偶校验位。USART_InitStructure.USART_BaudRate=57600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART2,&USART_InitStructure);USART_Cmd(USART2,ENABLE);当实现通信后,就是对指纹录入指纹录入需要一定指令格式。其需要对AS608发送的指令格式如下:表4.3发送指令格式2bytes4bytes1bytes2bytes1bytes2bytes包头芯片地址包标识包长度指令码校验和0xEF01Xxxx01H03H01H05H当发送后,AS608的感应信号输出端为高时,则会有一个应答数据包发送给单片机。应答包格式如下:表4.4应答包格式2bytes4bytes1bytes2bytes1bytes2bytes包头芯片地址包标识包长度确认码校验和0xEF01Xxxx07H03HXxHSum当确认码为00H时,表示指纹录入成功;确认码为01H时,表示收包有错;当确认码为02H时,表示传感器上无指纹;确认码为03H时,表示录入不成功;在完成上述指纹录入功能后,符合身份信息要求的指纹信息已经被存入系统之中,当有一个新的指纹来到时,系统会将其与FLSH指纹库中所预置的指纹进行对比。4.2.2指纹储存要储存指纹特征,则需要先指明要存储的开始地址,由于代码是从开始进行储存的,所以存储指纹的地址要靠后些。下面的宏定义就是指明了存储开始地址。#define SaveAddr (0x08000000+0xfc00) 对数据的输入过程整体如下:1.解锁(固定的KEY值)(1)在Flash密钥寄存器的FLASH_KEYR内输入KEY1=0x45670123(2)接着在Flash密钥寄存器FLASH_KEYR内输入KEY2=0xCDEF89AB2.数据操作位数在设计过程中,擦除和写入的速度回收到操作位数的影响,其中64位宽度的操作除了配置寄存器位外,还需要在Vpp引脚外加一个8-9V的电压源,且其供电间不得超过一小时,否则FLASH可能损坏,所以64位宽度的操作一般是在量产时对FLASH写入应用程序时才使用,大部分应用场合都是用32位的宽度。3.擦除扇区在进行数据的添加指令之前,是需要对数据的保存模块来进行清洗,STM32提供了扇区擦除指令和整个FLASH擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。扇区擦除的过程如下:(1)检查FLASH_SR寄存器中的“忙碌寄存器位BSY”,以确认当前未执行任何Flash操作;(2)在FLASH_CR寄存器中,将“激活扇区擦除寄存器位SER”置1,并设置“扇区编号寄存器位SNB”,选择要擦除的扇区;(3)将FLASH_CR寄存器中的“开始擦除寄存器位STRT”置1,开始擦除;(4)等待BSY位被清零时,表示擦除完成。4.写入数据在进行完记忆的数据的清洗之后即可进行数据的输入,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:(1)检查FLASH_SR中的BSY位,以确认当前未执行任何其它的内部Flash操作;(2)将FLASH_CR寄存器中的“激活编程寄存器位PG”置1;(3)针对所需存储器地址(主存储器块或OTP区域内)执行数据写入操作;(4)等待BSY位被清零时,表示写入完成。【14】4.2.3指纹识别指纹识别是指系统识别指纹,并与指纹库中的指纹作比对,然后执行相应的操作。当我们控制进入到指纹识别主页面时,指纹模块便开始判定是否有手指触碰指纹采集屏,当检测到有指纹触碰时,系统便开始执行指纹采集操作程序,获取指纹图像,接着对指纹图像进行预处理,提取指纹特征数据,并将其保存在指纹数据库中,与指纹库中存储的数据进行比对。如果比对成功,则成功解锁,则向继电器输出低电平,驱动电磁锁打开;如果比对失败将不会开锁,多次失败则会报警。指纹识别的核心是检测的指纹信息与所录入的指纹信息进行对比,来判断能否解锁。图4.5指纹识别流程图4.3按键输入对按键的扫描是通过行列扫描的方式实现的,大致操作原理在硬件部分已讲述,这里不重复说明。这里主要展示其具体代码。charKey_Scan(void){charkeyVal=0;u8line1=0,line2=0,line3=0,line4=0;GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);GPIO_WriteBit(GPIOB,GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5,Bit_SET);GPIO_WriteBit(GPIOB,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9,Bit_RESET);delay_us(100);line1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);line2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);line3=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);line4=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);if((line1==0)&&(line2==0)&&(line3==0)&&(line4==0)){keyUp=1;}if(((line1>0)||(line2>0)||(line3>0)||(line4>0))&&keyUp==1){delay_ms(20);line1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);line2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);line3=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);line4=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);if(((line1>0)||(line2>0)||(line3>0)||(line4>0))&&keyUp==1){keyUp=0;GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_4,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);delay_us(100);line1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);line2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);line3=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);line4=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);if(line1==1){keyVal='D';}elseif(line2==1){keyVal='C';}elseif(line3==1){keyVal='B';}elseif(line4==1){keyVal='A';}GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_SET);GPIO_WriteBit(GPIOB,GPIO_Pin_4,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);delay_us(100);line1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);line2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);line3=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);line4=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);if(line1==1){keyVal='F';}elseif(line2==1){keyVal='9';}elseif(line3==1){keyVal='6';}elseif(line4==1){keyVal='3';}GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_4,Bit_SET);GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);delay_us(100);line1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);line2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);line3=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);line4=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);if(line1==1){keyVal='0';}elseif(line2==1){keyVal='8';}elseif(line3==1){keyVal='5';}elseif(line4==1){keyVal='2';}GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_4,Bit_RESET);GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);delay_us(100);line1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);line2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);line3=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);line4=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);if(line1==1){keyVal='E';}elseif(line2==1){keyVal='7';}elseif(line3==1){keyVal='4';}elseif(line4==1){keyVal='1';}}}returnkeyVal;}【15】4.4屏幕显示4.4.1通信时序对于LCD12864的显示主要是通过指令进行的。要实现显示,最基本的通信要能完成。由于使用的是2线串行通信,其时序如下图所示:图4.6LCD12864串行通信时序图首先要保证CS是一直处于高电平的状态的,其中是拥有可以进行数据和指令接收的LCD,接着,单片机会特意给出一个起始位置来用来进行数据的传输。系统中的起始位是5个连续的“1”,模块检测到5个“1”后,传输就会被在重置的同时再进行同步。在进行数据传输时方向对被固定(RW,用于选择数据的传输方向,1是读数据,0是写数据),以及传输性质(RS,用于选择内部数据寄存器或指令寄存器,0是命令寄存器,1是数据寄存器)最后的第8位固定为“0”,这时就完成了第一个字节数据的起始和传送。在接收到起始位及“RW”和“RS”的第1个字节后,之后便开始传输指令或者数据,在传输过程中会进行拆分处理,该字节将被分为2个字节来传输或接收。当想发送的数据或指令的高4位,被放在发送的第2个字节串行数据的高4位,其低4位则置为“0”;数据或指令的低4位被放在第3个字节的高4位,其低4位也置为“0”,如此完成一个字节指令或数据的传送。所以写指令之前,必须先发送11111000(即0xF8);写数据之前,必须先发送11111010(即0xFA)。4.4.2字符显示如果想要进行字符的显示,就要运用控制器里面的缓存器DDRAM,它主要就是负责进行字符代码的存储的。这需要用到DDRAM(显示数据)来进行,将编号好的字符的编码(中文的)或者是其他字符类型的编码进行输入,简单来说就是可以发出了一个字符的数据,前提是在串行这种模式下,硬件就会自己按照顺序从CGROM(2M的中文字型ROM)、HCGROM(16K的ASCII码ROM)、CGRAM(自定义字形RAM)三种字形中进行判断,主要对每个字符和汉字编码应该对应的每个字形进行分类,最后将要看到的字符或汉字编码在屏幕上进行显示。所以字符的展示的实现方法是:将想要进行显示的字符编码输入到RAM(DDRAM)中。在每个模块中都有64×16的空间来进行字符显示的RAM,最多可以显示4行8字(32个汉字)或64个ASCII码字符的显示一个汉字2个字节。也就是说DDRAM一共有32个字符显示区域,当然,字符显示的RAM的地址与32个字符显示区域有着一一对应的关系。字符显示时,DDRAM地址与液晶屏的位置如下图。控制器通过在不同的地址写入字符或汉字,就可以在不同位置显示出想要的字符。图4.7DDRAM地址与液晶屏的位置4.5警报与门禁控制对警报与门禁的控制就很简单,当输入密码或者指纹与储存在FLASH中的密码及指纹进行对比,当信息准确没有问题后,就控制PB14的管脚输出高电平,这样通过三极管的开关电路对继电器进行控制,从而打开门禁,然后持续一端时间后又用同样方法关闭门禁。而对于警报的逻辑也差不多,当输入的指纹错误或者数字密码不正确,单片机就会驱动相应IO口去控制蜂鸣器发出声音。蜂鸣器发声有两种情况,一种是手指按上指纹模块时,当屏幕显示出指纹ID时以及输入密码正确时就会发出“滴”的声音,这个程序代码如下。voidBeep_Pass(void){beep=0;delay_ms(500);beep=1;}可见当输入正确时是只响0.5s用于提示。而当输入的指纹不正确或者是输入的密码不正确时,就会有不一样的警报声,其代码如下。voidBeep_Warn(void){beep=0;delay_ms(300);beep=1;delay_ms(100);beep=0;delay_ms(300);beep=1;delay_ms(100);beep=0;delay_ms(300);beep=1;}从代码中可见,是急促的“滴”三声用于警报。这样通过“滴”的次数与时间长短来区分是正确提示还是错误警报。
第五章系统调试5.1硬件调试硬件调试主要是检查电路的准确性,电路的开发不是一帆风顺的,往往会出现意想不到的问题,所以在对系统上电前,需要检查单片机与各个传感器的连接准确性。由于是制作实物,所以需要注意焊接时不能虚焊,再次基础上注意焊接点的牢固,同时使用万用表检查电路板是否出现短路断路情况。如果在连接点没焊接好,就能造成数据传输时数据丢失甚至无法就收到数据。当硬件上出现问题,其他的所有功能就无法实现,从而对整个系统的软件调试造成各种不便,就不能方便快速的找到对应的问题。图5.1系统实物图背面图5.2系统开机界面5.2软件调试在测试软件时,需要测试设计的功能。首先是按键与页面显示。这两部分可以结合起来测试,按下某个按键,看屏幕上是否会显示相应的字符或数字。如果能够显示则说明没什么问题。还有,对于指纹录入也要进行测试,看看是否能够识别指纹,测试时,不是手指放上去后,显示正确就完成了。假如是食指录入的,要测试食指能否识别外,还有看看别的指头按上去能否开门禁,避免误判。图5.3按键及显示功能检测图5.4按键及显示功能正常首先,我们检测及密码输入解锁功能,该系统的初始密码为“123456”,当输入正确密码的时候。继电器上绿灯亮,否则蜂鸣器报警。图5.5绿灯亮密码正确图5.6密码错误显示接着,我们检测修改密码功能,功能键A是进入密码修改界面。图5.7修改密码图5.8输入新密码图5.9修改后密码输入图5.10绿灯亮功能正常重要的是,对于指纹录入进行测试,看看是否能够识别指纹,测试时,不是手指放上去后,显示正确就完成了。假如是食指录入的,要测试食指能否识别外,还有看看别的指头按上去能否开门禁,避免误判。功能键B进去指纹录入界面。图5.11进入指纹录入界面图5.12指纹录入此时指纹录入已经成功,需要对录入的指纹进行检测。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创客室工作制度
- 业余工作制度
- 2026年星级酒店公共卫生清洁消毒制度
- 九个一工作制度
- 创模工作制度
- 医养院工作制度
- 主持人工作制度
- 健康码工作制度
- 医教科工作制度
- 一家亲工作制度
- 四川省非金属(盐业)地质调查研究所2026年公开考核招聘工作人员(8人)笔试备考试题及答案解析
- 2026年护士资格考试统考历年真题及答案
- 2026江苏南京市雨花台区征收拆迁安置办公室招聘编外人员3人笔试参考题库及答案解析
- 内部财务交叉检查制度
- OpenClaw:AI从聊天到行动 下一代智能助手白皮书
- 电梯维保2026年复工培训
- 中国整形美容外科诊疗指南(2025版)
- 2026年及未来5年中国骨科手术机器人行业市场全景监测及投资战略咨询报告
- 第6章-六足仿生机器人项目设计课件
- 安全文明施工措施费专款专用的方案
- 复方氨基酸注射液
评论
0/150
提交评论