找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18347|回复: 0
收起左侧

单片机指纹识别设计论文

[复制链接]
ID:187525 发表于 2017-5-6 16:01 | 显示全部楼层 |阅读模式
   


1        引言        1
1.1        指纹识别简介        1
1.1.1        指纹识别原理        1
1.1.2        指纹识别应用        2
1.1.3        指纹识别技术的发展        2
1.2        系统设计的目的        3
1.3        课题背景        3
2        整体设计方案        4
2.1        系统总体设计        4
2.1.1        系统功能描述        4
2.1.2        系统总体框架        4
2.2        系统核心部件单片机        5
2.2.1        单片机的选择        5
2.2.2        ATMEG16单片机的介绍        7
2.2.3        单片机的复位电路        9
2.2.4        ATMEG16最小系统及晶振的选择        10
2.3        液晶显示模块        11
2.3.1        HS12864-15C系列液晶的特点        11
2.3.2        HS12864-15C系列液晶的引脚功能        12
2.3.3        液晶显示HS12864-15C的指令系统        13
2.4        电源和指纹模块        13
2.4.1        ZAZ-010系列独立式指纹识别模块引脚功能        14
2.4.2        ZAZ-010系列指纹识别模块指令系统        15
2.4.3        电源模块        17
3        系统软件的设计        19
3.1        系统程序工作分析        19
3.2        设计前准备工作        19
3.3        单片机的程序设计        20
3.3.1        键盘管理程序设计流程        22
3.3.2        LCD显示模块程序设计流程        22
3.3.3        指纹通信模块的程序设计流程        23
4        实物的制作与调试        24
4.1        电路的焊接        24
4.2        电路和程序的调试        25
4.2.1        单片机的程序下载        25
4.2.2        串口调试        25
4.2.3        液晶键盘调试        26
            27
参考文献        28
附录1:串口调试子程序        29
附录2:整体源程序        31
附录3:硬件电路图        48
            49



1 引言
我们今天的工作生活中,很多的场合都需要身份的认证,而传统的基于标志的身份认证技术由于受到证件伪造以及密码破解等手段的威胁,逐渐表现得有些力不从心。怎样保护自己的重要文件资料,如何保证自己的隐私不被泄露?在传统的身份认证中,我们往往使用密码加密法,但是这种方法只是"防君子不防小人"。在高明的黑客眼里,由几个字符组成的密码脆弱得不堪一击。现在,科技的发展让我们有了新的选择——生物识别技术。将生物识别技术应用于笔记本、门锁等方面,可以对文件、财产起保护作用,并且可以进行身份识别。
生物识别技术是依据人的体貌、声音等生物特征进行身份验证的科学解决方案,现有的生物识别技术大致上包括指纹识别技术、掌纹识别技术、视网膜识别技术、虹膜识别技术、面相识别技术、声音识别技术和笔迹识别技术等。生物识别技术的优势主要有:1、减少、消除身份假冒,进行真实身份的确认;2、降低管理成本,取代了身份人工认证过程;3、方便使用者,减少或消除了使用卡、钥匙或者密码等麻烦。生物识别技术的发展主要起始于指纹研究,它亦是目前应用最为广泛的生物识别技术。
指纹识别技术的发展得益于现代电子集成制造技术和快速可靠的算法的研究。尽管指纹只是人体皮肤的小部分,但用于识别的数据量相当大,对这些数据进行比对也不是简单的相等与不相等的问题,而是使用需要进行大量运算的模糊匹配算法。现代电子集成制造技术使得我们可以制造相当小的指纹图像读取设备,同时飞速发展的个人计算机运算速度提供了在微机甚至单片机上可以进行两个指纹的比对运算的可能。另外,匹配算法可靠性也不断提高,指纹识别技术己非常实用。
1.1  指纹识别简介
1.1.1 指纹识别原理
指纹识别技术的原理和其它生物识别技术的原理相似。它是利用人体的指纹特征对个体身份进行区分和鉴定。在所有的生物识别技术中指纹识别技术是目前最为成熟,也被应用最广的生物识别技术。这主要因为指纹采用的过程对人们来讲非常简单,指纹识别的准确率高的原因。严格来讲,指纹识别的原理包括指纹采集原理、指纹特征提取原理和指纹特征匹配原理三大部分。指纹采集原理主要是根据指纹的几何特性或生理特性,通过各种传感技术把指纹表现出来,形成数字化表示的指纹图案。
由于指纹的嵴和峪的几何特征不同,主要表现为嵴是突起的,峪是凹下的,所以在接触到光线时,其反射光的强度也就不同。在接触到平面时,其在平面上形成的压力也就不同。另一方面,由于指纹的嵴和峪的生理特征不同,主要表现为:嵴和峪的温度不同,其导电性也不同,其对波长的反馈也就不同。通过这些几何的、生理的特性的不同,把人的指纹采集到计算机系统中形成指纹图像。
指纹特征分析的原理是对指纹图案的整体特征和细节特征进行提取、鉴别的原理。其分析的对象包括纹形特征和特征点的分布、类型,以及一组或多组特征点之间的平面几何关系。特征点的平面几何关系表现为某个特征点之间的距离等,或者某三个或更多特征点之间组成的多边形的几何特性。不论是特征点的单体特征,还是特征点的组合特征都是指纹特征的组成部分。把这些指纹特征用数字模板的形式表示出来,就实现了一个指纹特征分析的过程。把人的指纹采集到计算机系统中形成指纹图像。
指纹特征值匹配原理是对指纹图案的整体特征和细节特征按模式识别的原理进行比对匹配。匹配是在已注册的指纹和当前待验证的指纹之间进行的。匹配运算不是对两个指纹图像进行比较,而是对已形成数字模板的指纹特征值进行匹配。
1.1.2 指纹识别应用
指纹识别技术是最早的通过计算机实现的身份识别手段,它是应用最为广泛的生物特征识别技术。过去,它主要应用于刑侦系统。近几年来,它逐渐走向市场更为广泛的民用市场。指纹技术在现代生活和工作中的应用已越来越普遍,指纹考勤机、指纹社保、指纹银行、指纹商场、指纹投票、指纹保护电脑、等等生活中和工作中的新现象已广为人知,其应用相当广泛,指纹技术正在日益刷新着我们的现代化生活方式。指纹识别技术是目前国际公认的应用广泛、价格低廉、易用性高的生物认证技术。指纹只是人体皮肤的小部分,但是它却蕴涵了大量的信息。这些皮肤的纹路在图案、断点和交叉点上是各不相同的,在信息处理中将它们称作"特征"。医学上已经证明这些特征对于每个手指都是不同的,而且这些特征具有唯一性和永久性。因此我们就可以把一个人同他的指纹对应起来,通过比较他的指纹特征和预先保存的指纹特征,就可以验证他的真实身份。
1.1.3 指纹识别技术的发展
在经历了近 10 年缓慢的自然增长后,指纹识别技术即将迎来一个跳跃性发展的黄金时期。专家们保守估计,未来 5 年,我国将有近百亿元的市场等待着企业去开拓。指纹识别技术的巨大市场前景,将对国际、国内安防产业产生巨大的影响。较小的公司将面临新进入的传统行业大公司的无情竞争。在这些巨无霸面前,现有中小公司很难说有太大的竞争力,行业重新洗牌不可避免,合并与退出可能会成为大部分中小公司的无奈选择。最终可能形成传统行业的公司或大资本在较短时间内主导生物特征识别行业的局面。这也是每一个新兴市场的必然结果。而竞争的结果将会形成一个新兴的大产业。
国内生物识别技术的应用主要集中在企业级应用上,在 2002年总体约为2.5亿元人民币的终端市场中,超过 40%的产品都用于考勤、门禁系统之中。自2002年以来整个生物识别市场中指纹识别占据了超过 98%的份额,从需求看,中国 13 亿人口决定了中国将是未来全球最大的指纹识别认证技术市场
1.2  系统设计的目的
现代社会越来越需要高效可靠的身份识别系统。传统的个人身份鉴别手段如口令、密码、身份-甚至磁卡、IC 卡等识别卡方式。由于其与身份人的可分离性,可假冒、可伪造、可盗用、可破译,已不能完全满足现代社会经济活动和社会安全防范的需要。从消除人为不安全因素看,只有不易被他人代替、仿制、甚至其本人也无法转让的身份误码别凭证才能胜任。因此,基于人体生理特征的身份识别系统逐渐为社会所瞩目。随着识别技术的不断成熟,随着计算机技术的飞速发展,各种基于人体生理特征的身份识别系统如:指纹、手掌、声音、视网膜、瞳孔、面纹等识别技术纷纷从实验室中走出来,由小型机落户微机,走向民用。而从易用性、安全性、成熟性和造价等方面综合比较,指纹识别技术将成为未来人体生理特征身份识别技术的主流之一,指纹自动识别技术开创了个人身份鉴别的新时代,将来我们生活的很多场 合都要用到指纹,指纹使我们的生活更方便、安全。
1.3  课题背景
指纹检测可以良好的判断和定义一个人的真实生物身份,从而降低社会活动中的信任成本。从根本上改变经济和社会交往模式,提高效率。未来社会利用生物识别技术的场合将会越来越多,指纹识别技术日趋完善,指纹检测变得越发重要。本次设计指纹识别电子密码锁是基于深圳指昂科技有限公司生产的ZAZ-010指纹模块,可以根据串口通信协议与上位机实现通信,从而实现指纹的录入、存储、比对,并通过HS12864-15C液晶显示出指纹采集存储的过程和比对的结果。指纹电子密码锁安全可靠,使用方便。



2 整体设计方案
2.1  系统总体设计
2.1.1 系统功能描述
本系统是针对指纹采集、识别模块开发出的指纹识别电子密码锁系统。该系统使用指纹模块搜索手指,一旦搜索到手指,立即采集指纹图像,并将采集到的图像转化成数据的形式发送出去。它利用人体指纹各异性和不变性,为用户提供加密手段,使用时只需将手指平放在指纹采集仪的采集窗口上,即可完成采集任务,操作十分方便快捷。主要功能就是用液晶显示出指纹模块采集指纹图像各个流程及比对的结果.采集指纹图像之前,指纹模块必须要检测手指是否放在采集窗口上,所以就要有录入指纹这一项功能。简单的描述本次设计的功能即使用指纹模块检测、录入指纹,将比对的数据显示在液晶屏幕上.本系统拥有一次最多录入三个指纹的能力。
该系统的主要功能有以下几个方面:
1.录入指纹:系统预先要有录入指纹的功能,即将个人的指纹通过指纹采集器采集用户指纹的特征信息。
2.合成指纹模板并存储:通过光电转换后,将指纹特征值和对应的 ID 号存储到存储器中。上位机只要有上传指纹的命令,模块可以立即将数据传送到指定位置。
3.搜索指纹库比对指纹:当有指纹录入时,模块会响应上位机指令搜索指纹库比对指纹,同时液晶显示比对结果,继电器动作、发光二极管亮。
2.1.2 系统总体框架
系统的总体框架是指根据设计任务要求,对系统所需元件、设备参数进行必要的计算,通过认真研究、分析、比较选定设备型号,再将设备、元件通过可靠的接口电路联系起来构成一个完整的系统。在系统的整体方案确定之前,先要明确设计要求,然后对系统硬件、软件进行设计,其中包括绘制原理框图、电路图,对原理进行必要说明,综合考虑系统的性能和稳定性要求,以保证所设计的系统达到预期的要求。通过查阅大量的文献资料、综合分析考虑 。主控芯片选用Atmeg16单片机。系统总体框图如图2-1所示:

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAC85.tmp.png
图 2-1 系统总体框图

系统主要由MCU、液晶屏、指纹模块组成. 系统的工作方式主要是,当检测到有按键按下时先由MCU通过串口通信控制指纹模块对指纹进行采集、录入、存储、比对。然后,根据所得的数据对其它接口器件,如液晶屏、继电器进行响应操作。
2.2  系统核心部件单片机
2.2.1 单片机的选择
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机经过1、2、3代的发展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强I/O功能及较好的结构兼容性方向发展。其发展趋势不外乎以下几个方面:
1.多功能     
单片机中尽可能地把所需要的存储器和I/O口都集成在一块芯片上,使得单片机可以实现更多的功能。比如A/D、PWM、PCA(可编程计数器阵列)、WDT(监视定时器---看家狗)、高速I/O口及计数器的捕获/比较逻辑等。
有的单片机针对某一个应用领域,集成了相关的控制设备,以减少应用系统的芯片数量。例如,有的芯片以MEG16为核心,集成了USB控制器、SMART CARD接口、MP3解码器、CAN或者I*I*C总线控制器等,LED、LCD或VFD显示驱动器也开始集成在8位单片机中。
2.高效率和高性能
为了提高执行速度和执行效率,单片机开始使用RISC、流水线和DSP的设计技术,使单片机的性能有了明显的提高,表现为:单片机的时钟频率得到提高;同样频率的单片机运行效率也有了很大的提升;由于集成度的提高,单片机的寻址能力、片内ROM(FLASH)和RAM的容量都突破了以往的数量和限制。
由于系统资源和系统复杂程度的增加,开始使用高级语言(如C语言)来开发单片机的程序。使用高级语言可以降低开发 难度,缩短开发周期,增强软件的可读性和可移植性,便于改进和扩充功能。
AVR 内核单片机具有丰富的指令集和32个通用工作寄存器。所有的寄存器都直接与算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。ATmega16L 有如下特点:
.16K字节的系统内可编程Flash(具有同时读写的能力,即RWW);
.512字节EEPROM,1K 字节SRAM;
.32 个通用I/O 口线;
.32 个通用工作寄存器;               
.用于边界扫描的JTAG 接口,支持片内调试与编程;
.三个具有比较模式的灵活的定时器/ 计数器(T/C);
.片内/外中断,片内经过标定的RC 振荡器;
.可编程串行USART,有起始条件检测器的通用串行接口;
.8路10位具有可选差分输入级可编程增益(TQFP 封装) 的ADC;
.具有片内振荡器的可编程看门狗定时器;
.一个SPI 串行端口;
.四通道PWM,两路8位,两路16位;
.六个可以通过软件进行选择的省电模式:空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及扩展的Standby 模式;
.速度等级:0 - 8 MHz;
.工作电压:2.7 - 5.5V;
.工作于空闲模式时CPU 停止工作,而USART、两线接口、A/D 转换器、SRAM、T/C、SPI 端口以及中断系统继续工作;
.掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;
.在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态;
.ADC 噪声抑制模式时终止CPU 和除了异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声;
.Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;
扩展Standby 模式下则允许振荡器和异步定时器继续工作。
本芯片是以Atmel 高密度非易失性存储器技术生产的。片内ISP Flash 允许程序存储器通过ISP 串行接口,或者通用编程器进行编程,也可以通过运行于AVR 内核之中的引导程序进行编程。引导程序可以使用任意接口将应用程序下载到应用Flash存储区(Application Flash Memory)。在更新应用Flash存储区时引导Flash区(Boot Flash Memory)的程序继续运行,实现了RWW 操作。
通过将8 位RISC CPU 与系统内可编程的Flash 集成在一个芯片内,ATmega16 成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而低成本的解决方案。
下面是基于八位AVR单片机芯片ATMEGA16的主控系统方案:
2.2.2 ATMEG16单片机的介绍
ATMEG 16的管脚说明如图2-2所示:




file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAC86.tmp.png
图2-2 DIP封装 ATMEG 16单片机引脚结构图

1 VCC为数字电路的电源,GND为地。
2. 端口A(PA7-PA0)作为A/D转换器的模拟输入端,是8位双向I/O口,具有编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口A处于高阻状态。
3. 端口B(PB7-PB0)为8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统始终还未起振,端口B处于高阻状态。端口B也可以用做其他不同的特殊功能。
4. 端口C(PC7-PC0)为8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统始终还未起振,端口C处于高阻状态。如果JTAG接口使能,即使复位出现引脚PC5(TD1)、PC3(TMS)与PC2(TCK)的上拉电阻被激活。端口C也可以用做其他不同的特殊功能。
5. 端口D(PD7-PD0)为8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统始终还未起振,端口D处于高阻状态。端口D也可以用做其他不同的特殊功能。
6. RESET为复位输入引脚,持续时间超过最小门限时间的低电平将引起复位。
7 XTAL1为晶振反相放大器的输入端和内部时钟操作电路的输入端。
8 XTAL2为晶振反相放大器的输出端。
9.  AVCC是端口A与A/D转换器的电源。不使用ADC时,该引脚应该直接与Vcc连接。使用ADC时应通过一个低通滤波器与Vcc连接。
10.AREF是A/D的模拟基准输入引脚。
2.2.3 单片机的复位电路
复位是单片机的初始化操作,其作用是使CPU中的各个部件都处于一个确定的初始状态,并从这个状态开始工作。
ATmega16有5个复位源:
1. JTAG AVR复位:复位寄存器为1时MCU复位。
2. 上电复位:电源电压低于上电复位门限 VPOT时,MCU复位。
3. 看门狗复位:看门狗使能并且看门狗定时器溢出时复位发生。
4. 外部复位:引脚 RESET上的低电平持续时间大于最小脉冲宽度时MCU复位。
5. 掉电检测复位:掉电检测功能使能,且电源电压低于掉电检测电压时复位。
ATmega16单片机5个复位源中,最常用的是外部复位和看门狗复位电路。外部复位电路由外加于RESET 引脚的低电平产生。当复位低电平持续时间大于最小脉冲宽度时即触发复位过程,即使此时并没有时钟信号在运行。当外加信号达到复位门限电压VTOUT延时周期开始。延时结束后MCU即启动。外部复位时序图如图2-3所示,外部复位原理图如图2-4所示:

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAC96.tmp.jpg

2-3 外部电路复位时序图
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAC97.tmp.jpg
2-4 外部复位原理图

2.2.4 ATMEG16最小系统及晶振的选择
ATmega16芯片有如下几种通过Flash熔丝位进行选择的时钟源。时钟输入到AVR时钟发生器,再分配到相应的模块。
表2—1 熔丝配置模式
器件时钟选项
CKSEL3..0
外部晶体/陶瓷振荡器
1111 – 1010
外部低频晶振
1001
外部RC振荡器
1000 – 0101
标定的内部RC振荡器
0100 – 0001
外部时钟
0000
          注:此选项不适用于晶体,只能用于陶瓷谐振器。
晶体振荡电路:XTAL1XTAL2分别为用作片内振荡器的反向放大器的输入和输出,如图2-5所示,这个振荡器可以使用石英晶体,也可以使用陶瓷谐振器。熔丝位CKOPT用来选择这两种放大器模式的其中之一。当CKOPT被编程时振荡器在输出引脚产生满幅度的振荡。这种模式适合于噪声环境,以及需要通过XTAL2驱动第二个时钟缓冲器的情况。而且这种模式的频率范围比较宽。当保持CKOPT为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。对于谐振器CKOPT未编程时的最大频率为8 MHz,CKOPT编程时为16 MHzC1C2的数值要一样,不管使用的是晶体还是谐振器。最佳的数值与使用的晶体或谐振器有关,还与杂散电容和环境的电磁噪声有关为了保证系统稳定性和串口传输质量所以选用外部晶振,晶振选用7.3728M。

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACB7.tmp.png
             2-5 ATMEG16最小系统

2.3  液晶显示模块
显示模块采用HS12864-15C系列中文图形系列液晶模块。由控制器ST7920控制与驱动。
2.3.1 HS12864-15C系列液晶的特点
1. HS12864-15系列硬件特性如下:
.提供8位,4位并行接口及传行接口可选
.自动电源启动复位功能
.内部自建振荡源
.64*16位字符显示RAM(DDRAM最多16字符*4行)
.2M位中文字型ROM(CGROM),总共8192个中文字型
2. HS12864-15系列软件特性如下:
.文字与图形混合显示功能
.画面清除功能
.光标归位功能
.显示开/关功能
.反白显示功能
.垂直画面旋转功能
.休眠模式
2.3.2 HS12864-15C系列液晶的引脚功能
引脚PSB为芯片的传输方式控制端;引脚 E 为读写使能信号,它是在下降沿时数据被锁存入HS12864液晶的;在E高电平期间,数据被读出;R/W 为读写选择信号,当它为一时为读选通,为零时为写选通;DB0-DB7为数据总线RST为复位信号。复位信号有效时,关闭液晶显示,使显示起始行为0,RST可跟MCU连,由MCU控制;也可直接接VDD,使之不起作用。引脚功能如表2-1所示:
2-1 HS12864-15C的引脚功能
引脚符号
状态
引脚名称
功能
PSB
输入
数据传输方式
PSB=1为并行传输;PSB=0为串行传输
E
输入
读写使能信号
[size=10.5000pt]在E下降沿,数据被锁存(写)入HS12864-15C;在E高电平期间,数据被读出
R/W
输入
读写选择信号
R/W=1为读选通,R/W=0为写选通
RS
输入
数据、指令选择信号
RS=1为数据操作
RS=0为写指令或读状态
DB0-DB7
三态
数据总线


RST
输入
复位信号
复位信号有效时,关闭液晶显示,使显示起始行为0[size=10.5000pt],RST可跟MCU相连,由M[size=10.5000pt]CU控制;也可直接接VDD,使之不起作用。





2.3.3 液晶显示HS12864-15C的指令系统
1.清除显示
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
0
0
0
1

2.显示开/关指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
1
D
C
B
控制整体显示开关,游标开关,游标位置显示反白开关;
D=1,整体显示开;D=0,整体显示关;
C=1,游标显示开;C=0,游标显示关;
B=1,游标位置显示反白开;B=0,游标位置显示反白关;

3.读取忙状态
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
1
BF
A6
A5
A4
A3
A2
A1
A0
读取忙状态以确定内部动作是否完成,同时可以读出地址计数器AC的值

4.写数据
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
0
写数据
读、写数据指令每执行完一次读、写操作,列地址就自动增一,必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。

5.读数据
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
1
                读 显 示 数 据
读、写数据指令每执行完一次读、写操作,列地址就自动增一,必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。

2.4  电源和指纹模块
指纹模块采用深圳市指昂科技有限公司生产的ZAZ-010系列独立式指纹识别模块,以高速DSP处理器为核心。主要技术指标如下
供电电压:DC 3.6-6.0V
供电电流:工作电流:100mA(典型值)
峰值电流:150mA
指纹图像录入时间:<0.5 秒
窗口面积 14 *18 mm
匹配方式:
比对方式(1:1)
搜索方式(1:N)
特征文件: 256 字节
模板文件: 512 字节
存储容量: 100枚
安全等级: 五级(从低到高:1、2、3、4、5)
认假率(FAR):<0.001%
拒真率(FRR):<0.1%
搜索时间: 1.0 秒 (1:1000 时,均值)
上位机接口: UART(TTL 逻辑电平)
通讯波特率(UART): (9600*N)bps
其中N=1~12 (默认值N=6,即57600bps)
2.4.1 ZAZ-010系列独立式指纹识别模块引脚功能
模块中引脚1与电源相连,引脚2接单片机的RXD端,引脚3接单片机的TXD端,引脚4悬空,引脚5接地。表2-2如下:
表2-2指纹识别模块引脚功能
引脚号
名称
类型
功能描述
1
Vin
in
电源正输入端
2
TD
out
串行数据输出。TTL 逻辑电平
3
RD
in
串行数据输入。TTL 逻辑电平
4
NC
未定义,悬空。
5
GND
信号地。内部与电源地连接



2.4.2 ZAZ-010系列指纹识别模块指令系统
模块通过串行通讯接口,可直接与采用3.3v或者5v电源的单片机进行通讯。模块数据发送端接上位机接收端,模块数据接收脚接上位机数据发送端。
录入指纹图像指令:
指令包格式:

2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包头
模块地址
包标识
包长度
指令码
校验和
0xEF01
Xxxx
01H
03H
01H
05H
应答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包头
模块地址
包标识
包长度
确认码
校验和
0xEF01
Xxxx
07H
03H
xxH
SUM
注:确认码=00H 表示录入成功;
确认码=01H 表示收包有错;
确认码=02H 表示传感器上无手指;
确认码=03H 表示录入不成功;

图像生成特征 Img2Tz指令:
指令包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
1 byte
2 bytes
包头
模块地址
包标识
包长度
指令码
缓冲区号
校验和
0xEF01
Xxxx
01H
04H
02H
BufferID
SUM
应答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包头
模块地址
包标识
包长度
确认码
校验和
0xEF01
Xxxx
07H
03H
xxH
SUM
注:确认码=00H 表示生成特征成功;
确认码=01H 表示收包有错;
确认码=06H 表示指纹图像太乱而生不成特征;
确认码=07H 表示指纹图像正常,但特征点太少而生不成特征;
确认码=15H 表示图像缓冲区内没有有效原始图而生不成图像;

特征合成模板RegMode1指令:
功能说明:将CharBuffer1与CharBuffer2中的特征文件合成特征模板。
指令包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包头
模块地址
包标识
包长度
指令码
校验和
0xEF01
Xxxx
01H
03H
05H
09H
应答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包头
模块地址
包标识
包长度
确认码
校验和
0xEF01
Xxxx
07H
03H
xxH
SUM
注:确认码=00H 表示合并成功;
确认码=01H 表示收包有错;
确认码=0aH 表示合并失败(两枚指纹不属于同一手指);

存储模板 Store指令:
指令包格式:
2bytes
4bytes
1byte
2 bytes
1 byte
1 byte
2 bytes
2bytes
包头
模块地址
包标识
包长度
指令码
缓冲区号
位置号
校验和
0xEF01
Xxxx
01H
06H
06H
BufferID
PageID
SUM
应答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包头
模块地址
包标识
包长度
确认码
校验和
0xEF01
Xxxx
07H
03H
xxH
SUM
注:确认码=00H 表示储存成功;
确认码=01H 表示收包有错;



搜索指纹Search指令:
指令包格式:
2bytes
4bytes
1byte
2bytes
1byte
1byte
2bytes
2bytes
2bytes
包头
模块地址
包标识
包长度
指令码
缓冲区号
参数
参数
校验和
0xEF01
Xxxx
01H
08H
04H
ID
StarPage
PageNum
SUM
应答包格式:
2bytes
4bytes
1byte
2bytes
1byte
2bytes
2bytes
2bytes
包头
模块地址
包标识
包长度
确认码
页码
得分
校验和
0xEF01
Xxxx
07H
07H
xxH




SUM
注:确认码=00H 表示搜索到;
确认码=09H 表示没有搜索;
2.4.3 电源模块
电源模块可以直接提供正5V的直流电压,但是由于在一些工业环境中并不提供直流电源,而都是交流电源,为确保其实用性,在电源这一部分,提供了整流稳压电路,可以把交流电压变成5V的电压,为整个电路板提供电源。
从图2-6可以看出,当开关按下时,电路接通,先通过一个整流电路,使交流电压变成直流电压。为了保证其输出的电压是5V,在后面接一个稳压电路,由一个7805稳压器和一个发光二极管组成,发光二极管作为电源导通的指示灯。当电源导通时二极管发光。其中电容C1起滤波作用,电容C2是抑制高平信号。电容C3, C4直接接地,起到抗干扰的作用,能使电压稳定在5V。有了电源模块避免了因没有直流电源而无法使用的问题,使这个仪表能够在更多的环境中使用。电源模块电路图如图2-6所示:









file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACD8.tmp.png





























2-6 电源模块电路图
3 系统软件的设计
3.1  系统程序工作分析
在本文的电路板中,单片机是作为控制器嵌入到系统中。应用程序的开发主要分为两大部分,即对ZAZ-010指纹识别模块的的应用程序开发以及对HS12864液晶、按键程序的开发。因此,要实现其应用,需要对其进行联合调试。电路软件应用开发根据所设计的硬件。程序开发的方式将主要建立一系列的C语言函数子程序供主程序的随时调用。即ZAZ-010指纹识别模块或液晶电路分别编制C语言函数子程序。因此,需要有专门的开发工具。本设计中,采用AVRStudio4.0单片机软件开发环境对单片机进行编程,由于该编译器支持模块化程序设计,因此可以先将源程序划分为几个模块分别编写,然后再由编译器生成一个最终文件. 该开发环境可以对程序进行软件仿真调试,因此可以方便地进行程序的编写和调试。调试通过的代码文件通过开发板下载到单片机。单片机在上电后,主程序应该完成相应的初始化工作。依据电路的功能要求,主程序必须对液晶初始化、同时对按键进行检测,如果有对应的按键按下。执行相应的操作,单片机通过串行接口对指纹模块进行读写。
3.2  设计前准备工作
由于使用串口和模块通讯,所以必须先约定好单片机和模块的的串口工作速度和数据包格式。
UART数据格式定位为:8位数据位、1位停止位、无奇偶校验位,数据传输速率为57600bps。
通讯数据包格式定义为:
单片机发送串行数据包格式如图3-1 MCU发送数据包格式
D7
D6
D5
D4
D3
D2
D1
D0
发送数据共11-14个字节,前6个字节是模块的包头和模块地址为固定值,后5-8个字节是传输的模块的命令。同时根据外部晶振和系统默认的传输速率算出控制串口的各寄存器的初始值。参考meg16资料后编写了以下一段串口初始化。
各寄存器设置的程序.
如下面的一段程序既是对个寄存器的初始值的设置
void UART_Init(void)
{
UCSRB=0x00;//disable while setting baud rate
UCSRA=0x00;//Bit1为1则倍速发送
UCSRC=0x06;
UBRRL=0x07;//波特率:57600Bps
UBRRH=0x00;//误差率:0.000%
UCSRB=0x18;
}
:选用外部7.3728M晶振.

3.3  单片机的程序设计
根据上节分析,制定如下图的程序流程图。主程序主要由液晶显示、通讯子、按键程序组成。主程序的工作流程描述如下:首先初始化各种硬件功能模块进行初始化。包括开机液晶显示、键盘扫描、指纹模块建立通信。
主程序设计流程如图3-1所示:




















file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACD9.tmp.png
程序的巡检过程: 首先对各模块进行初始化,检测在有无按键按下,如果按下判断是那一个按键,并作出判断是否调用相应子程序;当按键1按下后,调用通信模块子程序,录入指纹并将其存入模块缓冲区,同理当按键2按下后,效果相同。
依次当按键3按下时,将指纹模块两缓冲区中的指纹特征文件合成特征模板并存储与指纹模板库中,当4按键按下后搜索指纹并比对.当指纹模块中有指纹存储时直接按4键同样也可进行比对。
程序关键的就是对指纹模块的通信控制, 考虑到处理过程太过冗长,限于篇幅只能将其省略,如需查看,可以看附录1。其它命令发送子函数因大部分的命令大体格式基本相同。
3.3.1  键盘管理程序设计流程
键盘模块的工作流程图如图3-2所示:



file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACDA.tmp.png
                        3-2 键盘模块流程图
3.3.2  LCD显示模块程序设计流程
显示模块主要完成数据的显示功能。首先当模块接受指令前,单片机必须确认模块内部处于非忙碌状态,然后根据接受到指令显示相关的内容在屏幕上。

3.3.3  指纹通信模块的程序设计流程
串口通信数据发送、接收流程图如图3-3:


file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACEA.tmp.png
3-3 串口通信数据发送、接收流程图




4 实物的制作与调试
4.1  电路的焊接        
1.焊前准备
首先要熟悉所焊印制电路板的装配图,并按图纸配料,检查元器件型号、规格及数量是否符合图纸要求,并做好装配前元器件引线成型等准备工作。
2.焊接顺序
元器件装焊顺序依次为:电阻器、电容器、二极管、三极管、集成电路、大功率管,其它元器件为先小后大。
3.对元器件焊接要求
(1)电阻器焊接
按图将电阻器准确装人规定位置。要求标记向上,字向一致。装完同一种规格后再装另一种规格,尽量使电阻器的高低一致。焊完后将露在印制电路板表面多余引脚齐根剪去。
(2)电容器焊接
将电容器按图装人规定位置,并注意有极性电容器其 “ + ” 与 “ - ” 极不能接错,电容器上的标记方向要易看可见。先装玻璃釉电容器、有机介质电容器、瓷介质电容器,最后装电解电容器。
(3)二极管的焊接
二极管焊接要注意以下几点:第一,注意阳极阴极的极性,不能装错;第二,型号标记要易看可见;第三,焊接立式二极管时,对最短引线焊接时间不能超过 2S 。
(4)三极管焊接
注意 e 、 b 、 c 三引线位置插接正确;焊接时间尽可能短,焊接时用镊子夹住引线脚,以利散热。焊接大功率三极管时,若需加装散热片,应将接触面平整、打磨光滑后再紧固,若要求加垫绝缘薄膜时,切勿忘记加薄膜管脚与电路板上需连接时,要用塑料导线。
(5)集成电路
焊接首先按图纸要求,检查型号、引脚位置是否符合要求。焊接时先焊边沿的二只引脚,以使其定位,然后再从左到右自上而下逐个焊接。对于电容器、二极管、三极管露在印制电路板面上多余引脚均需齐根剪去。

4.2  电路和程序的调试
4.2.1 单片机的程序下载
程序存储器的更新以页的方式进行。在用临时页缓冲器存储的数据对一页存储器进行编程时,首先要将这一页擦除。SPM指令以一次一个字的方式将数据写入临时页缓冲器。临时页缓冲器的写入可以在页擦除命令之前完成,也可以在页擦除和页写操作之间完成。通过电脑上的下载软件将*.HEX文件传输到(如图4-1所示)USB下载线板上的ATmega8芯片里,程序代码在这里经过处理后从固定的I/O管脚中输出烧写到单片机的Flash存储器中。此外单片机一般采用5V以下的电源供电,USB接口也采用5V电源,所以,该下载线还可以通过电脑向单片机提供工作电源。该下载线采用先进的USB2.0接口技术解决了笔记本不带并口的遗憾,还有它小巧精致,携带方便,下载程序速度快等优点得到了众多编程爱好者的青睐而被广泛的使用着

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACEB.tmp.png
                    4-1 USB下载线实物图

4.2.2  串口调试
使用串口调试助手进行测试
串口调试程序见附录1:
测试结果如图4-2所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACEC.tmp.jpg
图4-2 串口通信测试结果图

4.2.3  液晶键盘调试
液晶键盘测试程序见附录2:
液晶键盘测试程序结果如图 4-3所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACED.tmp.png
             4-3 液晶键盘测试结果


   
根据设计要求,本设计已经基本完成题目要求但还存在不足之处。由于单片机flash容量有限,在指纹存储数目上较少,只能录入三个指纹 ,并进行比对。
通过方案论证、资料查询及电路设计和反复调试,不断的解决电路调试过程中的问题,最终在规定的时间内完成了设计任务。本设计由于水平有限,电路及程序设计还有需要改进的地方,在今后的学习和研究中,将继续改进完善。
另外在调试过程中,以保证作品实现功能准确为前提,尽量做到电路简单、美观、效果好、成本低,以增强其实用价值。
本设计最终可以实现三个指纹录入、比对和模拟开锁的过程,但存储指纹数目有待进一步的研究开发。





















参考文献
[1] 杨若冰,杜燕.指纹识别技术与产业分析,2006年
[2]张成,周媛媛等.指纹采集技术及其产品发展趋势.电子技术应用,2004年
[3] 柴晓光,岑宝炽.民用指纹识别技术,北京:人民邮电出版社,2004
[4] 丁化成,耿德根等.AVR单片机应用设计,北京:北京航空航天大学出版社,2002
[5] 张毅刚.单片机原理与应用,北京:高等教育出版社,2006
[6] 张天凡.51单片机C语言开发详解,北京:电子工业出版社,2008
[7] 温正,何嘉扬等.AVR单片机开发从入门到精通,中国电力出版,2009
[8] 李泓.AVR单片机入门与实践,北京航空航天大学,2008
[9] 佟长福. AVR单片机GCC程序设计, 北京航空航天大学出版社, 2006
[10] 张军,宋涛.AVR单片机C语言程序设计实例精粹, 电子工业出版社, 2009年01月
[11] 严天峰.单片机应用系统设计与仿真调试,北京航天航空大学出版社,2005
[12] 周立民.单片机应用系统设计.北京:北京航空航天大学出版社,1990.
[13] 张维振.无线电设备装接调试与检测维修实用手册[M],北京:银声音像出版社,2004
[14] 李贵山,杨建平等.微型计算机测控技术。北京:机械工业出版社,2002.
[15] 张锡富.传感器.北京:机械工业出版社,2004.
[16] 曹承志.微型计算机控制技术.北京:机械工业出版社,2001.
[17] 黄贤武.传感器实用电路设计.成都:电子科技大学出版社,1998.
[18] 李贵山,周征等.检测与控制技术.西安:西安电子科技大学出版社,2006.








附录1:串口调试子程序
串口调试子程序
#include<avr/io.h>
#include<util/delay.h>
//通信协议定义
unsigned char FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //协议包头
unsigned char FP_Get_Img[6] = {0x01,0x00,0x03,0x01,0x0,0x05};    //获得指纹图像
unsigned char a[6] ={};
unsigned char b[6] ={};
//初始化 UART 子程序
void UART_Init(void)
{
    UCSRB  =  0x00;     //disable while setting baud rate
    UCSRA  =  0x00;     //Bit11则倍速发送
    UCSRC  =  0x06;  
    UBRRL  =  0x07;     //波特率:57600 Bps
    UBRRH  =  0x00;     //误差率:0.000%
    UCSRB  =  0x18;
}

//发送一个位
void UART_Send_Byte(unsigned char ucData)
{
  while(!(UCSRA&(1<<UDRE))); //等待缓冲区为空
  UDR = ucData;
}
unsigned char UART_Receive_Byte(void)
{
  while(!(UCSRA & ( 1<<RXC )) );

  return UDR;
}
//_获得指纹图像命令
void Cmd_Get_Img(void)
{
    unsigned char i;
    for(i=0;i<6;i++)
    UART_Send_Byte(FP_Pack_Head);
    for(i=0;i<6;i++)
    UART_Send_Byte(FP_Get_Img);
    for(i=0;i<6;i++) //发送包头
    a =UART_Receive_Byte();
    for(i=0;i<6;i++) //发送命令 0x1d
    b = UART_Receive_Byte();
    for(i=0;i<6;i++)
    UART_Send_Byte(a);
    for(i=0;i<6;i++)
    UART_Send_Byte(b);
}
int main()
{
UART_Init();
Cmd_Get_Img();
}
附录2:整体源程序
整体源程序
#include<avr/io.h>
#include<util/delay.h>
//#include<avr/pgmspace.h>                 
#define uchar unsigned char
#define uint unsigned int
#define key1 0x01
#define key2 0x02
#define key3 0x04
#define key4 0x08
static uchar k=0;
uchar name00[]={"                "};
uchar name01[]={"    欢迎使用    "};
uchar name02[]={"单片机指纹密码锁"};
uchar name03[]={"                "};
uchar name04[]={"  指纹采集开始  "};
uchar name05[]={"  指纹对比开始  "};
uchar name06[]={"  指纹存储开始  "};
uchar name07[]={"    一次采集    "};
uchar name08[]={"    二次采集    "};
uchar name09[]={"    录入成功    "};
uchar name10[]={"    录入失败    "};
uchar name11[]={"    收包有错    "};
uchar name12[]={"传感器上无手指  "};
uchar name13[]={"  生成特征成功  "};
uchar name14[]={"图想乱生不成特征"};
uchar name15[]={"图象正常特征点少"};
uchar name16[]={"指纹模板合并成功"};
uchar name17[]={"指纹模板合并失败"};
uchar name18[]={"  非同一手指    "};
uchar name19[]={"    存储成功    "};
uchar name20[]={"  写指纹库出错  "};
uchar name21[]={"    指纹匹配    "};
uchar name22[]={"  指纹不匹配    "};
uchar name23[]={"    密码正确    "};
uchar name24[]={"    密码不正确    "};
uchar FP_1[6]={};
uchar FP_2[6]={};
uchar FP_Pack_Head[6]={0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //协议包头
uchar FP_Get_Img[6]={0x01,0x00,0x03,0x01,0x0,0x05};    //获得指纹图像
uchar FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x0,0x13,0x0,0x21}; //搜索0-9号指纹
uchar FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08}; //将图像放入到BUFFER1
uchar FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09}; //将图像放入到BUFFER2
uchar FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x09}; //BUFFER1BUFFER2合成特征模版
volatile uchar  FP_Save_Finger1[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//BUFFER1中的特征码存放到指定的位置
volatile uchar  FP_Save_Finger2[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0C,0x00,0x1A};//BUFFER1中的特征码存放到指定的位置
volatile uchar  FP_Save_Finger3[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0D,0x00,0x1B};//BUFFER1中的特征码存放到指定的位置
uchar yb=0x80;
//初始化 UART 子程序
void UART_Init(void)
{
    UCSRB  =  0x00;     //disable while setting baud rate
    UCSRA  =  0x00;     //Bit11则倍速发送
    UCSRC  =  0x06;     //传送一桢数据位为8
    UBRRL  =  0x07;     //波特率:57600 Bps
    UBRRH  =  0x00;     //误差率:0.000%
    UCSRB  =  0x18;     
}
//发送八位数据
void UART_Send_Byte( uchar ucData)
{
  while(!(UCSRA&(1<<UDRE))); //等待缓冲区为空
  UDR = ucData;
}
//接收八位数据
uchar  UART_Receive_Byte(void)
{
  while(!(UCSRA&(1<<RXC)));//等待缓冲区为空
return UDR;
}
//_获得指纹图像命令
void Cmd_Get_Img(void)
{
    uchar i,j;
    for(i=0;i<6;i++) //发送包头与模块地址
    UART_Send_Byte(FP_Pack_Head);
    for(i=0;i<6;i++) //发送命令 0x1d
    UART_Send_Byte(FP_Get_Img);
    for(i=0;i<6;i++)
    FP_1=UART_Receive_Byte();
        for(i=0;i<6;i++)
    FP_2=UART_Receive_Byte();
    j=FP_2[3];
   if (j==0x00)
  {_delay_ms(100000);
   reset ();
   display6();}
   if (j==0x01)
   {reset();
    wr_com(yb);
   outChinese(0x90,8,name11);}
   if (j==0x02)
   {_delay_ms(100000);
    reset();
    display7();}
        if (j==0x03)
   { reset();
    wr_com(yb);
   outChinese(0x90,8,name10);}
}
//讲图像转换成特征码存放在Buffer1
void Cmd_Img_To_Buffer1(void)
{
                uchar i,j;
               for(i=0;i<6;i++)    //发送包头与模块地址
                 {
                   UART_Send_Byte(FP_Pack_Head);   
                        }
                        for(i=0;i<7;i++)   //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
             {
                         UART_Send_Byte(FP_Img_To_Buffer1);
                        }
            for(i=0;i<6;i++)
            {
                        FP_1=UART_Receive_Byte();}
                        for(i=0;i<6;i++)
          {
                    FP_2=UART_Receive_Byte();}
           j=FP_2[3];
         if (j==0x00)
    {_delay_ms(100000);
      reset ();
      display8();}
           if (j==0x06)
          {_delay_ms(100000);
      reset ();
      display9();}
          if (j==0x07)
          {_delay_ms(100000);
      reset ();
      display10();}
}
//将图像转换成特征码存放在Buffer2
void Cmd_Img_To_Buffer2(void)
{
           uchar i,j;
           for(i=0;i<6;i++)    //发送包头
                 {
                   UART_Send_Byte(FP_Pack_Head);   
                        }
                      for(i=0;i<7;i++)   //发送命令 将图像转换成 特征码 存放在 CHAR_buffer2
             {
                         UART_Send_Byte(FP_Img_To_Buffer2);
                        }
            for(i=0;i<6;i++)
           {
                        FP_1=UART_Receive_Byte();}
                        for(i=0;i<6;i++)
          {
                    FP_2=UART_Receive_Byte();}  
                  j=FP_2[3];
         if (j==0x00)
    {_delay_ms(100000);
      reset ();
      display8();}
           if (j==0x06)
          {_delay_ms(100000);
      reset ();
      display9();}
          if (j==0x07)
          {_delay_ms(100000);
      reset ();
      display10();}
}
//BUFFER1 BUFFER2 中的特征码合并成指纹模版
void Cmd_Reg_Model(void)
{
    uchar i,j;
    for(i=0;i<6;i++) //发送包头与模块地址
    {
      UART_Send_Byte(FP_Pack_Head);   
    }
    for(i=0;i<6;i++) //命令合并指纹模版
    {
      UART_Send_Byte(FP_Reg_Model);   
    }
    for(i=0;i<6;i++)
           {
                        FP_1=UART_Receive_Byte();}
        for(i=0;i<6;i++)
          {
                    FP_2=UART_Receive_Byte(); }
                  j=FP_2[3];
if (j==0x00)
{_delay_ms(400000);
      reset ();
      display11();}
if (j==0x0a)
{_delay_ms(400000);
      reset ();
      display12();
           while(1);}
}
//将并成后的指纹模版存储到指纹模块flash模板库中
void  Store_Char_Model(void)
{   uchar i,j;
    for(i=0;i<6;i++) //发送包头与模块地址
    {
      UART_Send_Byte(FP_Pack_Head);   
    }
   if(k==0)
  { for(i=0;i<9;i++) //命令存储指纹模版
    {
      UART_Send_Byte( FP_Save_Finger1  );
       }
    }
        if(k==1)
   { for(i=0;i<9;i++) //命令存储指纹模版
    {
      UART_Send_Byte( FP_Save_Finger2  );
        }
    }
        if(k==2)
   { for(i=0;i<9;i++) //命令存储指纹模版
    {
      UART_Send_Byte( FP_Save_Finger3  );
       }
        }
    for(i=0;i<6;i++)
          {
                        FP_1=UART_Receive_Byte();}
        for(i=0;i<6;i++)
          {
                    FP_2=UART_Receive_Byte(); }
                  j=FP_2[3];
if(j==0x00)
{_delay_ms(400000);
      reset ();
      display13();}
if(j==0x18)
{_delay_ms(300000);
      reset ();
      display14();}
}
//搜索与BUFFER1中特征码相符合的指纹模版
void  search_Char_Mode(void)   
{   uchar i,j;
    for(i=0;i<6;i++) //发送包头与模块地址
    {
      UART_Send_Byte(FP_Pack_Head);   
    }
    for(i=0;i<11;i++) //命令搜索指纹模版
    {
      UART_Send_Byte(FP_Search_0_9);
    }
for(i=0;i<6;i++)
           {
                        FP_1=UART_Receive_Byte();}
        for(i=0;i<10;i++)
          {
                    FP_2=UART_Receive_Byte(); }
                  j=FP_2[3];
if(j==0x00)
{_delay_ms(100000);
      reset ();
      display15();}
if(j==0x09)
{_delay_ms(100000);
      reset ();
      display16();}
void keyboard( void)
{  unsigned char Keyvalue;//键盘值
//端口初始化
DDRC=~_BV(PC0)& ~_BV(PC1)& ~_BV(PC2)& ~_BV(PC3);
while(1)
{  Keyvalue=(PINC&0x0F);
if (Keyvalue!=0x0f)
{//有键按下
_delay_ms(20);
Keyvalue=(PINC&0x0F);
if (Keyvalue==0X0F)
  break;//如果延时去抖后,没有检测到键按下,退出本次循环
//如果有按键
if(! (Keyvalue& key1))
{reset ();
display2();
UART_Init();
Cmd_Get_Img();
Cmd_Img_To_Buffer1();
}//按键1的处理部分
if(! (Keyvalue& key2))
{ reset ();
  display3();
UART_Init();
Cmd_Get_Img();
Cmd_Img_To_Buffer2();
}//按键2的处理部分
if(! (Keyvalue& key3))
{ reset ();
display4();
UART_Init();
Cmd_Reg_Model();
Store_Char_Model();
k++;         }//按键3的处理部分
if(! (Keyvalue& key4))
{ reset ();
display5();
UART_Init();
Cmd_Get_Img();
Cmd_Img_To_Buffer1();
search_Char_Mode();
          }//按键4的处理部分
       }
_delay_ms(20);
     }
}
void check_busy (void)                  //读取忙碌状态
{
  DDRA=0;
  PORTA=0xff;
  PORTB&=0xfb;                          //RS=0
  PORTB|=0x02;                          //RW=1;
  PORTB|=0x01;PORTB|=0x01;              //E=1;
  while((PINA&0x80)==0x80);
  PORTB&=0xfe;
                                        //E =0;
}
void wr_com(unsigned char value)        //写指令,写指令时必须为RS=0;RW=0;
{check_busy();
PORTB&=0xfe;                           //E=0;
PORTB&=0xfb;                           //RS=0
PORTB&=0xfd;                           //RW=0;
DDRA=0xff;
PORTA=value;
PORTB|=0x01;                           //E=1;
_delay_us(20);                          //如果没有延时就必须要加查忙指令
PORTB&=0xfe;
DDRA=0x00;                            //E=0;
}
void wr_data(unsigned char sj)          //写数据,写数据时必须为 RS=1;RW=0;
{check_busy();
PORTB&=0xfe;                           //E=0;
PORTB|=0x04;                           //RS=1;
PORTB&=0xfd;                           //RW=0;
DDRA=0xff;
PORTA=sj;
PORTB|=0x01;                           //E=1;
_delay_us(20);                          //如果没有延时就必须要加查忙指令
PORTB&=0xfe;
DDRA=0x00;                            ////E=0;
}
void reset (void)
{
wr_com(0x01);//清屏
wr_com(0x08);//关显示
wr_com(0x03);//归位
wr_com(0x30);//功能设置
wr_com(0x0f);//开显示
wr_com(0x01);//清屏
}
//******************************************************************/
//outChinese 为函数名
//place 为显示地址的首地址
//unit  字符长度
//charcode[]  要显示数据的内容
void outChinese(unsigned char place,unsigned char unit,unsigned char charcode[] )
{
unsigned char i;
wr_com(place);
for(i=0;i<unit*2;i++)//一个汉字为两个字符
wr_data(charcode);
}
void display1(void)
{wr_com(yb);
//ydgb();
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name01);//第二行:90-97H
outChinese(0x88,8,name02);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display2(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name04);//第二行:90-97H
outChinese(0x88,8,name07);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display3(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name04);//第二行:90-97H
outChinese(0x88,8,name08);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display4(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name01);//第二行:90-97H
outChinese(0x88,8,name06);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display5(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name01);//第二行:90-97H
outChinese(0x88,8,name05);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display6(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name09);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display7(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name12);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display8(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name13);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display9(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name14);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display10(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name15);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display11(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name16);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display12(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name17);//第二行:90-97H
outChinese(0x88,8,name18);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display13(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name19);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display14(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name20);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display15(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name21);//第二行:90-97H
outChinese(0x88,8,name23);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display16(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name22);//第二行:90-97H
outChinese(0x88,8,name24);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
int main()
{
DDRB=0xff;                   //控制字
PORTB=0xff;
DDRA=0xff;                   //数据
PORTA=0xff;
PORTB|=0x08;                 //PSB=1
PORTB&=0xef;                 //PSB=1
_delay_us(20);
PORTB|=0x10;                 //PSB=1
reset ();
display1();
while(1)
{ keyboard();}
}





























硬件整体电路图
   
毕业设计是我大学本科学习的过程向学校、社会交出的一张总结答卷。它不仅是我对大学五年所学知识的总结,也是把所学知识融会贯通运用到实践中的一次尝试,是衡量我五年学习成果的一个必要标准。
通过此次的毕业设计,不仅使我深刻的巩固以往的所学习本专业的知识,也实际熟练了本专业的技能操作。这让我能够深刻的体会到基础的理论知识与实际实现还是存在的差异,实际应用中还要考虑各个方面的因素,这给我以后的学习和工作奠定了坚实的基础。
在此我要感谢我的指导教师张根柱老师。从毕业设计的准备到结束,他在毕业设计过程中给予了我多方面的支持和帮助。还要感谢和我一起完成毕业设计的同学们,在这次设计中我们紧密合作、互相协商,不仅锻炼了我们的沟通能力,而且培养了我们的团队精神。
最后还要感谢我生活以及学习了五年的学院,在这次毕业设计中提供给我们良好的环境以及便利的条件,让我们全心投入到这次毕业设计中。
再次感谢所有帮助过我的人们!并祝愿我们学院越来越美好!




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表