智能指纹密码储物柜的设计

目 录

摘 要 II
Abstract III
引 言 1
1 总体方案设计 3
1.1 设计要求 3
1.2 方案比较与论证 3
2 硬件介绍和设计 5
2.1 单片机及最小系统 5
2.2 液晶显示模块 6
2.3 按键控制部分电路 7
2.4 指纹模块 8
2.5 继电器模块 9
3 系统软件设计 10
3.1 系统程序工作分析 10
3.2 主程序流程图 10
3.3 LCD显示模块程序设计流程 12
3.4 Keil编程 14
4 硬件调试 16
4.1 电路的焊接 16
4.2 程序的烧写 16
4.3 小灯的调试 17
4.4 液晶的调试 18
4.5 指纹模块、按键的调试 18
结 论 19
参考文献 20
附录1原理图 22
附录2 PCB图 23
附录3源程序 24
致 谢 33

摘 要

世界在不断发展,人们的追求也在不断提高。传统的家庭防盗锁不再能满足人们的需求,因为其的构造与制作比较简单,安全性能不能得到很好的保障。现在的电子产品已经更趋向于安全化、智能化、小型化。因此在这个行业内只要谈及到控制芯片,那么首先想到的就是单片机。传统的机械式系统已经不能符合当今时下的发展需求,已经逐渐被安全性能强、体积小的电子式系统所取代。
本系统所采用的控制器是单片机,型号是 STC89C52单片机,采用的指纹存储系统是通过自购实现的。比对流程和结果则通过液晶显示出来,开锁的动作需要用到直流继电器与发光二极管来模拟。本系统摒弃了传统系统体积大、性价比低、传输速度慢等缺点,非常适合家庭或者公司使用。
结果表明,本设计制造由于结构简单,所以成本较低,性能也十分优良。通过软件与硬件方面的调试并进行仿真实验,在技术上完全可行。预期功能可以全部实现,本设计很好地实现了指纹密码锁在生活中的应用,也可以做出很好的推广。

关键词:指纹;芯片;单片机

Abstract

With the development of science and technology, the progress of society, people are more and more pursuing the quality of life. The traditional home security lock can no longer meet the needs of people, because its structure and production is relatively simple, the security performance can not be well guaranteed. Now the electric products are more security, intelligence and miniaturization. Therefore, as long as we talk about the control chip in this industry, the first thing we think about is the single chip computer. The traditional mechanical system can not meet the current development needs, has gradually been replaced by the electronic system with strong safety performance and small volume.
The controller used in this system is single chip microcomputer, the model is STC89C52 single chip microcomputer, and the fingerprint storage system is realized by self purchase. The comparison process and results are displayed by LCD, and the unlocking action needs to be simulated by DC relay and led. This system abandons the shortcomings of traditional system, such as large size, low cost performance, slow transmission speed, and so on. It is very suitable for families or companies.
The experimental results show that the design and manufacture is simple in structure, low in cost and excellent in performance. Through the debugging of software and hardware and the simulation experiment, it is feasible in technology. The expected function can be realized. This design well realizes the application of fingerprint password lock in life, making fingerprint identification technology more and more mature.

Keywords: Fingerprint identification;Single chip microcomputer;A combination lock

引 言

科技是在不断的进步的,欺骗人的手段同样也是在不断进步的,所以传统的防盗系统在现今社会来讲已经有一些落后了。人们都有一些固有思维,总认为密码银行卡等等是最具安全性的,是安防系统最有效的验证身份的信物,但是仔细分析来看,这些信物验证的不是人本身,而是该人拥有的物品。在当今社会中,持有物品的本人只要物品的有效性得到了确认,其持有者本身的身份也就得到了证实。但是,若是物品造成了丢失或出错就会相应导致物品主人的身份无法认证,并且在当今时代各种物品都是会被伪造的,所以这种通过物品来确认人的身份的办法是存在明显的漏洞的。
随着网络科技的飞速发展,各种各样的密码伴随着人们的生活,如银行密码、开机密码、社交网站登陆密码等,密码已经逐渐成为我们身份认证的标志。但是随着科技水平的提高,密码的弊端逐渐显露,容易被人遗忘和窃取,其无论是在安全性还是智能化方面都不再能满足人们的需求。如今如门锁、汽车、保险柜的钥匙也同密码一样,面临着被更新换代的局面,这些传统的安全防盗系统的安全性越来越不能得到保障。但是随着人们安保意识的加强,安全防盗系统是人们生活中必不可少的,每个人都要进行个人身份和权限的确认,同时也希望确认的方式能够快捷方便。认识到这个问题后,生物识别技术逐步走进了大众的视野,每个人都有自己独特的生理特征和独特的行为,这样人们可以把这些特点用来进行防盗。生理特征相较于密码、钥匙来说安全性能更高,具有不可复制性,有专家推论300年内都不会出现两个指纹完全相同的人(以全球60亿人口计算),这样一来人们就不用再费心去记各种复杂的密码,出门也就不用携带众多的钥匙了。拿当今电子商务的安全认证来说,如果使用安全性极高的生物特征认证方式,就可以有效杜绝假冒当事人的诈骗事件了。生物特征的应用范围很广泛。
如今日常生活中用到的如电饭煲、汽车、洗衣机等都需要微处理器来控制,这是与单片机分不开关系的,单片机具有控制性能强、可靠性高等优点,如今作为控制器的技术已经发展得十分迅猛。因此本设计选择了使用单片机控制,完成指纹识别操作这一课题。在实践中将课堂中所学的知识利用起来,充分发挥二者结合的优势长处。
生物识别技术包含的范围很广泛,很多的生理特性和特点都可以用来进行识别,由于不同生物识别技术之间存在着差异,指纹识别是其中较有优势的一种识别方式,也可以大规模的投入市场应用,这项新技术的研发有效缓解了当今世界的安保压力,及时接替了传统安保系统的重担。
一方面,市场上充斥着很多低价位的取样产品,他们可以快速的取样。这样也加快了指纹识别系统的发展。这项新技术已经应用到很多的产品上,包括人们现在使用的手机,大部分都已经安装了指纹解锁的功能,人们所使用的门锁大部分也都已经采取了指纹解锁的功能。
目前我国在这一领域并没有一个强有力的品牌和厂家可以推出自己的产品,并且去占有一定的市场份额,虽然有一些也已在研发这样的产品,但他们大多数都是通过直销的方式为政府机关、金融企业提供产品,并没有放开全国性业务。可以看出这项产品的技术还是没有攻克,还需要更加努力。
现在指纹锁无论是技术还是工艺方面占据优势的是德国与韩国。国内的工艺水平较低,主要以组合安装为主,如岭南锁系。国内的大部分指纹锁产品由于技术水平不够只是占据了低端市场。国外的产品在我国占据了很多的高端市场进行销售,由此可见国内外品牌的利润相差悬殊。随着公众对于传统门锁需要更新换代的呼声越来越高,国内企业在这样巨大的市场需求下纷纷开始研制指纹安防产品,但是目前的这种情况并没有得到有效的改观。
电子锁、单片机、指纹模块、ADC键盘、液晶显示屏、时钟是本设计的几个主要部分构成,在整个系统当中,指纹当然是整个系统最重要的重中之重,在第一章中介绍如何选择这个方案以及如何构思。第二章介绍是怎么设计所需要的电路的。第三章介绍设计系统软件。第四章介绍实物制作与调试。

1 总体方案设计

本设计采用的核心处理器为STC89C52单片机,其是一种直流供电电压的8位微控制器单片机,电压为2.0V至3.8V,内部具有大存储量的内存空间。其在原有基础上进行了许多改进,相较于传统的51单片机单位时间内消耗功率更少。STC89C52单片机是许多嵌入式控制系统的理想选择,因为其的效率和灵活度都较高,具有平滑的8位CPU和可编程闪存系统。总体框图如图1.1
在这里插入图片描述

图1.1 系统总体框架图
1.1 设计要求
1)开机,按下开机键以后,根据显示屏的指示,我们将手指进行放入。这里需特别注意,在本系统中识别成功的标志是绿灯亮起。如果没有识别成功,则绿灯不会亮起,需要进行第二次识别。
2)管理员模式:正确输入六位数的密码方可进入到管理员模式,如果密码不正确则不能进入管理员模式。管理员模式是帮助用户在初始状态下录入指纹,以及在必要时候删除或更改指纹。本系统还具备修改密码的功能。同时,管理员模式还可以进行危急情况下的应急开锁功能。
1.2 方案比较与论证
方案一:控制数字电路
本法的优势就是设计简单,经济实惠。一共需要输入十六个按键,但是其中有十二个按键是有效的密码按键。当其他人输入密码错误三次以上,则系统会自己锁定。同时还有备用电源,备用电源的作用就是当停电时,备用的电源可以支持系统正常的工作。
其如图1.2所示:
在这里插入图片描述

图1.2 数字密码锁方案
方案二:控制主体是单片机
首先,设备的编程方式是灵活的:为了提高使用的安全性和节约用户的成本,用户在更换程序时,可以直接擦拭之前输入的程序,重新写入程序下载到设备中,这样在编程过程中用户就可以根据自己的需求来进行程序设计。其次可以添加多个组件的I / O端口是非常灵活的,可以实现其他机械锁不能完成的功能,比如可以显示时间和温度,还可以添加远程控制等功能。若是在其他机械锁中也想实现这种效果,则需要增加额外的组件。准确性是至关重要的,它是保障安全性的前提,如果想要实现稳固的安全保障,精度就要达到一定的要求。单片机的准确性还是合乎标准的,以其为核心的控制方案在实现基本功能的基础上,还可以增加一些额外的功能。
进行比较后发现单片机方案还是有很大发展空间的,不仅可以满足基本需求还能一定程度上增加一些额外的功能,同时系统升级也比较便利。所以在权衡利弊后我们选择以单片机为核心的控制方案。

2 硬件介绍和设计

2.1 单片机及最小系统
该系统中最小的模块是单片机的最小系统如图2.1所示。
在这里插入图片描述

图2.1单片机最小系统
2.1.1 STC89C52单片机介绍
单片机就是将各个方面的集成电路进行集合,并且具有自我计算能力的集成电路。它其中有中央处理功能,有存储功能,还有输入和输出功能。
STC89C52单片机的特点是能耗低、简单实用、经济价值高。内部存储空间大,并且可以随意编程,出现错误可以进行随意改变。
2.1.2 外部晶振的设计
该种振荡器在系统中的作用十分重要。振荡的频率越快,则单片机运行的
速度越快;振荡的频率越慢,则单片机运行的速度越慢。普通的已经可以在本设计中使用,更高级别的暂时在本次设计中还用不到。
在该系统中本设计选择的是电容值为30PF的振荡器。时钟电路如图2.2所示。
在这里插入图片描述

图2.2外部晶振电路

本设计所选择的晶振频率是可以满足单片机进行正常使用的,所以该设计十分合理。它的振荡周期是约为1us。
2.1.3 复位电路的设计
在实际的操作中,设计有时候需要将电路进行复位,也就是将电路调整到一个固定的状态,简称为复位。单片机也有自己的复位电路,在本次设计中需要用到。一般的复位电路分为两个部分。一个部分是充上电源以后可以进行复位,另一个部分是通过按键对其进行复位。
(1)上电复位:在本系统中就是通过电容将电压降低到低电压,作用就是可以将系统和单片机进行系统复位。
(2)按键复位:在本系统中,通过按动开关S1,即可对系统进行复位。
复位电路如图2.3所示。
在这里插入图片描述

图2.3复位电路
2.2 液晶显示模块
液晶显示屏的技术成熟于上个世纪,它的特点是显而易见的,所占的空间少,体积小。工作环境适用广,在极高的温度和极低的温度下都可以保持正常的运行,同时价格低,易于大批量生产,也易于在本次系统中进行选择使用。
2.3 按键控制部分电路
在本系统操作当中,断开的显示就是高电平。反之,如果系统显示是低电平,则表明正常的连接。通过这个特点,我们就可以判断按键是按下还是没有按下。同时在本系统中我们还考虑到了消除干扰信号的问题,本设计加入了一个抖动电平。按键电路如图2.4所示。
在这里插入图片描述

图2.4按键闭合及断开前后的电压
按键的设计,本设计选择了独立按键和矩阵式按键两种方案进行比较。独立按键的优点是独立配置,简单方便耐用,经济价值实惠,但是它比较浪费资源。所以在面对本设计按键较多的复杂情况下,本设计选择矩形按键,如图2.5所示。矩形按键的优点是系统具有可靠性,键盘设计也较为简单。按键按下呈低电平,并采用软件消抖来减少对单片机影响。
在这里插入图片描述

图2.5按键电路
如上图所示,交叉点就是我们按键的位置。当按键时,通过电平的变化可以得知按键的变化。在此次实验中所采用的方法是扫描法。当按键为按下时,则可以通过万用表检测出为低电平。如果想要确定是按下的哪个按键,那么只需要检测其他按键为高电平,低电平的那个就是按下的按键。
2.4 指纹模块
2.4.1 指纹模块简介
AS608是本设计的指纹模块型号,其电路图如图2.6所示。
在这里插入图片描述

图2.6指纹模块
指纹模块里边也有相应的填充芯片,外面用来验证指纹生物特征的是CMOS芯片,图2.7所示就是一个用户的指纹模板,若想生成指纹模板需要进行两次的指纹特征认证。
首先用户需要进行指纹扫描,在指纹模块识别到指纹的生物特征后会形成一个合成模板,也就是建立属于用户的指纹库文件。这就是指纹模块的具体运作流程。

在这里插入图片描述

图2.7 指纹模版

这个模块的作用主要就是记录下每一个人手指的样子,并且将记录下来的样子进行存储。工作的流程就是当它进行识别指纹时,识别到的指纹会与数据库中的指纹进行比对,如果可以比对的上则识别成功。
主要技术指标:
供电电压:交流电3.8~7.0V
背光颜色:红色
亮灯方式:亮和闪烁
供电电流:工作电流:<65毫安
峰值电流:<95毫安
指纹图像录入时间:<0.5秒
2.4.2 指纹模块命令
单片机的接口发送与接受命令是指纹模块能够成功运行的关键。指纹模块首先接受串口发送来的命令,之后再传回数据。若想知道命令有没有成功地执行,则需要观察单片机对数据的处理程度。
2.5 继电器模块
由指纹模块和密码设置模块接收上位机的信号,单片机收到指令开始工作。如果密码输入正确或者指纹识别成功,则控制门锁电路的继电器工作,控制门锁打开,同时显示模块显示锁已开,延时一段时间后电子锁本身电路工作,从而实现开锁功能。继电器模块如图2.8所示。
在这里插入图片描述

图2.8继电器电路

3 系统软件设计

3.1 系统程序工作分析
本系统中所采用的控制器是单片机,其连接两个模块,一个是按键的程序。另一个是指纹的程序。其模式主要是主程序能够随时调用作为子程序的C语言函数(指纹识别模块和液晶)。在本文所设计的程序中,对单片机进行编程的方式是利用到了Keil单片机软件开发环境。首先将源程序拆分成几个模块分别进行编写,最后整理成一个最终文件,这刚好符合模块化的程序设计。我们可以比较大限度地进行程序的编写和调试,代码文件通过后可以下载到单片机,这都得力于开发环境的宽松,可以对软件进行仿真调试。主程序的初始化工作应该伴随着单片机的上电完成。主程序需要对液晶初始化,同时要检测按键,这都是基于电路的功能要求。
3.2 主程序流程图
下图3.1所示为根据分析后所制订的主程序设计流程。
若要对程序进行巡检,第一个模块首先会进行初始化状态设置,之后系统会判断是否有按键进行按下以及哪个按键进行按下。
液晶、通讯子程序、按键程序是构成主程序的重要组成部分。若要完成一个完整的主程序工作,首先则要对各种硬件功能模块进行初始化。(这其中包括液晶显示、键盘扫描、指纹模块)

在这里插入图片描述

图3.1 主程序流程图

3.3 LCD显示模块程序设计流程
这个模块的主要功能就是为了在液晶屏幕上显示收到指令的程序数据内容。程序流程如图3.2所示
在这里插入图片描述

图3.2 程序流程图
3.3.1 指纹模块通讯协议说明
该模块在收到和发出信号的时候,都采用的是接收数字信号的模式。需要注意一点,在接收信号和发出信号的同时,高字节的信号要在低字节信号之前进行发出。
模块需要接收上位机发出的指令,与此同时,它会自己计算出一个结果,将该指令传递到下一个模块。这里我们要引出一个新的概念叫应答包,应答包可以处理以上接收信号,并且做出判断和指令传输到下一个模块。与此同时接收到正确的指令以后将会执行相应的操作,如果接收到的是错误指令,则不会进行相应的操作。
3.3.2 指纹模版的采集存储
对同一用户的相同指纹连续收集两次,收集的图像存储在缓冲区Image Buffer,之后图像会转化成指纹的生物特征,从而可以将该指纹存储到存储库当中。这样一个简单操作的过程就是指纹的采集。该系统的指纹库一共可以存储采集大约五百个左右的指纹,并且可以对每一个指纹进行独立编号,编号的方式就是录入的先后顺序,分为一二三,一直到五百。指纹采集程序图如图3.3所示。
在这里插入图片描述

图3.3 指纹采集程序
3.3.3 指纹比对程序设计
该系统在进行指纹是否是正确的比对操作时,首先会将录入的指纹与自己储存的指纹库当中的指纹进行比较。对指纹库当中的指纹进行搜索,搜索出来的指纹与相应的指纹进行比较,如果比对成功则代表指纹输入成功,如果比对失败则代表输入不成功。搜索的方式为从一到五百依次进行指纹搜索。指纹比对程序图如图3.4所示

在这里插入图片描述

图3.4 指纹比对程序
3.4 Keil编程
上文显示所有的硬件都已经选择好,接下来就需要开发指纹模块、液晶、按键,而进行开发的核心就是电路中的主控制器单片机。主程序需要对子程序进行调用,所以首先应建立C语言一系列的子程序。采用Keil用于单片机的编程。C源码可以被Keil编译并汇编源程序,其的优点就在于可以快速生成代码,且生成的汇编代码通俗易懂。 [11] 该软件的优点为简单操作实用,经济实惠,编程能力十分强大。
流程:
(1)创建一个命名为“Fingerprint”的新工程。
(2)新建一个命名为main.c的text文件,然后在Target 1的子文件Source Group 1中添加main.c文件。
(3) 在弹出下一个对话框之后,在Xtal后输入9600,即单片机的工作频率为9600MHz。设置波特率如图3.5所示。
在这里插入图片描述

图3.5设置波特率
(4)点击Output标签,勾选Create HEX前的方框,这样可以生成hex文件以便输入单片机中。
(5)编程
(6)修改错误
(7)测试并且使用

4 硬件调试

4.1 电路的焊接
4.1.1 焊前准备
如果想要做好引线成型等装配前的准备工作,同时要熟悉焊接的先后顺序。并且按照图纸严格的进行焊接,不允许超过图纸自己焊接。程序所遵循的顺序就是先焊电阻,后焊电容。之后才是二极管,三极管等等,主要就是先小后大,先易后难。在焊接电容时,我们要清楚的一点是不要搞错电容的正负极。在焊接二极管时,不要搞错二极管的阴阳极,同时时间也不要超过太长,大概是一秒钟左右为最好。焊接三极管时不要搞错三个引线的位置,同时焊接的时间要最短,为的是加快散热。对于集成电路的焊接,一定要严格按照图纸来进行焊接,各个型号和引脚的位置都要符合图纸中所出示的位置。多余的引脚不要保留,应该用剪刀将它剪去。
4.1.2 注意事项:
1)为了让屏幕能够正常显示、保持完好,不能对正在处理机械振动的模块施加外力。
2)为了保护屏幕的完整光滑,不能用手或坚硬工具划、按压、磨擦显示屏。
3)如果发生意外情况导致屏幕碎裂,液晶化学材料流出,要严禁皮肤与液晶接触,如果不慎接触要即刻用酒精和水清洗。
4)如果显示屏有异物,可以用棉球蘸取少量的石油苯来轻轻擦拭屏幕,不能使用对偏光片不利的可溶有机体来清洗显示屏。
5)要注意高压静电,其中放出的电流将损坏模块中的CMOS电路。
6)模块的放置环境对温度和湿度都有严格的要求,温度不能过高,保持在35度一下,湿度也要保证好,如果湿度多大,很多的元器件将会失灵。
7)模块的存储环境要远离太阳直射的地方。
4.2 程序的烧写
本设计采用的是STC-ISP,该软件的特点是操作简单易于学习,编程发现错误以后可以尽快的修改,因此应用十分广泛。烧写程序如图4.1所示。
在这里插入图片描述

图4.1烧写程序

调试通过的代码文件通过STC_ISP_V480下载到单片机。STC_ISP_V480使用步骤为:
(1)打开STC-ISP,在MCU Type栏目下选中单片机STC89C52RC。
(2)选中COM端口,波特率选择9600。
(3)点击“打开文件”按钮并在对话框内找到要下载的HEX文件。
(4)点击download/下载,根据提示给单片机上电,即可完成程序烧写。
在对单片机进行增加电源之前,首先应该将主程序的初始化也完成。按照对电路的功能化要求,主程序在有对应的按键按下时,要执行相应的操作,且必须要对按键检测,液晶也要初始化。
4.3 小灯的调试
当按下电源键的时候,灯是否亮起,则证明该电路是否已经正常的运行。之后要做的工作就是进行单片机的测试。首先导入单片机一段程序。该程序如果可以正常运行时,小灯是可以正常的亮起。如果此时小灯没有按照我们的程序正常亮起,则证明单片机是有问题的,需要把它拆下来进行维护和更换。
4.4 液晶的调试
首先我们导入测试程序,并且对该系统进行通电。通过调节液晶显示器后面的调节按钮。这时在屏幕的正中央出现了一个小方格,这是液晶显示屏出现了一定问题,所以不能正常地接收和发出指令。可以按照标准化的步骤对其进行调试如图4.2所示。
在这里插入图片描述

图4.2调试过程
4.5 指纹模块、按键的调试
首先将之前所编写好的程序进行导入。
1)打开电源,观察电源的指示灯是否亮起。
2)按“*”键,等待液晶显示屏上出现让用户输入指纹的指示。方法就是当有人把手指放到上面的时候,小灯也会正常的亮起。
3)如果指纹被系统识别成功,则灯亮起以后使用者可以打开。如果用户的指纹没有被识别成功,此时则需要重新进行输入,三次输入失败以后系统将会进行报警。
4)该系统还可以进行输入密码、删除密码以及管理员进行操作的模式。
5)进入管理员模式,此时我们可以进行密码的输入。密码是由六位数字进行组成,如果我们输错可以进行删除。
6)对于已经录入的密码,如果我们想要删除这个密码,进入管理员模式以后也可以对其进行相应的删除。
如果以上步骤不符合要求需要重新检查程序,直到实物可以正常工作为止。
如满足上述要求时,实物就算调试完成,达到设计要求。

结 论

在本篇文章中主要展示了一个指纹识别系统,它的控制核心就是单片机。单片机进行控制指纹识别模块识别我们的指纹,液晶显示屏显示数字和文字。通过按键可以精准的进行信号的识别与确认,最后LED指示灯也可以让用户一目了然操作是否成功。文章首先介绍了指纹识别系统的原理,还进一步介绍了识别系统所应用的各种硬件电路,系统使用Keil软件进行编程,将软件编程好以后,本设计通过检测将正确的软件导入到单片机中,使整个系统可以正常的运行。研制成功以后,此设计不仅可以运用到家里的门锁上面,还可以运用到商场的贵重物品上,应用的前景十分广泛。
本设计由于还有很多硬件软件待开发,以上只是本设计的大致内容,为了能使人们的信息安全得到保障,并且充分为受众提供便利,还需要更多的相关从业者投入到其中来进行创新完善。

参考文献

[1] L.Coetzee, et al. Fingerprint Recognition in Low Quality Images. Pattern Recognition.1993,vol.26:1441-1460.
[2] TIAN Jie, CHEN Xinjian, et al. Recent progress in fingerprint recognition. Progress in Natural Science. 2006, vol.03:231-240.
[3] 赵玉兰,姜春风,方修丰.指纹识别技术在煤矿门禁系统中的应用与实现[J].煤炭技术.2010,29(11):132-134.
[4] 赵晓玲.单片机在指纹保险柜中的应用[J].微计算机信息.2006,20(20):134-136.
[5] 刘小华,王燕生.指纹识别技术的发展[J].光学技术.1998,23(04):78-80.
[6] 郭天祥.新概念51单片机C语言教程[M].北京:电子工业出版社,2009:60-400.
[7] 张毅刚.单片机原理与应用[M].北京:高等教育出版社,2006:56-234.
[8] 赵建领.51单片机开发与应用技术详解[M].北京:电子工业出版社,2009:75-124.
[9] 陈光新.自动指纹识别技术及其应用[J].江苏船舶.2004,24(03):32-35.
[10] Kazuharu Yamato, et al. Problems of Fingerprint Lookup Devices and How to Resolve Them. Gazo Denshi Gakkaishi.1995,vol.24:382-391.
[11] 郑春来,韩团军,李鑫.编译软件Keil在单片机教学中的应用[J].高教论坛.2009,15(12):96-97.
[12] Prata.S.C Primer Plus中文版[M].北京:人民邮电出版社,2005:74-99.
[13] 吴凌燕.基于Proteus的单片机仿真设计[J].仪表技术.2011,17(07):31-37.
[14] 唐钱辉,丁明亮.Proteus ISIS 和Keil在单片机教学中的应用[J].重庆电力高等专科学校学报.2006,8(04):46-49.
[15] 林三宝.高效焊接[M].北京:机械工业出版社,2012:45-78.
[16] 杨朋飞,聂亮,陈靖,蔡长龙.基于STC89C52单片机的指纹密码锁系统设计与实现[J].传感器与微系统,2020,39(05):81-83+86.
[17] 唐瑞,于娟.基于单片机的指纹密码锁系统设计[J].科技与创新,2016(12):12-13.
[18] 林立,张俊亮.单片机原理及其应用 [M]. 北京:电子工 业出版社, 2009.
[19] 陈光新.自动指纹识别技术及其应用 [J]. 江苏船舶, 2004 , 21 ( 3 ) .
[20] 赵玉兰, 姜春风, 方修丰.指纹识别技术在煤矿门禁系统中的应用与实现 [J].

附录1原理图

在这里插入图片描述

附录2 PCB图

在这里插入图片描述

附录3源程序

#include <reg52.h>
#include <intrins.h>
#include “matrix_key_4x4.h”
#include"LCD12864.h"
#include “24c0x.h”
#include “finger.h”
#include “JQ6500_KEY.h”
unsigned char pas[6] = {1, 5, 8, 1, 5, 8}; //存储密码数组
unsigned char pas_power[6] = {1, 5, 8, 1, 5, 8}; //强制密码(忘了密码时,这个密码作为强制密码可以生效)
unsigned char pas_tmp_[6] = 1; //临时输入的密码存储地方
unsigned char finger_del_num[3] = {9,9,9}; //存储要删除的指纹号
#define C_KEY_V 10 //密码界面进入按键
#define B_KEY_V 11 //修改密码界面进入按键
#define D_KEY_V 12 //删除输错的密码按键
#define Q_KEY_V 13 //确认按键
#define X_KEY_V 14 //星号键–用于进入指纹设置界面
#define M_KEY_V 15 //米号键–用于退出指纹设置界面

sbit relay = P3^6; //继电器IO口 引脚

unsigned char key_value = 20; //存储矩阵键盘键值

unsigned char pas_check( unsigned char password[6], unsigned char pas_input[6] ); //密码对比函数
unsigned char get_6_bit_pas( unsigned char pas_tmp[6] ); //获取六位密码
void keyboard_password_deal(); //矩阵键盘密码处理函数
void change_password(); //修改密码函数
void init_pas_data(); //上电初始化密码数据函数
void ir_password_deal(); //红外密码处理函数
unsigned char ir_get_6_bit_pas( unsigned char pas_tmp[6] ); //获取红外键盘六位密码
void ir_change_password(); //利用红外键盘修改密码函数
void finger_idtf(); //指纹识别函数

void delay( unsigned int i){ while(i–); } //短延时函数
void beep_short(unsigned int i){ beep = 0; delay(i); beep = 1; } //蜂鸣器短鸣函数

//首界面函数
void lcd_first_interface(){
LcmClearTXT();
PutStr(0,1, “密码门禁系统”);
PutStr(3,0, “按指纹解锁”);
PutStr(2,0, “按键C : 输入密码”);
PutStr(1,0, “按键B : 修改密码”);
}

//主函数
void main(){

fingerprint_init();   //指纹模块初始化
jq6500_init();
LcmInit();	       //LCD12864初始化				                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
LcmClearTXT();	   //LCD12864清屏		
init_pas_data();        //上电初始化密码数据函数

lcd_first_interface();  //首界面函数


while(1){
	key_value = get_key();    //获取矩阵键盘键值
	keyboard_password_deal(); //矩阵键盘密码处理函数
  finger_idtf();       //指纹识别与处理函数
}

}

//指纹识别函数
void fingerprint_identification(){
unsigned char IDs1,IDs2,IDs3;
LcmClearTXT();
PutStr(1,1,“请按手指开锁”);
delay(50000);
SFG_identify();
while(confir_code2){ SFG_identify(); }
if(confir_code
0){
LcmClearTXT();
PutStr(1,2,“门已打开”);
jq6500_Mkey_play(2 );
IDs1=PageID/100;
IDs2=PageID/10%10;
IDs3=PageID%10;
PutStr(2,1,“编号为:”);
WriteCommand(0x8D); //指定第三行显示位置
WriteData(0x30+IDs1);
WriteData(0x30+IDs2);
WriteData(0x30+IDs3);
relay=0;delay(50000);delay(50000);delay(50000);delay(50000);relay=1;
}else if(confir_code==9){
LcmClearTXT();
PutStr(1,1,“没搜索到指纹”);
PutStr(2,1,“请重新按手指”);
jq6500_Mkey_play(3);
beep=0;delay(50000);delay(50000);beep=1;
}else{
LcmClearTXT();
PutStr(1,1,“请勿移开手指”);
PutStr(2,1,“或重新按手指”);
delay(50000);delay(50000);
}
}

//录入指纹
void finger_add(){
unsigned char IDa1,IDa2,IDa3;
LcmClearTXT();
PutStr(1,2,“请按手指”);

finger_wak = 0;
while(finger_wak == 1);  

SFG_getimage();	  while(confir_code!=0) {SFG_getimage();delay(100);}
SFG_genchar(); UART_Init();
SFG_fastsearch(); while(confir_code==1) {SFG_fastsearch();}

if(confir_code==0){
	LcmClearTXT();
	PutStr(1,1,"该指纹已存储");
	delay(50000);delay(50000);delay(50000);
}else if(confir_code==9){
		SFG_enroll();	while(confir_code==2){SFG_enroll();}

		LcmClearTXT();
		if(confir_code==0){ 
			IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;
			PutStr(1,1,"指纹采集成功");
			PutStr(2,1,"编号为:");
			jq6500_Mkey_play(2);
			WriteCommand(0x8D); 
			WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);
			beep=0;
  	}else  if(confir_code!=0){
			PutStr(1,1,"指纹采集失败");
			PutStr(2,1,"请重新操作");
			jq6500_Mkey_play(3);
 		}
}			
	delay(50000);delay(50000);delay(50000);beep=1;

}

//清空所有指纹–应用函数
void finger_clear_all(){
SFG_empty();
LcmClearTXT();
if(confir_code==0){
PutStr(1,1,“删去所有指纹”);
PutStr(2,3,“成功”);
jq6500_Mkey_play(2);
}else{
PutStr(1,1,“删去所有指纹”);
PutStr(2,3,“失败”);
jq6500_Mkey_play(3);
}
delay(50000);delay(50000);delay(50000);
}

unsigned char get_3_bit_finger_del_num( unsigned char pas_tmp[3] ){

unsigned char flag_cn = 0;
unsigned char key_v = 20;
LcmClearTXT();
PutStr(0,1,"请输入指纹号");
WriteCommand(0x93);		//指定第三行显示位置

while(flag_cn < 3){
	key_v = get_key();
	if(key_v < 10){ WriteData(0x30+key_v); pas_tmp[flag_cn++] =  key_v;  }
	if(key_v == D_KEY_V){ if(flag_cn > 0) PutStr(2,flag_cn--, " "); }
}
PutStr(2,1,"请输入确认键");
while(get_key() != Q_KEY_V); 
return 1;

}

//根据指纹录入编号删除指纹
void finger_del(unsigned int num){
SFG_deletchar(num);

if(confir_code==0){
	LcmClearTXT();
	PutStr(1,1,"删去指纹成功"); 
}else{
	LcmClearTXT();
	PutStr(1,2,"删去指纹失败");  
}
delay(50000);delay(50000);delay(50000);

}

void finger_deaL(){
LcmClearTXT();
PutStr(0,0, “按键1 : 录入指纹”);
PutStr(1,0, “按键2 : 删去指纹”);
PutStr(2,0, “按键3 : 清空指纹”);
PutStr(3,0, “按键# : 退出”);
while(key_value != M_KEY_V ){
key_value = get_key();
if(key_value < 4 && key_value > 0){
switch(key_value){
case 1: finger_add(); break;
case 2: get_3_bit_finger_del_num(finger_del_num); finger_del(finger_del_num[0]*100 + finger_del_num[1]*10 + finger_del_num[2]); break;
case 3: finger_clear_all(); break;
}

			LcmClearTXT();
			PutStr(0,0, "按键1 : 录入指纹");
			PutStr(1,0, "按键2 : 删去指纹");
			PutStr(2,0, "按键3 : 清空指纹");
			PutStr(3,0, "按键# : 退出");
		}
	}

}

//指纹识别与处理函数
void finger_idtf(){
finger_wak = 0;
if(finger_wak == 1){
LcmClearTXT();
PutStr(0,1, “指纹唤醒”);

	fingerprint_identification();
	
	while(finger_wak == 1);
	lcd_first_interface();
}

if( key_value  == X_KEY_V){
	 
			 LcmClearTXT();	   //LCD12864清屏	
			 PutStr(1,1, "输入6 位密码  ");
				get_6_bit_pas(pas_tmp_);
				if(pas_check(pas, pas_tmp_) == 1 || pas_check(pas_power, pas_tmp_) == 1){
						finger_deaL();
				}else{
						PutStr(3,2, "密码错误");
						jq6500_Mkey_play(3);
						//beep = 0;
						delay(50000);delay(50000);delay(50000);delay(50000);delay(50000);delay(50000); 
						beep = 1;
				}
				lcd_first_interface();
}

}

//初始化内部eeprom —用于读取之前保存的距离限制值
void init_pas_data(){
unsigned char is_first_init1 = at24c0x_read(0x20);
unsigned char is_first_init2 = at24c0x_read(0x21);
unsigned char i = 0;
if( (is_first_init1 + is_first_init2) == 8){
for(i=0; i<6; i++){ pas[i] = at24c0x_read(i); }
}else{
at24c0x_write(0x20, 0x01);
at24c0x_write(0x21, 0x07);
for(i=0; i<6; i++){ at24c0x_write(i, pas[i]); }
}
}

//按键密码处理函数
void keyboard_password_deal(){

			//密码验证开始
			 if( key_value  == C_KEY_V){
				 
			 LcmClearTXT();	   //LCD12864清屏	
			 PutStr(1,1, "输入6 位密码  ");
				get_6_bit_pas(pas_tmp_);
				if(pas_check(pas, pas_tmp_) == 1 || pas_check(pas_power, pas_tmp_) == 1){
						PutStr(3,2, "门已打开");
						jq6500_Mkey_play(2);
						relay = 0;
						delay(50000);delay(50000);delay(50000);delay(50000);delay(50000);delay(50000); 
					  relay = 1;
				}else{
						PutStr(3,2, "密码错误");
						jq6500_Mkey_play(3);
						//beep = 0;
						delay(50000);delay(50000);delay(50000);delay(50000);delay(50000);delay(50000); 
						beep = 1;
				}
				lcd_first_interface();
		 }else if( key_value >= 0 && key_value <= 9 ){
			jq6500_Mkey_play(1);
		 }
		 //密码验证结束
		 
		 //修改密码开始
		 change_password();
		 //修改密码结束

}

//修改密码函数
void change_password(){
unsigned char new_pas1[6] = 0;
unsigned char new_pas2[6] = 0;
unsigned char i = 0;
if( key_value == B_KEY_V){

			 LcmClearTXT();	   //LCD12864清屏	
			 PutStr(1,1, "输入6 位密码  ");
				get_6_bit_pas(pas_tmp_);
				if(pas_check(pas, pas_tmp_) == 1 || pas_check(pas_power, pas_tmp_) == 1){
					LcmClearTXT();	   //LCD12864清屏	
					PutStr(1,1, "请输入新密码");
					jq6500_Mkey_play(1);
					get_6_bit_pas(new_pas1);
					LcmClearTXT();	   //LCD12864清屏	
					PutStr(1,1, "再输入新密码");
					jq6500_Mkey_play(4);
					get_6_bit_pas(new_pas2);
					if( pas_check(new_pas1, new_pas2) ){
						LcmClearTXT();	   //LCD12864清屏	
						PutStr(1,1, "密码修改成功");
						jq6500_Mkey_play(2);
						for(i=0; i<6; i++){
								pas[i] = new_pas1[i];
							at24c0x_write(i, pas[i]);
						}
					}else{
						LcmClearTXT();	   //LCD12864清屏	
						PutStr(1,1, "两次输入密码");
						PutStr(2,2, "不一致");
						jq6500_Mkey_play(3);
					}
					delay(50000);delay(50000);delay(50000); 

				}else{
						PutStr(3,2, "密码错误");
						jq6500_Mkey_play(3);
						//beep = 0;
						delay(50000);delay(50000);delay(50000);delay(50000);delay(50000);delay(50000); 
						beep = 1;
				}
				lcd_first_interface();
		 }

}

//得到六位密码
unsigned char get_6_bit_pas( unsigned char pas_tmp[6] ){

unsigned char flag_c = 0;
unsigned char key_v = 20;
while( flag_c < 6  || key_v != Q_KEY_V ){
	key_v = get_key();
	if(key_v < 10 && flag_c < 6){ pas_tmp[flag_c++] =  key_v;  PutStr(2,flag_c, "*"); }
	if(key_v == D_KEY_V && flag_c > 0){ PutStr(2,flag_c--, " "); }
}

return 1;

}

//六位密码比较输出
unsigned char pas_check( unsigned char password[6], unsigned char pas_input[6] ){

int i = 0;

for(i = 0; i<6; i++){
	if(password[i] != pas_input[i]){ return 0; }
}
return 1;

}

致 谢

在本次毕业设计过程中,我也遇到了很多的困难和问题,但都正常的解决了。应该感谢谢莹老师和冯雅丽老师的论文指导,因为在整个过程当中他们对我提供了很大的帮助和很多意见性上的指导。他们都对我进行了无私的指导和帮助,有的同学手把手教我焊电路板,由于我不熟练,在操作过程当中造成了元器件的损坏。但是,我并没有气馁。还有的同学帮我调试程序,有时一个程序要连续调好几个小时,他们很有耐心,一边调试一边给我讲程序的道理,我获益匪浅。另外,在校图书馆查找资料的时候,也找到了很多对于本篇论文有帮助的书籍。还要感谢指导老师及学长不厌其烦的帮助我进行论文的修改和改进。还有我大学四年来教导过我的所有老师,为我打下了专业知识的基础,帮助我本次论文顺利的完成。
感谢本次毕业设计所涉及到的各位学者。本文引用了许多学者的研究文献,这些给了我很多的思路和启发。同时也让我对自己的论文产生了一个明确的思路。最后还是感谢大学四年里在绿岛帮助过我的同学和老师,希望在未来的日子里,我们可以共同进步,砥砺前行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA高端项目:FPGA基于GS2971的SDI视频接收+OSD动态字符叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS多路视频融合叠加应用…

maven archetype 项目原型

拓展阅读 maven 包管理平台-01-maven 入门介绍 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的详细对比表格 maven 包管理平台-02-windows 安装配置 mac 安装配置 maven 包管理平台-03-maven project maven 项目的创建入门 maven 包管理平台-04-maven archetype 项目原型 ma…

c++ primer学习笔记(二)

目录 第三章 一、命名空间的using声明 二、标准库的string类型 1、string对象的定义和初始化 2、string对象的读写 3、string对象的操作 4、string对象中字符的处理 三、标准库的vector类型 1、vector对象的定义和初始化 2、vector对象的操作 四、迭代器简介 1、简…

阿里云ECS u1实例2核4G,5M固定带宽80G ESSD Entry盘价格199元一年

阿里云ECS u1实例2核4G&#xff0c;5M固定带宽 80G ESSD Entry盘199元一年&#xff0c;购买条件为企业用户&#xff0c;新用户和老用户都可以&#xff0c;但必须是企业用户&#xff0c;如果是个人实名认证&#xff0c;可以升级为企业认证再购买&#xff0c;ECS通用算力型u1实例…

顶顶通呼叫中心中间件-机器人话术如何实现在放音期间不接收按键信息

文章目录 前言联系我们实现方法 前言 场景&#xff1a;进入机器人话术时&#xff0c;在话术放音期间不接收用户的按键信息&#xff0c;等话术放音完成后才允许接收用户的按钮信息&#xff0c;然后根据用户的按钮信息执行相应的机器人话术流程。 联系我们 有意向了解呼叫中心中…

第一节 JDBC是什么?

JDBC代表Java数据库连接(Java Database Connectivity)&#xff0c;它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API&#xff0c;换句话说&#xff1a;JDBC是用于在Java语言编程中与数据库连接的API。 JDBC库包括通常与数据库使用相关&#xff0c;如下面提到的…

史称GPT-4最强劲敌——Claude 3 大模型它来了【附体验教程】

Anthropic 的 Claude 3 Sonnet 模型现已在亚马逊云科技的 Amazon Bedrock 正式可用。 Amazon Bedrock 是目前 第一个 也是 唯一 一个提供 Claude 3 Sonnet 的托管服务 。 Claude 3 免费测试体验者福利&#x1f9e7;&#xff1a;https://mp.weixin.qq.com/s/hszLRa8B5zKsTDg2bmI…

C#,入门教程(06)——解决方案资源管理器,代码文件与文件夹的管理工具

上一篇&#xff1a; C#&#xff0c;入门教程(05)——Visual Studio 2022源程序&#xff08;源代码&#xff09;自动排版的功能动画图示https://blog.csdn.net/beijinghorn/article/details/124675293 大家平时都怎么管理源代码与文件夹呢&#xff1f;世界上最好的集成开发环境…

varchar类型字段为什么经常定义成255

MySQL | ver < 4.1&#xff1a; VARCHAR以字节为单位存储&#xff0c;所以假设全部为常用汉字&#xff08;UTF-8 3字节编码长度&#xff09;&#xff0c;则VARCHAR(255)共可存放约85个汉字&#xff1b; MySQL | ver > 4.1&#xff1a; VARCHAR以字符为单位存储&#x…

对于网络IO的理解

网络IO理解 首先服务端将本机地址和端口bind在listensock上&#xff0c;再用listen()去将listensock套接字设置为listen状态&#xff0c;然后调用accept&#xff0c;进入阻塞状态。如果此时有客户端请求连接&#xff0c;就是第一次握手的开始。 客户端会先调用connect来申请连…

牛客网 华为机试 提前不重复的整数

本题要求提取不重复的整数&#xff0c;然后倒序输出&#xff0c;我们可以采用hashset来存储结果&#xff0c;这样就能避免重复。 为了从右往左获取数字&#xff0c;我们可以把这个数对10取余&#xff0c;得到的余数就是其每一位的数。然后我们把得到的数字添加到hashset中&…

#QT(MP3播放器-部分界面)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;制作一个mps播放器&#xff0c;界面可以实现鼠标拖动 3.记录&#xff1a; &#xff08;1&#xff09;network网络多线程 &#xff08;2&#xff09;Http &#xff08;3&#xff09;QJsonObject封装JSON对象 &#xff08;4&am…

c语言-大小写字母的转换

目录 方法一&#xff1a;库函数直接转换 1、toupper的测试代码 2、tolower的测试代码 方法二&#xff1a;通过修改ASCII码值转换 1、自己实现大写转小写 2、自己实现小写转大写 结语 前言&#xff1a; 在使用c语言写代码时&#xff0c;通常会遇到很多将大小写字母相互…

性能测试总结 —— 测试流程篇!

本文主要介绍下性能测试的基本流程&#xff0c;性能测试从实际执行层面来看&#xff0c;测试的过程一般分为这么几个阶段&#xff0c;如下图&#xff1a;       下面分别介绍下每个阶段具体需要做什么&#xff1a; 一、性能需求分析&#xff1a; 性能需求分析是整个性能…

从零学习Linux操作系统 第三十部分 部署Anisble

一、ansible实验环境的部署 主控机 更改服务器主机名 hostnamectl set-hostname westos_ansible.westos.org 主服务器需要能够实现上网 修改网卡使之能够上网 能ping通 代表可以连接外网 搭载本地软件仓库 并且挂载镜像 装载 dnf install httpd -y 让其开机启动并且…

C语言指针的初步认识--学习笔记(3)

1. 字符指针变量 在C语言中&#xff0c;字符串通常被视为字符数组&#xff0c;但它们可以有不同的表示方式。字符指针变量存储的是字符串的地址。这意味着&#xff0c;当你有一个字符串时&#xff0c;你可以通过改变字符指针的值来改变这个字符串&#xff0c;因为你实际上改变的…

C++_位图

目录 1、位图的使用 2、位图实现 3、位图与哈希表的区别 4、位图的应用 结语 前言&#xff1a; 位图采用的是哈希表的思想&#xff0c;哈希表的映射层面是在字节上&#xff0c;而位图的映射层面就是在bit位上。由于bit位所能展现的信息无非只有‘1’和‘0’&#xff0c;所…

LeetCode 热题 100 (尽量ACM模式刷) 持续更新!!!

LeetCode 热题 100 哈希hash 1 两数之和 /** 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target的那两个整数&#xff0c;并返回它们的数组下标。* 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案…

项目管理必备:进度报告撰写指南!

本文将探讨如何将进度报告写作整合到你的工作流程中&#xff0c;包括确定最适合的报告时间、编写方法和与团队一起构建报告结构的建议。最后&#xff0c;还会分享一些撰写进度报告的最佳做法&#xff0c;助你掌握这种对工作有巨大帮助的方法。 什么是进度报告&#xff1f; 它…

Python 应用程序编程接口库之pywin32使用详解

概要 在Python的世界里,有许多优秀的第三方库可以帮助开发者更轻松地处理各种任务。其中,pywin32库是一个特别引人注目的工具,它提供了对Windows API的完整访问,使得开发者能够利用Python来编写强大的Windows应用程序,从简单的脚本到复杂的桌面应用,pywin32都能胜任。 什…