找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 24903|回复: 10
收起左侧

基于单片机的指纹自动存包柜系统设计论文

  [复制链接]
ID:211148 发表于 2017-6-14 14:37 | 显示全部楼层 |阅读模式

基于单片机的自动存包系统设计


1.026.jpg
图5.1  实物图
摘 要

近年来,随着生活水平的提高,人们对于社会消费品的质量和数量的要求也在逐渐增加。为了更好的为广大顾客服务,在一些商场、影院、超市等公共场合通常设置有自动存包柜,本次便是针对这一现象进行设计 。

本文详细介绍了国内自动存包控制系统的发展现状,发展中所面临的问题。并详细介绍了本系统采用的AT89S52单片机做控制器,可以同时管理四个存包柜。柜门锁是由继电器控制,当顾客需要存包的时候,可以自行到存包柜前按“开门”键,需要顾客向光学指纹识别系统输入个指纹,然后通过继电器进行开门(用亮灯表示),顾客即可存包,并需将柜门关上。当顾客需要取包时,要将只要将之前输入的指纹放置于指纹识别器前方,指纹识别器采集到指纹信息输出相应的高低电平信号传给单片机,系统比较密码一致后,发出开箱信号至继电器将柜门打开,顾客即可将包取出。 它具有功能实用、操作简便、安全可靠、抗干扰性强等特点。


目 录

摘 要

Abstract

第1章 绪 论

1.1  题目来源及意义

1.2  自动存包柜课题的发展与现状

1.3  本课题的目标与任务

第2章 系统方案论证与器件的选择

2.1  主控模块方案选择

2.1.1  采用DSP+FPGA方案

2.1.2  采用51单片机方案

2.1.3  采用61单片机方案

2.2  输入端方案的选择

2.2.1  机设条码式电子存包柜方案

2.2.2  非接触IC卡电子存包柜方案

2.2.3  指纹识别电子存包柜方案

2.3  输出端方案的选择

2.3.1  光电开关与电磁阀方案

2.3.2  继电器控制方案

2.4  方案总结

第3章              系统硬件设计

3.1              系统硬件总体设计

3. 2    系统硬件各单元设计

3.2.1  控制单元设计

3.2.2  指纹识别设计

3.2.3   输出电路设计

3. 3  整体电路图

第4章 系统软件设计

4.1  系统软件整体设计

4.2  系统软件各部分设计

4.2.1  键输入程序设计

4.2.2  驱动电路程序设计

第5章 系统调试

5.1  系统硬件调试

5.2  系统软件调试

5.3  系统联合调试

总 结

参考文献

致 谢

附 录



华科学院本科毕业设计(论文)


第1章  绪 论1.1 题目来源及意义

近年来,随着生活水平的提高,人们对于社会消费品的质量和数量的要求也在逐渐增加。为了更好的为广大顾客服务,在一些商场、影院、超市等公共场合通常设置有自动存包柜,它具有功能实用、操作简便、安全可靠、抗干扰性强等特点。顾客可以根据简明清晰的操作说明自行的完成取物品的工作,自助式存取可以避免开放式存包带来的不必要的纠纷,又可以节约人员开支,达到减员增效的目的。同时,存包可以解放顾客的双手,使顾客放开双手,更方便的进行购物。

单片机一词最初是源于"SingleChipMicrocomputer”,简称SCM。在单片机诞生时,SCM是一个准确、流行的称谓,“单片机”一词准确地表达了这—概念。随着SCM在技术上、体系结构上不断扩展其控制功能,单片机已不能用“单片微型计算机”来准确表达其内涵。国际上逐渐采用"MCU"(MicroControllerUnit”)来代替,形成了单片机界公认的、最终统一的名词。在国内因为“单片机”一词已约定俗成,故而继续沿用。

单片机按其内部中央处理器CPU(CentralProcessingUnit)的字长分为1位机、4位机、8位机、16位机等。从1976年8位单片机诞生以来,单片机领域中一直是以8位机为主流机型,预计这种情况还将继续下去。因此我们以Intel公司的8位机为例来谈谈单片机的发展历史。
   1.第一阶段——单片机阶段(1976午~1978年)。这阶段的任务是探索计算机的单芯片集成。以Intel公司的MCS—48为代表,其CPU、存储器、定时器/计数器、中断系统、I/O端口、时钟以及指令系统都是按嵌入式系统要求专门设计的。
   2.第二阶段——单片机的完善阶段(1978年一1982年)。计算机的单芯片集成探索取得成功后,随后的任务就是要完善单片机的体系结构。作为这一阶段的典型代表是Inlel公司将MCS—48向MCS—5l系列的过渡。它在以下几个重要方面奠定了单片机的体系结构。
(1)完善的外部总线。有8位数据总线、16位地址总线、控制总线及具有多机通信功能的串行通信接口。
(2)CPU外围功能单元的集中管理模式。
(3)设置面向工控的位地址空间及位操作方式。
(4)指令系统突出控制功能。
  3.第三阶段——微控制器形成阶段(1983年一1990年)。这一阶段单片机的主要技术发展方向是满足测控对象要求的外围电路的增强,如A/D转换、D/A转换、高速I/O口、WDT(程序监视定时器)、DMA(高速数据传输)等,强化了智能控制的特征。
  4.第四阶段--微控制器全面发展阶段(1990年以后)。即当前的单片机时代,其显著特点是百花齐放、技术创新。单片机正在满足各个方面的需求.从玩具、小家电、工程控制单元到机器人、智能仪表,过程控制,个人信息终端等无所不能。

1.2  自动存包柜课题的发展与现状

电子存包柜又名自动存包柜、电子寄存柜,是20世纪嵌入式计算机快速发展后在传统寄存行业的一大应用。从外观和用途来看,电子存包柜属于家具类别中的钢制家具。从实现方式和功能上来看,电子存包柜属于电子专用设备。电子存包柜主要由以下几种类型:

(1)机设条码式电子存包柜   

存物时:按“存”键,寄存柜自动打印一张密码条,机器语音提示:“请取密码条”。使用者抽出密码纸,对应的箱门自动打开,存好后关上箱门。取物时:直接将条码纸在扫描口扫描,对应的箱门会自动打开。语音提示:“请取完物品后关好箱门。”

(2)指纹式电子存包柜   

以使用者指纹作为寄存的凭证;当使用者进行存物操作时,须先按一下操作键盘中的“存”键,然后在指纹采集窗里采集指纹,机器会把该指纹与分配给使用者使用的寄存箱的箱号结合起来,并将信息自动记录下,同时自动打开该箱,供使用者存物,存完后使用者自己关好箱门;取物时,只需须先按一下操作键盘中的“取”键,然后在指纹采集窗里采集指纹,寄存柜将指纹数据与先前记录下的进行比对,正确后才会打开该箱供使用者取物(同时机器会自动记录当时的时间、指纹以备查询)。  

(3)非接触IC卡电子存包柜   

以使用者所持IC卡(即射频卡)作为寄存的凭证;当使用者进行存物操作时,须先按一下操作键盘中的“存”键再刷卡(即让寄存柜读取卡号),寄存柜先识别是否为该场所的IC卡,若不是则拒绝存物;若是,机器会把该卡号与分配给使用者使用的寄存箱的箱号结合起来,并将信息自动记录下,同时自动打开该箱,供使用者存物,存完后自己关好箱门;取物时,只需须先按一下操作键盘中的“取”键再刷卡,寄存柜将读取的卡号与先前记录下的进行比对,正确后才会打开该箱供使用者取物(同时机器会自动记录当时的时间、卡号以备查询)

4)联网型非接触IC卡电子存包柜   

联网型非接触IC卡电子存包柜基本功能与非接触IC卡电子存包柜一致,另外增加了网络通讯模块,上位机管理软件等,以实现寄存状态联网监控,分段收费,报表打印等功能。   

现在公共场所应用比较广泛。因此,研制出一种能自动存包的装置有很重大的意义,我所研究的就是这方面的课题。

1.3  本课题的目标与任务

本系统采用的单片机做控制器,可以同时管理多个存包柜。柜门锁由继电器控制,当顾客需要存包的时候,可以自行到存包柜前按“开门”键,需要顾客向系统输入个指纹,然后通过继电器进行开门(用亮灯表示),顾客即可存包,并需将柜门关上。当顾客需要取包时,要将只要将之前输入的指纹放置于指纹识别器前方,指纹识别器采集到指纹信息输出相应的高低电平信号传给单片机,系统比较密码一致后,发出开箱信号至继电器将柜门打开,顾客即可将包取出。

相比较条形码扫描和IC卡的自动存包柜相比,指纹识别的优势在于在整个存包过程中无附带的物品,不怕因为丢失而导致无法取包,所以我觉得指纹识别在现今的各类存包柜中有很明显的发展前景。


第2章   系统方案论证与器件的选择
2.1  主控模块方案选择
2
.1.1  采用DSP+FPGA方案

指纹识别追求的主要指标为高识别率、实时性和大词汇量;而对于一个指纹识别系统,还应考虑软硬件设计简单、价格低廉、外围控制灵活、人机交互便捷等特点。现在应用于语音识别的芯片主要为DSP(数字信号处理器)芯片:如TI公司的TMS320系列。然而, 将DSP 芯片用于小型语音指纹系统中, 其不足之处是很明显的:引脚多、价格贵、使用繁琐;控制功能弱,常需要与单片机或FPGA (现场可编程门阵列)结合, 来实现人机交互;常需要外接A/D 转换芯片;引脚为3.3 V,与单片机、FPGA、Flash存储器等连接时,要考虑电平匹配。这些将使整个系统结构庞大,设计繁琐。

2.1.2  采用51单片机方案

采用 MCS-51 系列单片机实现,选用AT89S52芯片作为主要的控制模块。该芯片中共有四块用来跟外接电路连接。满足了我本次设计的基本要求,所我选择51单片机作为本次设计的方案

2.1.3  采用61单片机方案

1. 电源区:61板采用3节五号电池进行供电,由J10接入,在61板上,前后两组电容用来耦合滤波,使其供给芯片的电电源接反源更加的干净平滑。为了获得标准的3.3v电压,在板子上加入SPY0029A三端稳压管。

两个CE基二极管,是为了防止误将电源接反造成不必要的损失而设置的,在操作中千万不要将电源接反,因为反向电压超过一定的值,二极管将会被损坏,达不到保护的目的。后面的零电阻及其电源、地分成不同的几路是为减少电磁干扰设置的。

2. 程序下载区:I本运作方式是通过控制clock及通过ICE喂食指令方式,老来控制cpu的运行及缓存器资料和内存资料的存取,因此必须透过控制缓存器值得设定来控制目前cpu的动作。  

3. 音频输入部分:在61板上,MICP和MICN将随着MIC产生的波形变化,并在两个端口处形成两路反想的波形,再经过两级运放放大,把放大的语音信号交给ADC转换为数字量,这个时候我们就可以通过单片机编程对这些数据进行处理,比如说语音数据压缩、语音识别样本处理。   

4.J3是语音输出接口,一个放大,然后输出,SPY0030A放大,然后输出。

5.SPCE061A与周边:这就是整块板子的大脑,所有控制信息都是从这里发出的,那些周边器件用来协助SPCE061A单片机正常工作。   

6.键控区:采用这几个按键我们可以做一些简单的试验,比如说当板子里下载了复读机的程序,按这几个按键就可以分别用来进行录音、暂停和播放。  

7.复位区:这里是由几个简单的电子元器件组成,当按下这里面的按键后,单片机就重新开始工作,也可以说成是单片机里的程序从第一条开始重新运行。  

8.端口区:用于对外挂硬件的控制,或者获取外部硬件的一些状态以便SPCE061A来进行处理。


2.2  输入端方案的选择2.2.1  机设条码式电子存包柜方案

存物时:按“存”键,寄存柜自动打印一张密码条,机器语音提示:“请取密码条”。使用者抽出密码纸,对应的箱门自动打开,存好后关上箱门。取物时:直接将条码纸在扫描口扫描,对应的箱门会自动打开。语音提示:“请取完 物品后关好箱门。”

设计如下

根据“自动存包”这一目的要求,做如下设计安排:

第一部分:CPU核心控制部分,由单片机8031、复位电路、时钟电路等构成,是整个系统的核心。

第二部分:键盘显示控制部分。对3个数码管和2个按键进行管理,3个数码管用于显示两位柜号和3位密码,12个按键分别为10个数字键和2个功能键。通过这些键盘,用户就可以完成所有的操作。

第三部分:执行机构部分。它是通过8051的并行口扩展一片8255A芯片,并通过8255A控制20个灯的状态(亮灭)来模拟柜子的存包取包的过程。

软件部分主要采用我们自己设定的一种与柜号相关联的算法来产生一组3位的随机密码,而密码的产生、核对过程就对应存包、取包的过程。

系统框图如图2.1所示

1.002.jpg

图2.1 系统框图

主要核心器件有:AT89C51,打印机,条形码扫描系统,光电开关,电磁阀等。

主程序模块

该模块的功能包括显示的初始化,判断是否有空箱,键盘扫描,密码扫描等功能。


  本次设计的流程图如图2.2.软件模拟程序为,首先先检测所有的空箱数目,然后根据按键判断状态是要存包还是取包,如果是存包的话,就输入密码,然后将包存入箱柜内,然后关门,系统检测是否关门,如果是的话则进行下一步,否则提示未关门。如果是取包的时候,输入密码后,验证密码的正确与否,正确的话就看箱柜是否关门,否则提示箱柜未关门。


1.003.jpg


图2.2 主程序流程图

优点:方便,识别度高,

缺点:容易丢失打印条,因为有条形码扫描和条形码打印这块,所以造价成本比较高,所以不适于本次设计的使用。

2.2.2  非接触IC卡电子存包柜方案

以使用者所持IC卡(即射频卡)作为寄存的凭证;当使用者进行存物操作时,须先按一下操作键盘中的“存”键再刷卡(即让寄存柜读取卡号),寄存柜先识别是否为该场所的IC卡,若不是则拒绝存物;若是,机器会把该卡号与分配给使用者使用的寄存箱的箱号结合起来,并将信息自动记录下,同时自动打开该箱,供使用者存物,存完后自己关好箱门;取物时,只需须先按一下操作键盘中的“取”键再刷卡,寄存柜将读取的卡号与先前记录下的进行比对,正确后才会打开该箱供使用者取物(同时机器会自动记录当时的时间、卡号以备查询)

优点:识别度高,系统稳定,

缺点:IC卡不易携带,而且会出现消磁等问题,所以不适于本次设计。

2.2.3  指纹识别电子存包柜方案

以使用者指纹作为寄存的凭证;当使用者进行存物操作时,须先按一下操作键盘中的“存”键,然后在指纹采集窗里采集指纹,机器会把该指纹与分配给使用者使用的寄存箱的箱号结合起来,并将信息自动记录下,同时自动打开该箱,供使用者存物,存完后使用者自己关好箱门;取物时,只需须先按一下操作键盘中的“取”键,然后在指纹采集窗里采集指纹,寄存柜将指纹数据与先前记录下的进行比对,正确后才会打开该箱供使用者取物(同时机器会自动记录当时的时间、指纹以备查询)

1.004.jpg

图4.3  设计框图

优点:识别度高,没有多余的东西,方便,容易使用,成本相比较而言较低,所以本次设计运用该方案。


2.3  输出端方案的选择2.3.1  光电开关与电磁阀方案

红外线光电开关(光电传感器)是利用被检测物体对红外光束的遮光或反射,由同步回路选通而检测物体的有无,其物体不限于金属,对所有能反射光线的物体均可检测。

开箱控制电路功能用来打开箱锁。该系统共控制24个存包柜,其中使用了8255A的PA、PB、PC三口的24跟口线作为输出,输出信号经三极管放大后驱动电磁锁动作,从而将箱锁打开。同时在箱的门沿上还装有限位开关,来检测门的闭合与否。并在适当的时候来进行报警,提醒顾客关好柜门。为了保证安全,锁簧需要有较强的弹力。电磁锁的驱动功率需要20W以上,可以采用20V直流电源,产生1A的驱动电流,为加强驱动功率,采用二级直流放大。在这里我们使用DSN-Y电磁锁,他的技术指标即参数都能够满足我们的需要。


2.3.2  继电器控制方案

电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。继电器一般有两股电路,为低压控制电路和高压工作电路

通过单片机的指令,控制继电器的导通或者切断,用灯来模拟箱柜的开关。


2.4  方案总结

通过比较可知,在主控方案选择中,用单片机方案更加容易的实现我的设计;而在输入设备中,相比较IC卡和条形码扫描,我个人认为指纹识别更加方便实用,而且所用资源比较少,性价比更高,所以选择指纹识别作为本次实验的方案;而在输出设备中,我认为继电器方案能够更加明显的显示我的设计,更加容易的实现,综上所述,我的方案定为这样的。


第3章                     系统硬件设计3.1          系统硬件总体设计

自动存包柜的系统框图如图3.1。该系统AT89S52单片机为核心,还有显示屏及按键,指纹识别器,继电器检测,断电保护等部分。

以使用者指纹作为寄存的凭证;当使用者进行存物操作时,须先按一下操作键盘中的“存”键,然后在指纹采集窗里采集指纹,机器会把该指纹与分配给使用者使用的寄存箱的箱号结合起来,并将信息自动记录下,同时自动打开该箱,供使用者存物,存完后使用者自己关好箱门;取物时,只需须先按一下操作键盘中的“取”键,然后在指纹采集窗里采集指纹,寄存柜将指纹数据与先前记录下的进行比对,正确后才会打开该箱供使用者取物(同时机器会自动记录当时的时间、指纹以备查询)。


1.005.jpg

图 3.1 自动存包柜系统框图


根据系统框图,本设计的面板设计图如图3.2所示

1.006.jpg

图3.2 面板设计图


3. 2    系统硬件各单元设计3.2.1  控制单元设计

AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2个数据指针,三16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

P0口P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0不具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程校验时,需要外部上拉电阻。

P1口P1口是一个具有内部上拉电阻的8位双向I/O 口,p1 输出缓冲器能驱动4个 TTL逻辑电平。

此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。在flash编程和校验时,P1口接收低8位地址字节。

引脚号第二功能:

P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出

P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)

P1.5 MOSI(在系统编程用)

P1.6 MISO(在系统编程用)

P1.7 SCK(在系统编程用)

在该设计中,P1口与显示屏相连,显示出单片机做出的运转。

P2 口P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用 8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

在该设计中,P2口与输出的继电器相连,在整个系统中的作用就是作为输出设备的存在。

P3口P3口是一个具有内部上拉电阻的8位双向I/O 口,p3输出缓冲器能驱动4个TTL逻辑电平。 P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。

端口引脚第二功能:

P3.0 RXD(串行输入口)

P3.1 TXD(串行输出口)

P3.2 INTO(外中断0)

P3.3 INT1(外中断1)

P3.4 TO(定时/计数器0)

P3.5 T1(定时/计数器1)

P3.6 WR(外部数据存储器写选通)

P3.7 RD(外部数据存储器读选通)

此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。

在该设计中,P3口作为输入端存在,接受系统输入的信号。

RST复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。

ALE/PROG当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。

PSEN程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。

EA/VPP外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平

(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。

XTAL1振荡器反相放大器和内部时钟发生电路的输入端。

XTAL2振荡器反相放大器的输出端。

AT89S52的管脚图见图3.3

1.007.jpg 1.008.jpg

AT89S52的工作方式

AT89S52的工作方式可以分做复位,掉电和低功耗方式等。
(一)、复位方式

单片机复位后,程序计数器PC和SFR的状态。复位后,PC初始话为0000H,使单片机能从0000H开始执行程序,故单片机除正常工作的程序运行出错或操作出错而导致死机时,需要复位键进行重新启动,复位不影响RAM存放的内容,因为复位操作是在带电的状态下将程序存储器的地址改变,而ALE和PSEN非在复位期间将输出高电平。

RST是复位信号的输入端,RST输入一个有效的高电平旧能使系统复位,当高电平持续24个振荡脉冲周期的时候,单片机完成了复位的操作,假如晶振的频率为6MHZ,则复位信号的持续时间不应小于4us。

复位可以是上电复位,按键手动复位,和二者混合式。复位信号中的电阻和电容是为了保证RST断能保证两个机器周期以上的高电平来完成复位操作而特意设定的。

(二)、掉电和低功耗方式

人们往往在程序运行中发生系统掉电的故障,使RAM和寄存器中的数据内容丢失,使人们丢失珍贵的数据而束手无策,AT89S52有掉电保护功能,是先把有用的数据保存,再用备用电源进行供电。

3.2.2  指纹识别设计

在自动存包柜的设计中输入部分是十分重要的一个环节,在这里我们需要检测门的限位,检测箱内是否有物体,还有相应的录入密码,并在顾客需要的时候检测密码,并自动打开柜门。还需要显示是否有空箱以及空箱的位置,来为顾客提供选择。

(1) 指纹技术设计

指纹识别技术把一个人同他的指纹对应起来,通过比较他的指纹和预先保存的指纹进行比较,就可以验证他的真实身份。每个人(包括指纹在内)皮肤纹路在图案、断点和交叉点上各不相同,也就是说,是唯一的,并且终生不变。依靠这种唯一性和稳定性,我们才能创造指纹识别技术

指纹识别特征

总体特征是指那些用人眼直接就可以观察到的特征。包括纹形、模式区、核心点、三角点和纹数等。

纹形

指纹专家在长期实践的基础上,根据脊线的走向与分布情况一般将指纹分为三大类——环型(loop,又称斗形)、弓形(arch)、螺旋形(whorl)。

模式区

即指纹上包括了总体特征的区域,从此区域就能够分辨出指纹是属于哪一种类型的。有的指纹识别算法只使用模式区的数据,有的则使用所取得的完整指纹。

核心点

位于指纹纹路的渐进中心,它在读取指纹和比对指纹时作为参考点。许多算法是基于核心点的,即只能处理和识别具有核心点的指纹。

三角点

位于从核心点开始的第一个分叉点或者断点,或者两条纹路会聚处、孤立点、折转处,或者指向这些奇异点。三角点提供了指纹纹路的计数跟踪的开始之处。

纹数

即模式区内指纹纹路的数量。在计算指纹的纹路时,一般先连接核心点和三角点,这条连线与指纹纹路相交的数量即可认为是指纹的纹数。

局部特征是指指纹上节点的特征,这些具有某种特征的节点称为细节特征或特征点。

两枚指纹经常会具有相同的总体特征,但它们的细节特征,却不可能完全相同。指纹纹路并不是连续的、平滑笔直的,而是经常出现中断、分叉或转折。这些断点、分叉点和转折点就称为"特征点",就是这些特征点提供了指纹唯一性的确认信息,其中最典型的是终结点和分叉点,其他还包括分歧点、孤立点、环点、短纹等。特征点的参数包括:方向(节点可以朝着一定的方向)、曲率(描述纹路方向改变的速度)、位置(节点的位置通过x/y坐标来描述,可以是绝对的,也可以是相对于三角点或特征点的)。

  指纹识别器的种类

感应或读取指纹有多种不同方式,其中电容式传感技术的基本原理是,它根据活体手指——请注意“活体”一词——表层上的电阻变化传导指纹图像。皮肤的表皮层,包括手指的表皮层的细胞是非活体的。剥掉非活体细胞的表皮层可以看到第一层活体皮肤细胞,这些皮肤细胞具有一定量电阻。它们还在皮肤表层上组成特定形状——常见的指纹嵴线和沟。细胞中的特定电学品质与细胞的排列方式这二者的结合使得皮肤表面的电阻能够被测量到且其变化唯一。这就是电容式读取器的工作方式——它首先读取手指活体表皮的电阻变化,然后传导显示这些变化的手指图。该图看起来就像警察展示的标准指纹图像。电阻变化图称作指纹图像。产生指纹图像后会对其进行保存,或将其与另一个指纹图像进行比较,以确定它们是否相同。

指纹识别器的种类:

光学。该技术实质上是对手指表层进行拍照。警察使用印台获取指纹,这是光纤图像的一个示例。它是一种较早的数字技术。

红外线。其测量手指的温度。这一因素的使用之一是验证是否存在活体手指(死的或非常冷的手指不会通过验证)。

雷达。它是一种光学变异,可发射雷达能量并读取从呈现的手指上反射的信号。通过雷达可构建图像并进行比较。

激光。激光的种类有多种。一种是使用激光灯来读取皮肤表层下的毛细血管。激光有多种优势。一种是您无法利用从玻璃等物体上盗取的指纹来以假乱真。它不会在意皮肤的外观,只关注皮肤下毛细血管的排列。另一种是如果手指是死的(切断的或仍在尸体上),毛细血管便会干瘪(无心搏),传感器根本不会传导图像。该技术非常昂贵。

综上可以看出,光学类的指纹识别器(ZAZ-010-B)性价比最高,所以本次的设计采用光学指纹识别器。

指纹识别系统主要包括:单片机最小系统、指纹采集部分、串口通信电路、外部存储部分、开关按钮,供电系统组成。其结构框图如图所示。

指纹识别系统单片机采用8051单片机,它是整个控制器的核心部件。MAX232作为接口芯片用于实现指纹传感器串口的RS-232信号与8051串行口的TTL信号的相互转换。电源部分包括DC+5V及保护电路。

基于单片机MCS-51的指纹识别系统是由8051处理器、68128RAM和EEPROM芯片等构成,具有指纹录入、图像处理、指纹对比、搜索和模版储存等功能的智能型模块。它通过与之相配套的指纹传感器,可构成一个独立的指纹识别系统,或作为一个完整的外部设备。

该系统控制的核心是单片机8051,因为通过比较DSP芯片,处理速度较快和存储量较大,但性价比较低。而选取单片机MCS-51主要原因是功耗低、可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,128x8bit内部RAM,能满足设计要求。

指纹识别系统是一个典型的模式识别系统,包括指纹图像获取、处理、特征提取和比对等模块。

通过指纹读取设备读取到人体指纹的图像,然后要对原始图像进行初步的处理,使之更清晰,再通过指纹辨识软件建立指纹的特征数据。软件从指纹上找到被称为“节点”(minutiae)的数据点,即指纹纹路的分叉、终止或打圈处的坐标位置,这些点同时具有七种以上的唯一性特征。通过计算机模糊比较的方法,把两个指纹的模板进行比较,计算出它们0配结果。

指纹图像获取:通过专门的指纹采集仪可以采集活体指纹图像。目前,指纹采集仪主要有活体光学式、电容式和压感式。对于分辨率和采集面积等技术指标,公安行业已经形成了国际和国内标准,但其他还缺少统一标准。根据采集指纹面积大体可以分为滚动捺印指纹和平面捺印指纹,公安行业普遍采用滚动捺印指纹。另外,也可以通过扫描仪、数字相机等获取指纹图像。

指纹图像压缩:大容量的指纹数据库必须经过压缩后存储,以减少存储空间。主要方法包括JPEG、WSQ、EZW等。

指纹图像处理:包括指纹区域检测、图像质量判断、方向图和频率估计、图像增强、指纹图像二值化和细化等。

纹型是指纹的基本分类,是按中心花纹和三角的基本形态划分的。纹形从属于型,以中心线的形状定名。我国十指纹分析法将指纹分为三大类型,九种形态。一般,指纹自动识别系统将指纹分为弓形纹(弧形纹、帐形纹)、箕形纹(左箕、右箕)

斗形纹和杂形纹等。

1.009.jpg

1.010.jpg 1.011.jpg 1.012.jpg

图3.5 指纹形态

指纹形态和细节特征提取:指纹形态特征包括中心(上、下)和三角点(左、右)等,指纹的细节特征点主要包括纹线的起点、终点、结合点和分叉点。

指纹比对:可以根据指纹的纹形进行粗匹配,进而利用指纹形态和细节特征进行精确匹配,给出两枚指纹的相似性得分。根据应用的不同,对指纹的相似性得分进行排序或给出是否为同一指纹的判决结果。

当指纹传感器收到指纹信息,将通过串口给单片机发送命令,单片机同意并接收相应的信息,指纹传感器采集的指纹转换成RGB格式,并且数据传输到单片机,单片机通过存储在EEPROM中的固化程序执行大量的模式识别和图像处理相关计算,当用户的指纹被确认,单片机将命令执行机构动作,开关开。

AT89S52系列单片机采用的是HMOS工艺:高速度、高密度;

AT89S52系列单片机采用的是CHMOS工艺:高速度、高密度、低功耗;

也就是说AT89S52单片机是一种低功耗单片机。

本系统采用AT89S52作为指纹识别系统的核心处理器,使用单片机内部的4K程序存储器,接+5V电源。

复位电路则采用简单RC复位电路,同时又可与一些需要复位的外围电路相连,达到复位与单片机同步。

/EA/Vpp为访问内部或外部程序存储器的选择信号.由于AT89S52单片机有4K的内部程序存储器,又外接了128Kx8的EEPROM存储器,故该引脚必须接+5V高电平./PSEN为外部程序存储器读选通控制信号.此电路中无扩展程序存储器.故该脚悬空.

串口通信接口设计采用MAX232实现TTL与RS-232的转换,实现与计算机通信。

(2) 箱柜感应设计

光电开关是传感器大家族中的成员,它把发射端和接收端之间光的强弱变化转化为电流的变化以达到探测的目的。由于光电开关输出回路和输入回路是电隔离的(即电缘绝),所以它可以在许多场合得到应用。

光电开关的工作原理

光电开关(光电传感器)是光电接近开关的简称,它是利用被检测物对光束的遮挡或反射,由同步回路选通电路,从而检测物体有无的。物体不限于金属,所有能反射光线的物体均可被检测。光电开关将输入电流在发射器上转换为光信号射出,接收器再根据接收到的光线的强弱或有无对目标物体进行探测。多数光电开关选用的是波长接近可见光的红外线光波型。德国SICK公司的部分光电开关的外型如图3.5。

1.013.jpg

图3.6 部分光电开关外形

光电开关的分类

①漫反射式光电开关:它是一种集发射器和接收器于一体的传感器,当有被检测物体经过时,物体将光电开关发射器发射的足够量的光线反射到接收器,于是光电开关就产生了开关信号。当被检测物体的表面光亮或其反光率极高时,漫反射式的光电开关是首选的检测模式。

②镜反射式光电开关:它亦集发射器与接收器于一体,光电开关发射器发出的光线经过反射镜反射回接收器,当被检测物体经过且完全阻断光线时,光电开关就产生了检测开关信号。

③对射式光电开关:它包含了在结构上相互分离且光轴相对放置的发射器和接收器,发射器发出的光线直接进入接收器,当被检测物体经过发射器和接收器之间且阻断光线时,光电开关就产生了开关信号。当检测物体为不透明时,对射式光电开关是最可靠的检测装置。

④槽式光电开关:它通常采用标准的U字型结构,其发射器和接收器分别位于U型槽的两边,并形成一光轴,当被检测物体经过U型槽且阻断光轴时,光电开关就产生了开关量信号。槽式光电开关比较适合检测高速运动的物体,并且它能分辨透明与半透明物体,使用安全可靠。

⑤光纤式光电开关:它采用塑料或玻璃光纤传感器来引导光线,可以对距离远的被检测物体进行检测。通常光纤传感器分为对射式和漫反射式。

它们的工作光线示意图如图3.7所示。

1.014.jpg

图 3.7 各种光电开关的示意图

光电开关的使用注意事项

①红外线传感器属漫反射型的产品,所采用的标准检测体为平面的白色画纸。

②红外线光电开关在环境照度高的情况下都能稳定工作,但原则上应回避将传感器光轴正对太阳光等强光源。

③对射式光电开关最小可检测宽度为该种光电开关透镜宽度的80%。

④当使用感性负载(如灯、电动机等)时,其瞬态冲击电流较大,可能劣化或损坏交流二线的光电开关,在这种情况下,请将负载经过交流继电器来转换使用。

⑤红外线光电开关的透镜可用擦镜纸擦拭,禁用稀释溶剂等化学品,以免永久损坏塑料镜。

⑥针对用户的现场实际要求,在一些较为恶劣的条件下,如灰尘较多的场合,所生产的光电开关在灵敏度的选择上增加了50%,以适应在长期使用中延长光电开关维护周期的要求。

⑦产品均为SMD工艺生产制造,并经严格的测试合格后才出厂,在一般情况下使用均不会出现损坏。为了避免意外性发生,请用户在接通电源前检查接线是否正确,核定电压是否为额定值。

这本设计中我们需要对存包柜中进行检测,并且实时显示无物的箱号,顾客门没有关靠的时候发出报警,所以我们选用漫反射式光电开关。

我们选取FR12-40型,它的工作参数如下:

1.工作电压: 5 - 12V.
2.动态工作电流:5-20mA.
3.最大输出电流10mA.
4.12V供电时有效控制距离最大为3.5米.
5.外型尺寸:21x68x37mm

(3)  限位开关介绍

限位开关可以根据运动部件的位置来切换电路。工作时由挡块和限位开关的轮子或触杆相撞使限位开关的触点接通或断开,常用于控制运动部件的方向、行程长短、位置。还可以用来检测开关物体是否闭合。我们使用LJ-DFJ型限位开关,它的特点是:
    1、单棒式探头,工作稳定,感度好。
    2、不受测定物性质的影响,安装后无须调整,即可稳定投入使用
    3、采用压电元件内置于棒体和厚管壁的不锈钢管的探头,消振管仅9mm长(同类比为最短),抗重荷、安全可靠、寿命长。
    4、依据所测定对象不同,可调整测定感度(高、中、低)
    5、使用15A大容量接点继电器开关,可直接实行对电机控制。

(4)  键盘、显示器接口电路

该系统中键盘的主要功能是用于顾客选择适当的柜来存包,这里我们用普通的按键开关,用4个按键来控制4个柜门的关闭,然后一个按键为存包键,一个为取包键,最后一个为复位键。剩下的一个为整个系统的开关。如图3.8

1.015.jpg 1.016.jpg

图3.8 键盘设计

3.2.3   输出电路设计

    在输出电路中包含了显示部分,驱动部分,报警部分,下面详细介绍各部分的功能及工作过程。

(1)  显示部分设计

随着仪器、仪表智能化、多功能化的要求,液晶显示器以其体积小、功耗低、接口方便等优点在显示器市场中脱颖而出,取代了传统的LED、CRT等显示方式而成为现代显示技术发展的主流。

系统采用液晶显示器(LCD),液晶显示器是一种被动式的显示器,即液晶本身并不发光,而是利用液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或者黑底白字显示的目的。液晶显示器在单片机系统中作为输出器被广泛使用有以下原因:

  • 显示质量高
  • 数字接口
  • 体积小、重量轻
  • 功率消耗小

LCD的显示原理:

在LCD显示器的上下两电极间加有液晶材料,液晶分子呈平行排列,具有旋光性,平时呈透明态,当上下电极间加上一定电压时,液晶分子转成垂直排列,失去旋光性而呈黑色。

LCD显示分为笔段型、点阵字符型、点阵图形型。本设计采用点阵字式LCD显示器。要使用本显示器,必须有相应的LCD控制器,驱动器来对LCD显示器进行扫描、驱动,以及一定空间的ROM和RAM来存储写入的命令和显示字符的点阵。现在人们已经将LCD控制器、驱动器、RAM、ROM和LCD显示器用PCB连接到一起,称为液晶显示模块LCM(LCD Module)。使用者只要想LCM送入相应的命令和数据就可以实现所需要的显示,这种模块与单片机接口简单,使用灵活方便。

在这里我们选用LCM045型号显示器,它的基本结构如下:

(1)液晶板

在液晶板上排列着若干5×10点阵的字符显示位,没个显示位可以显示1个字符。

(2)模块电路

模块电路是由控制器HD44780、驱动器HD44100及几个电阻电容组成的。HD44100是扩展显示字符位用的。PCB上有14个引脚,其中有8条数据线,3条控制线,其功能见下表可以很容易的很8031相接(如图3.1)通过送入数据和指令可以对显示方式和显示内容做出选择。

(3)驱动器和控制器

驱动器HD44100是用低功耗CMOS技术制造的大规模LCD驱动IC。它即可以当行驱动,也可以当列驱动,由20×2bit二进制移位寄存器、20×2bit数据寄存器和20×2bit驱动器组成。

表3.1 引线功能

引 角 号

符   号

名   称

功   能

1

VSS

0V

2

VDD

电路电源

5V±5%

3

VLCD

液晶驱动电压

见图3.2.2

4

RS

寄存器选择

H 数据寄存器

L 指令寄存器

5

R/W

读/写

H 读 L写

6

E

使能

下降沿触发

7

·

·

14

DB0

·

·

DB7

8位数据线

数据传输

LCD控制器HD44780是用低功耗CMOS技术制造的大规模模点阵LCD控制器(兼带驱动器)和4位/8位微处理器相连,它能使点阵LCD显示大小写英文字母,数字和符号。应用HD44780,用户能用少量元件就可以组成一个完整点阵LCD系统。

1.017.jpg

图3.9 LCD与单片机连接图

(2)  驱动电路设计

存包柜由若干个独立分隔的铁壳箱体组成。每个箱体的门都是由一个电磁线圈控制的,当单片机接受到密码检测信号,并且密码正确,就会给电磁线圈一个信号使电磁线圈的电,吸动锁扣,箱门就自动打开。当箱门关闭的时候,锁扣被推上,箱门就可靠的锁住。在这里我们使用DSN-Y电磁锁。

DSN型电磁锁的结构原理:

DSN电磁缩是由电气和机械两部组成。电气部分:开锁指示灯、电源按钮、电磁铁线圈。机械部分:外壳、锁栓、复位弹簧、开锁钮、解锁机构、电磁铁机构。它的接线原理图如图3.10

1.018.jpg 1.019.jpg

图 3.10电磁锁接线原理图

工作原理:

H(开锁指示灯) R(限流电阻) S(电源按钮)L(电磁铁线圈) KA(闭锁接点)

当闭锁接点接通后,按下电源按钮,指示灯亮,电磁铁的线圈通电,铁芯往下吸解除锁栓受控,用手拨动开锁钮带动锁栓即可开锁。完成上述开锁合,锁栓自动复位并保持锁定位置。当闭锁接点不接通,则不能开锁。在特殊情况下,如电磁铁失压(无电源)或应急解锁可用专用锁匙实现开锁。驱动电路连接图如图3.19

1.020.jpg

图3.11 电磁锁驱动电路

(3)  报警电路设计

顾客在存包的时候很容易出现存完包或则是取完包忘记关门的现象,我们在这里设计一个自动报警装置,可以在适当的时候提醒顾客关好柜门。LM555是美国国家半导体公司的时基电路。我国和世界各大集成电路生产商均有同类产品可供选用,是使用极为广泛的一种通用集成电路。LM555功能强大、使用灵活、适用范围宽,可用来产生时间延迟和多种脉冲信号,被广泛用于各种电子产品中。
    LM555 时基电路有双极型和 CMOS 型两种。LM555属于双极型。优点是输出功率大,驱动电流达 200mA。而另一种 CMOS 型的优点是功耗低、电源电压低、输入阻抗高,但输出功率要小得多,输出驱动电流只有几毫安。

LM555的引脚图如图3.12

1.021.jpg

图3.12  LM555引脚图

电路特点
   LM555 时基电路内部由分压器、比较器、触发器、输出管和放电管等组成,是模拟电路和数字电路的混合体。其中

6 脚为阀值端(TH),是上比较器的输入。

2 脚为触发端(TR),是下比较器的输入。

3 脚为输出端(OUT),有 0 和 1 两种状态,它的状态由输入端所加的电平决定。

7 脚为放电端(DIS),是内部放电管的输出,它有悬空和接地两种状态,也是由输入端的状态决定。

4 脚为复位端(R),叫上低电平(< 0.3V)时可使输出端为低电平。

5 脚为控制电压端(CV ),可以用它来改变上下触发电平值。

8 脚为电源(VCC),1 脚为地(GND)。
  这个特殊的 R-S 触发器有两个特点:(1)两个输入端的触发电平要求一高一低:置零端 R 即阀值端 TH 要求高电平,而置位端 S 即触发端 TR 则要求低电平。(2)两个输入端的触发电平,也就是使它们翻转的阀值电压值也不同,当CV 端不接控制电压是,对 TH(R) 端来讲,> 2/3VCC 是高电平 1,< 2/3VCC 是低电平 0;而对 TR(S)端来讲,> 1/3VCC 是高电平 1,< 1/3VCC 是低电平 0。如果在控制端 CV 加上控制电压 VC,这时上触发电平就变成 VC 值,而下触发电平则变成 1/2VC。可见改变控制端的控制电压值可以改变上下触发电平值。


(4)  开箱电路设计

开箱控制电路功能用来打开箱锁。该系统共控制4个存包柜,其中使用了AT89S52的P2.0-P2.3接线口作为输出,输出信号经三极管放大后驱动电磁锁动作,从而将箱锁打开。同时在箱的门沿上还装有限位开关,并用灯来显示门的闭合与否。并在适当的时候来进行报警,并用灯来显示提醒顾客关好柜门。如图3.14

1.022.jpg

图3.14  箱柜设计图

电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。

只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。继电器一般有两股电路,为低压控制电路和高压工作电路。

磁簧继电器是以线圈产生磁场将磁簧管作动之继电器,

为一种线圈传感装置。因此磁簧继电器之特征、小型尺寸、轻量、反应速度快、短跳动时间等特性。

当整块铁磁金属或者其它导磁物质与之靠近的时候,发生动作,开通或者闭合电路。由永久磁铁和干簧管组成。永久磁铁、干簧管固定在一个不导磁也不带有磁性的支架上。以永久磁铁的南北极的连线为轴线,这个轴线应该与干簧管的轴线重合或者基本重合。由远及近的调整永久磁铁与干簧管之间的距离,当干簧管刚好发生动作(对于常开的干簧管,变为闭合;对于常闭的干簧管,变为断开)时,将磁铁的位置固定下来。这时,当有整块导磁材料,例如铁板同时靠近磁铁和干簧管时,干簧管会再次发生动作,恢复到没有磁场作用时的状态;当该铁板离开时,干簧管即发生相反方向的动作。磁簧继电器结构坚固,触点为密封状态,耐用性高,可以作为机械设备的位置限制开关,也可以用以探测铁制门、窗等是否在指定位置。

3. 3  整体电路图

1.023.jpg

图3.15  整体电路图


第4章 系统软件设计

为了使本系统的整个程序清晰明白,便于调试和修改,程序设计时把系统的各种功能分为若干部分,对于每一部分功能编制相对独立的程序块,各程序在运行的时候各负其责。

4.1  系统软件整体设计

该模块的功能包括显示的初始化,判断是否有空箱,键盘扫描,密码扫描等功能。

主要核心器件有:AT89C51,打印机,条形码扫描系统,光电开关,电磁阀等。

主程序模块

该模块的功能包括显示的初始化,判断是否有空箱,键盘扫描,密码扫描等功能。

以使用者指纹作为寄存的凭证;当使用者进行存物操作时,须先按一下操作键盘中的“存”键,然后在指纹采集窗里采集指纹,机器会把该指纹与分配给使用者使用的寄存箱的箱号结合起来,并将信息自动记录下,同时自动打开该箱,供使用者存物,存完后使用者自己关好箱门;取物时,只需须先按一下操作键盘中的“取”键,然后在指纹采集窗里采集指纹,寄存柜将指纹数据与先前记录下的进行比对,正确后才会打开该箱供使用者取物(同时机器会自动记录当时的时间、指纹以备查询)


  本次设计的流程图如图4.1.软件模拟程序为,首先先检测所有的空箱数目,然后根据按键判断状态是要存包还是取包,如果是取包的话,就输入密码,然后将包存入箱柜内,然后关门,系统检测是否关门,如果是的话则进行下一步,否则提示未关门。如果是取包的时候,输入密码后,验证密码的正确与否,正确的话就看箱柜是否关门,否则提示箱柜未关门。

1.024.jpg


图4.1 主程序流程图

4.2  系统软件各部分设计421键输入程序设计

键盘采用扫描工作方式,输入程序功能有以下4个方面:

(1)判断键盘上有无键闭合,其方法为扫描口PA0~7输出全“0”,读PC口的状态,若PC0~3为全“1”(键盘上行线全为高电平)则键盘上没有闭合键若PC0~3不全为“1”,则有键处于闭合状态。

(2)去除键的机械抖动,其方法为判断出键盘上有键闭合后,延迟一段时间再判别键盘的状态,若仍有键闭合,则认为键上有一个键处于稳定的闭合期,否则认为是键的抖动。

PA7

PA6

PA5

PA4

PA3

PA2

PA1

PA0

1

1

1

1

1

1

1

0

1

1

1

1

1

1

0

1

……

……

……

……

……

……

……

……

0

1

1

1

1

1

1

1

(3)判别键闭合的键号,方法对键盘的列线进行扫描,扫描口PA0~7依次

表4.1   按键图

输出:

相应的依次读PC口的状态,若PC0~3为全“1”则列线为“0”的这一列上没有键闭合。闭合键的键号等于为低电平的列号加上为低电平的行的首键号。

(4)使CPU对键的一次闭合仅做一次处理,采用的方法为等待闭合键释放后在作处理。流程图见4.2

4.2.2  驱动电路程序设计

    继电器板负责自动存包柜的开箱控制,利用红外线检测箱内是否有物体,并将状态信息上传到主机板,做为下一次分配箱时的依据。继电器接受主机板下达的命令,根据主机指令的箱号,驱动相应的继电器开门,同时检测门限位开关的信号,确定门是否开启。流程图见图4.3

1.025.jpg

图4.2 键盘输入子程序流程图

第5章 系统调试5.1  系统硬件调试

自动存包柜电路包括四大部分:指纹输入部分,箱柜部分,显示部分已经单片机部分,将他们在一张板上放好,然后通过设计出来的原理图对这四个部分依次的焊接,使其成功的出现在同一张板上。如图5.1


1.027.jpg

图5.2 连线图

1、首先是焊接的顺序问题当初板子做好以后,我一口气就把所有的元件焊上去了,这样对于没有调试过的板子,就很难找到原因。所以焊接的顺序很重要,应该是应该按功能划分的器件进行焊接,顺序是功能部件的焊接--调试(OK)--另一功能部件的焊接,这样容易找到问题的所在。

2、如果在调试按功能划分的器件上出现问题,可以按以下步骤进行:
1)检查原理图连接是否正确
2)检查原理图与PCB图是否一致
3)检查原理图与器件的DATASHEET上引脚是否一致
4)用万用表检查是否有虚焊,引脚短路现象
5)查询器件的DATASHEET,分析一下时序是否一致,同时分析一下命令字是否正确(注意,命令字的顺序很重要,前些日子调试INTEL e28F640这款flash是的时候,在对其擦除和写操作的时候,就碰到了这样的问题)
6)有条件的可以用示波器。如我就是通过示波器对SRAM各个引脚进行检查,发现地址线都是有信号的,而数据线无信号出现,才找到问题所在。
7)飞线。用别的的口线进行控制,看看能不能对其进行正常操作,多试验,才能找到问题出现在什么地方。

5.2  系统软件调试

第一步:建立工程项目文件

双击桌面软件快捷图标

第二步:建立源文件

在界面中打开文件下拉菜单,在打开的选项中点“新建”,产生一个新建空白文件。在新建空白文件中输入源程序文件

1.028.jpg

图5.3  程序软件图

在确认源程序无错时点保存,这时界面上弹出提示“另存为”菜单,选择好保存路径,也就是刚才保存建立工程项目文件的目录路径,输入文件名,如y2.asm(要有后缀,汇编程序是*.asm),然后点击保存。

这时仅仅是完成了汇编程序的建立而已,但y2.asm汇编程序与y2.Uv2工程项目文件现在还没建立任何关系,此时应把y2.asm源程序文件添加到y2.Uv2工程中,构成一个完整的工程项目。

第三步:将源程序文件添加到工程项目中

在左侧Project Windows窗口内右击  Source Group1,在弹出下拉菜单中选种 Add Files to Group‘Source Group1’(向工程中添加源文件)命令,

在弹出的菜单栏中点文件类型一栏下拉菜单,选Asm Source Files(*.a*:*.src:*.a*)即(汇编程序),文件框中选择将刚才创建的源程序文件y2.asm然后点Add,这时在文件名框后出现刚才选中y2.asm文件,在点击CLOSE完成源程序文件向工程项目的添加。


第四步:为添加到工程项目的程序文件进行编译和链接

在界面上点工程(Project)选项,在下拉菜单中选择(Options For Target ‘Target ‘),命令为目标设置工具选项。

在“目标”(Target)选项卡片外代码内存,片外Xdata内存都为空白。  在“输出”选项卡中选择创建HEX文件。在“C51”选项卡上勾选中断向量在0X0000。

在“调试”(Debug)选项卡选择使用模拟仿真,对于汇编程序不需要勾选运行到,然后点确定其余选项卡内容则不需要改变设置。在打开工程(Project)下拉菜单,选择创建目标(Build target)点击左键。此时会出现“编译正确”,无错误,无警告提示。

(如果在建立工程项目在提示’Y’或’N’时,选中了‘Y’,在创建目标时时就会出现如下3个警告提示,但不影响影响程序运行)。

1.029.jpg

图5.4  系统面板

接下来选择重建全部目标文件(Rebuild all target files)命令,对项目工程文件进行重新编译,链接,此后会出现提示,“编译正确,链接成功”,提示。(如果在前边建立工程项目在提示’Y’或’N’时,选中了‘Y’,在创建目标时时就会出现如下3个警告提示,但不影响程序运行。也可以省去上一步“创建目标”,直接运行这一步即可)。

接下来打开调试下拉菜单,选择Start/Step Debug Session Crtl+F5,进行调试,也就是将程序下载到仿真器里,然后可以进行运行程序。

运行程序有全速运行,单步跟踪运行,单步运行,执行返回。在这里选用单步运行命令运行程序,每执行一次此命令,是以语句为基本执行单元,但指令用黄色箭头标出,每执行一步箭头都会移动,执行过的指令呈现绿色。

在右下角内存视窗输入的D:0X0050可以看到50H~59H单元被写入的数据,同时左侧。

Project Windows窗口内可以看到相关寄存器的变化。

选择调试下拉菜单可以点Start/Step Debug Session Crtl+F5则停止调试。


5.3  系统联合调试

1. 开启箱柜,插上电源,提示空余的箱柜为4个

1.030.jpg

图5.5  开启系统

2. 按下存包键,提示要求输入指纹

1.031.jpg

图5.6  请输入指纹

3. 输入一次指纹后提醒再次输入,确认指纹信号

1.032.jpg

图5.7   再次输入

4.两次输入正确后会打开一个箱柜,并提示随手关门

1.033.jpg

图5.8  箱柜开启

5.关门后显示剩余箱柜

1.034.jpg

图5.9  剩余箱柜数

6.取包时按下取包键提示输入指纹

7.指纹输入正确后打开箱柜,并提示随手关门

1.035.jpg

图5.10  请随手关门

8.关门后显示剩余的空箱数,然后重复上述的步骤。


总 结

在大学的学习过程中,毕业设计是一个重要的环节,是我们步入社会参与实际项目的规划建设的一次极好的演示.毕业设计是四年学习的总结和提高,和做科研开发工作一样,要有严谨求实的科学态度。毕业设计有一定的学术价值和实用价值,能反映出作者所具有的专业基础知识和分析解决问题的能力。此次毕业设计是我们从大学毕业生走向未来工作重要的一步。从最初的选题,开题到分析制作直到完成设计。其间,查找资料,老师指导,与同学交流,反复修改方案,每一个过程都是对自己能力的一次检验和充实。在毕业设计期间,尽可能多的阅读文献资料是很重要的,一方面是为毕业设计做技术准备,另一方面是学习做毕业设计的方法。一次优秀的设计对启发我们的思维,掌握设计的规范、流程、具体操作都很有帮助。

我设计的是自动存包系统,我的设计方案是采用AT89S52单片机做控制器,可以同时管理四个存包柜。柜门锁是由继电器控制,当顾客需要存包的时候,可以自行到存包柜前按“开门”键,需要顾客向光学指纹识别系统输入个指纹,然后通过继电器进行开门(用亮灯表示),顾客即可存包,并需将柜门关上。当顾客需要取包时,要将只要将之前输入的指纹放置于指纹识别器前方,指纹识别器采集到指纹信息输出相应的高低电平信号传给单片机,系统比较密码一致后,发出开箱信号至继电器将柜门打开,顾客即可将包取出。

我觉得我设计的这个课题,优点在于比现在市面上的存包系统更加的实用,更加的方便,而我觉得能够改进的地方是指纹识别系统的辨识度,精确度。

在本次毕业设计也暴露出自己专业基础的很多不足之处。比如缺乏综合应用专业知识的能力,对材料的不了解,对具体设计涉及到的规范要求的不熟悉等等,需要在做的过程中需要去不断的翻阅相关的资料和书籍,这降低了自己的速度和设计的进程,但这个过程对我来说是对自己知识的不足处的一个很好的补充和对已学过知识的一个巩固。这个过程虽然是有一定的难度但还是通过自己的慢慢的摸索和老师的指导下从熟悉到上手,经过这次努力对自己的信心很好的提高。通过这样的一个自己从开始到结束全程自己参与的设计来说对知识的了解和掌握是纯理论的学习远远达不到的效果。这次实践是对自己大学四年所学的一次大检阅,使我明白自己知识还很浅薄,虽然马上要毕业了,但是自己的求学之路还很长,以后更应该在工作中学习,努力使自己 成为一个可以参与工作能独立完成设计的人。

这次毕业设计我做的基于单片机的自动存包系统。首先查找了很多的资料,对于各类的文献进行收集,然后用了一个星期对总的资料进行整理和删选,选择对自己设计有用的资料汇编成册作为后期设计的辅助资料参考和借鉴。接下来的几个星期指导老师给了我们具体的要求与任务,并指导我们具体的设计工作流程。通过对前期详细的分析使自己蛮快的有了自己设计的思路,规划设计出了自己的方案,然后和老师的交流进行改进自己的设计方案和设计的不足。通过几轮的修改以及老师的交流使自己慢慢的完善自己的设计方案。接下去的几周是对原理图的设计,设计上还是比较轻松,掌握起来比较自如。然后就是购买所需的零件,对照总图进行焊接,应进行调试。最后一周是对整个设计的总结。通过这规划也让自己明白了以前做的设计过于理想化,在设计过程中对现状和现实的根据太少,很多都是按照自己的理想去做,而实际的设计更多的是从现状和现实出发 使规划更合理、更实用、更有发展。

整个毕业设计期间,指导教师认真严格的要求我们,我们因为是独立的完成一个设计,需要老师的指导,我们认真的听取老师的意见,同时也发表自己对方案的见解,每一个星期我与指导老师都会见一次面,这样我们可以很好的交换意见,更好的完善方案。我们严格按照学校的有关规定执行,对毕业设计内容及工作量进行讨论并确定,指导来时非常并注重对我解决实际工作问题的能力、独立查阅文献能力、计算机及软件应用能力等的培养。指导王老师平时加强毕业设计的辅导,我们还可随时找老师进行答疑,老师为方便我们联系,把电话号码和Email地址留给了我们,如果有什么事就可以及时得到解决,这样问题不致堆积、也不会因此拖了进度。在毕业设计期间,如果没有老师的细心指导,而是自己一个人独自做设计,也不与任何人交流,这是完全不行的,设计其实也是一个团队的工作,如果不能与他人进行良好的沟通与交流,做出的设计也只是只有自己一个人会欣赏,而别人却不一定会认可你的设计,所以在这次毕业设计过程中,我懂得了一个道理,团结得力量,只有更好得与他人,进行沟通与交流,吸取别人的建议,工作才会更加的顺利。

我们全部学生对毕业设计都是十分重视的,也不会因为有要找工作而拖延进度的,老师对我能认真对待毕业设计的态度也较满意。设计期间,我们自觉独立进行设计,有问题时学生之间会进行讨论、争论,师生之间也常进行研讨,通过这种方式,我们觉得收获很大。我们经常能够主动走进图书馆查阅有关资料,与其他同学进行资料的讨论。我通过毕业设计,普遍感到自己应用基础知识及专业知识解决问题的能力有了很大的提高,以前所学的许多课程觉得很零散,也不知道有什么用及怎么用,现在也都找到了用武之地。今后走上社会,我主要还是靠在学校学到的只是技能来养活自己,并回报社会,回报父母,所以通过这次的毕业设计,我也了解到了自己的很多不足,在今后的工作与学习中,我会不断的提高与改进。

通过这次毕业设计我收获良多,获得了许多珍贵的知识,学到了在许多书本上不可能收录的东西。

参考文献
[1]李群芳,张士军,黄建. 单片微型计算机与接口技术. 北京:电子工业出版社,2010.11
[2]高峰. 单片微机应用系统设计及实用技术. 北京:机械工业出版社,2004
[3]韦元华,舟子. 条形码技术与应用. 北京:中国纺织出版社,2003.6
[4]薛文达,谢文和. 传感器应用技术. 江苏:东南大学出版社,1998
[5]张成海,张佚. 现代自动识别技术与应用. 北京:清华大学出版社,2002
[6] 张毅刚,姜守达. 新编MCS-51单片机应用设计. 哈尔滨:哈尔滨工业大学出版社,2003.7
[7]何立民,MCS—51系列单片机应用系统设计.北京:航空航天大学出版社,1989.4
[8]阎石. 数字电子技术. 吉林:高等教育出版社出版,2000
[9]胡荣等. Protel电路设计教程.北京:清华大学出版社,2001
[10]Adel S.Sedra and Kenneth.Smith[M]:Microelectronic Circuits,4rd ed,Oxford University Press.Inc,1998.20~58.
[11] 赵亮. 单片机应用系统设计与产品开发[M]. 北京:人民邮电出版社.2004
[12] 李华. MCS-51系列单片机实用接口技术. 北京航空航天大学出版社. 1993
[13] 彭为,黄科,雷道仲.单片机典型系统设计实例精讲[M].电子工业出版社,2006.
[14] 张友德.单片微型机原理、应用于实验[M].3版.上海:复旦大学出版社,2000.
[15] 黄根春,陈小桥,张望先.电子设计教程[M].北京:电子工业出版社,2007.
[17] INTEGRATED CIRCUITS DATA HANDBOOK 80C51-based 8-bit microcontrollers PHILIPS,1992
[18] Adel S.Sedra,Kenneth C.Smith:Microelectronics Circuits,3rd Edition,Holt Rinehart and Winston,Inc.,1991
[19] Yeager Brent.How to troubleshoot your electronic scale[J].. Powder and Bulk Engineering. 1995
[20]Meehan Joanne,Muir Lindsey.SCM in Merseyside SMEs:Benefits and barriers[J].. TQM Journal. 2008




致 谢

值此论文完成之际,首先感谢我的指导老师王玉杰老师在论文完成过程中给予我的帮助和鼓励。

在毕业设计过程中我学到了许多知识,其中认真严谨,实事求是,坚持不懈是我在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,会对我未来的学习和工作有很大的帮助。也为将来的人生之路做好了一个很好的铺垫。

当我初涉设计时,各种问题层出不穷,后来就慢慢的进入了状态,思路也逐渐的清晰了,历经了几个月的奋战,紧张而又充实的毕业设计终于落下了帷幕。回想这段日子的经历和感受,我感慨万千,在这次毕业设计的过程中,我拥有了无数难忘的回忆和收获。

最后再次对所有帮助过我的老师和同学表示感谢。



附 录

附录1


单片机源程序如下:


  1. #include"Finger.h"
  2. #include"OLED.h"

  3. unsigned char Door_State[4]={0};//4个箱门的存储情况
  4. unsigned char Door_NUM;
  5. unsigned char   R_Count;//串口接收数据的个数
  6. unsigned char xdata UART_BUFF[MAX_NUMBER+1]={0};
  7. bit Rec_Flag;                                          //串口数据标志位
  8. unsigned char               SaveNumber=0,searchnum=0;
  9. unsigned char   SearchNumber=0;
  10. unsigned int                clk0=0;
  11. unsigned char              modeflag = 0;
  12. //默认为识别模式
  13. //如果为1为录入指纹模式,每录入一次SaveNumber++
  14. unsigned char strnum[4]={0};

  15. unsigned char                             FifoNumber=0;
  16. unsigned char xdata  FIFO[MAX_NUMBER+1]={0};
  17. //////////////////////////////////////常用指令定义/////////////////////////////

  18. //Verify  Password   :验证设备握手口令
  19. unsigned char code VPWD[]=
  20. {16,0x01,              0,7,              0x13,              0x00,0x00,0x00,0x00,              0x00,0x1B};//回送12个            

  21. //设置设备握手口令
  22. unsigned char code STWD[]=
  23. {16,0x01,              0,7,              0x12,              0x00,0x00,0x00,0x00,              0x00,0x1A};//回送12个            

  24. //GetImage           :探测手指并从传感器上读入图像
  25. unsigned char code GIMG[]=
  26. {12,0x01,              0,3,              0x01,              0x00,0x05};                            //回送12个

  27. //Gen Templet1        :根据原始图像生成指纹特征1
  28. unsigned char code GENT1[]=
  29. {13,0x01,              0,4,              0x02,              1,              0x00,0x08};              //回送12个

  30. //Gen Templet2        :根据原始图像生成指纹特征2
  31. unsigned char code GENT2[14]=
  32. {13,0x01,              0,4,              0x02,              2,              0x00,0x09}; //回送12个            

  33. //Merge Templet      ;将CharBufferA与CharBufferB中的特征文件合并生成模板,结果存于ModelBuffer。
  34. unsigned char code MERG[]=
  35. {12,0x01,              0,3,              0x05,              0x00,0x09};                            //回送12个            
  36.             
  37. //Search Finger      :以CharBufferA或CharBufferB中的特征文件搜索整个或部分指纹库
  38. unsigned char code SEAT[]=//回送16个
  39. {17,0x01,   0,8,              0x04,              1,              0,0,    0,0x65,  0x00,0x73};            

  40. //Store Templet      :将ModelBuffer中的文件储存到flash指纹库中
  41. unsigned char code STOR[]= //回送12个
  42. {15,0x01,              0,6,              0x06,              2,              0x00,0x00,              0x00,0x0F};

  43. //DEL one templet
  44. unsigned char code DELE_One[]=
  45. {16,0x01,   0,7,  0x0C,    0x00,0x00,              0,1,              0x00,0x15};

  46. //DEL templet      ;清空指纹库
  47. unsigned char code DELE_All[]=
  48. {12,0x01,              0,3,              0x0D,              0x00,0x11};

  49. void UARTTimer_Init(void)
  50. {
  51.               ET0=1;     //定时器0开中断
  52.               TL0=0x97;  //17ms的初值
  53.               TH0=0xBD;
  54.               //串口初始化
  55.               SCON=0x50;   //UART方式1:8位UART;   REN=1:允许接收
  56.               PCON=0x00;   //SMOD=0:波特率不加倍
  57.               TMOD=0x21;   //T1方式2,用于UART波特率
  58.               TH1=0xFD;
  59.               TL1=0xFD;   //UART波特率设置:9600
  60.               TR1=1;

  61.               TR0=1;// 开定时器0
  62.             
  63.               IT0=0;//中断0低电平中断
  64.               IT1=1;//中断1低电平中断
  65.               EX0=1;//开中断0
  66.               EX1=1;//开中断1
  67.               EA=1;
  68.               ES=1;            
  69. }


  70. /**********************************
  71.                             串口单字节发送函数
  72. **********************************/
  73. void UART_SendByte(unsigned char send)
  74. {            
  75.               SBUF = send;
  76.               while( TI == 0 );                                                      
  77.               TI = 0;   
  78. }


  79. bit Command(unsigned char *p,unsigned char MaxTime) //命令解析,给模块发送一个命令
  80. {
  81.                 unsigned char count=0,i=0;
  82.                 unsigned char package=0,checksum=0;            
  83.               bit result=0;
  84.               Rec_Flag = 0;

  85.                 UART_SendByte(0xEF);
  86.                  UART_SendByte(0x01);//数据包头

  87.               UART_SendByte(0xFF);
  88.                  UART_SendByte(0xFF);
  89.               UART_SendByte(0xFF);
  90.                  UART_SendByte(0xFF);//芯片地址

  91.                 for (i=0; i<p[0]-6;i++) sent="" command="" string
  92.                 {
  93.                   UART_SendByte(p[i+1]);//将数据发送出去
  94.               }

  95.                 result=TURE;//发送完成,结果为真 (真为1)               
  96.                 FifoNumber=0;
  97.                 for (i=MAX_NUMBER+1; i!=0; i--)//清空所有FIFO[]数组里面的内容,写入0X00
  98.               {
  99.                 FIFO[i-1]=0x00;
  100.               }               
  101.             
  102.                 if (result)  
  103.                  {                           
  104.                    result=FALSE;
  105.                      clk0=0;              //清零CL0计数
  106.                            
  107.                      do /////////////////////////////do的内容////////////////////////////////
  108.                             {
  109.                                           if(Rec_Flag == 1)
  110.                                           {
  111.                                                         Rec_Flag = 0;
  112.                                                       
  113.                                                         if(UART_BUFF[0]==0xEF)
  114.                                                         if(UART_BUFF[1]==0x01)
  115.                                                         {
  116.                                                                       count = R_Count;
  117.                                                                       for(i=0;i<count;i++)
  118.                                                                                     FIFO[i]=UART_BUFF[i];

  119.                                                                       for(i=6;i<count-2;i++)
  120.                                                                                     checksum +=              FIFO[i];//计算校验和
  121.                                                                       package=FIFO[8];//计算包长度 FIFO[7]*256+FIFO[8];

  122.                                                                       if(count == package+9 && checksum==FIFO[count-1])
  123.                                                                       {
  124.                                                                                     result=TURE;                                                                                                  
  125.                                                                       }
  126.                                                                       else
  127.                                                                                     result=FALSE;//校验失败,置结果标志为0            
  128.                                                                       break;                                         
  129.                                                         }
  130.                                           }
  131.           }
  132. /////////////////////////////do的内容----------------结束////////////////////////////////  
  133.                             while (clk0<=MaxTime); //由定时器以及最大接收数据来控制,保证不会在此一直循环
  134.                              
  135.         FifoNumber=count;              //保存接收到的数据个数
  136.               }
  137.               return (result);
  138. }

  139. bit VefPSW(void)//验证设备握手口令,成功返回1   
  140. {
  141.               unsigned char  count=0;
  142.               while (1)
  143.                  {
  144.                    if(Command(VPWD,20)==TURE && FifoNumber==12 && FIFO[9] == 0x00)
  145.                             {
  146.                                           return (1) ;
  147.                             }            
  148.                    count++;
  149.                                  if (count>=2)//如果不成功,再验证一次,如果两次不成功,返回失败
  150.                   {
  151.                       return(0);  
  152.                             }
  153.               }
  154. }


  155. void Clear_All(void) //清空所有指纹信息,清空前首先验证和指纹模块通讯是否正常
  156. {
  157.               if( VefPSW() == 1 )      //验证成功
  158.               {                                         
  159.                   Command(DELE_All,50); //清空指纹库               
  160.               }
  161. }
  162. void Clear_One(unsigned char PageID)
  163. {
  164.               unsigned char m;
  165.               if( VefPSW() == 1 )      //验证成功
  166.               {                           
  167.                             for(m=0; m<11; m++)
  168.                                           FIFO[m] = DELE_One[m];// {16,0x01, 0,7,  0x0C,    0x00,0x00,              0,0,              0x00,0x14};
  169.                             FIFO[6]=PageID;           //把指纹模板存放的PAGE_ID也就是FLASH的位置
  170.                             FIFO[10]=FIFO[10]+PageID;              //校验和
  171.                             Command(FIFO,50); //清空指纹库               
  172.               }            
  173. }
  174. unsigned char ImgProcess(unsigned char BUFID)  //发获取图像并生成特征文件,存入BUFID中//输入参数为缓冲区号
  175. {            
  176.     if(Command(GIMG,89) && (FifoNumber==12) && (FIFO[9]==0x00))
  177.     {
  178.                             if(BUFID==1)     
  179.                             {                                                         
  180.                                   if(Command(GENT1,60) && (FifoNumber==12) && (FIFO[9]==0x00))
  181.                       {                                                                                                
  182.                                                         return 1;
  183.                                           }
  184.                             }
  185.                             else if(BUFID==2)
  186.                             {
  187.                                             if(Command(GENT2,60) && (FifoNumber==12) && (FIFO[9]==0x00))
  188.                       {                                                      
  189.                                                         return 1;
  190.                                           }                                          
  191.                             }
  192.                             else
  193.                             {
  194.                               ;
  195.                             }
  196.     }

  197.     return 0;                     
  198. }

  199. bit Searchfinger(void)//搜索指纹(发送搜索命令、以及根据返回值确定是否存在)      
  200. {                           
  201.                  if(Command(SEAT,60) && (FifoNumber==16) && (FIFO[9]==0x00) )
  202.     {
  203.                             SearchNumber=FIFO[11];//搜索到的页码
  204.                             //MatchScore=FIFO[12]*0x100+FIFO[13]   可以在此计算得分,从而进行安全级别设定,本程序忽略
  205.                                return 1;
  206.               }   
  207.     else            
  208.     {
  209.                      return 0;
  210.     }
  211. }


  212. unsigned char search(void)//搜索用户
  213. {
  214.               unsigned char SearchBuf=0,i=0;
  215.                 while (i<20)
  216.     {
  217.                    if ( ImgProcess(1)==1 ) //首先读入一次指纹 这里表示有指纹按在上面了
  218.                      {
  219.                                    SearchBuf=Searchfinger();//进行指纹比对,如果搜索到,返回搜索到的指纹序号
  220.                                    if(SearchBuf==1)
  221.                                    {
  222.                                                  return SearchNumber;
  223.                                    }
  224.                                    else
  225.                                           {
  226.                                                         return 255; //由于只有162个指纹,如果返回255,表示这个指纹识别失败
  227.                                           }   
  228.                      }
  229.                             i++;            
  230.     }
  231.    return 0;
  232. }

  233. bit savefingure(unsigned char ID)//保存指纹
  234. {
  235.               unsigned char i=0;
  236.               //现在开始进行存储指纹模板的操作
  237.             
  238.               for (i=0;i<10;i++)              //保存指纹信息
  239.               {
  240.                             FIFO[i]=STOR[i];//{15,0x01,              0,6,              0x06,              2,              0x00,0x00,              0x00,0x0F};
  241.               }
  242.               FIFO[7]=ID;           //把指纹模板存放的PAGE_ID也就是FLASH的位置
  243.               FIFO[9]=FIFO[9]+ID;              //校验和
  244.               if (Command(FIFO,70)==1)//不成功返回0              //此处进行存放指纹模板的命
  245.               {
  246.                             return(1);
  247.               }

  248.               return (0) ; //不成功返回0
  249. }



  250. unsigned char enroll(void) //采集两次指纹,生成1个 指纹模板
  251. {
  252.               unsigned char temp=0,count=0;

  253.               Delay_ms(30);
  254.                 OLED_16x16_hanzi(0,3,"   请录入指纹   ");

  255.               while(1)
  256.                 {
  257.                               temp=ImgProcess(1); //生成特征1   
  258.                                if ( temp == 1 )//生成特征文件成功            
  259.                     {               
  260.                                           OLED_16x16_hanzi(0,3," 第一次录入成功 ");                                 
  261.                       break;
  262.                      }
  263.                    else                  
  264.                      {
  265.                       if ( temp == 0 )//采集指纹没有成功
  266.                         {
  267.                                                         count++;
  268.                           if (count>=40)//如果采集了40次,还不成功,直接采集失败,直接退出enroll函数----返回0
  269.                                                                       return(0);
  270.             }
  271.         }
  272.                  }

  273.                  count=0;
  274.               SPK_CallTimes(1);
  275.               Delay_ms(2000);//延时2S开始采集下一个特征
  276.               OLED_16x16_hanzi(0,3," 请再次录入指纹 ");
  277.             
  278.               //开始采集第二个特征
  279.               while(1)
  280.                 {
  281.                                temp=ImgProcess(2); //生成特征2   
  282.                                if (temp==1)//生成特征文件2成功
  283.                     {
  284.                       if (  (Command(MERG,40)&& (FifoNumber==12) && (FIFO[9]==0x00))==0  ) //合并不成功返回0,成功返回1
  285.                                           {
  286.                                                         OLED_16x16_hanzi(0,3," 两次指纹不吻合 ");
  287.                                                         return(0);
  288.                                           }            
  289.                                           else//特征文件合并生成模板,结果存于ModelBuffer
  290.                                           {
  291.                                                         SPK_CallTimes(2);
  292.                                                         Delay_ms(2000);
  293.                                                         return 1;
  294.                                           }            
  295.         }
  296.                     else  //采集指纹没有成功   
  297.                      {            
  298.                                 count++;            
  299.                                           if (count>=25)
  300.                                           {
  301.                                                         return(0);
  302.                                           }                           
  303.                    }
  304.                  }
  305. }


  306. //**************延时子程序***************************
  307. void delayms(int ms)
  308. {     
  309.               unsigned char j;
  310.               while(ms--)
  311.               {
  312.               for(j =0;j<120;j++);
  313.               }
  314. }



  315. void Touch_Finger(void)
  316. {
  317.               unsigned char m=0;            
  318.               OLED_16x16_hanzi(0,3,"  正在握手......");
  319.               while(1)
  320.               {
  321.             
  322.                             if(VefPSW())//与模块握手通过,绿灯亮起。进入识别模式
  323.                             {
  324.                                           OLED_16x16_hanzi(0,3,"    握手成功    ");
  325.                                           SPK_CallTimes(1);
  326.                                           Delay_ms(3000);              //显示3秒握手状态
  327.                                           OLED_16x16_hanzi(0,0,"    欢迎使用    ");
  328.                                           OLED_16x16_hanzi(0,3,"                ");
  329.                                           break;
  330.                             }
  331.                   else if(m>10)//开始握手10次,如果没有一次成功,表示模块通信不正常。
  332.                             {
  333.                                           m = 10;
  334.                                           OLED_16x16_hanzi(0,3,"    握手失败    ");
  335.                                           OLED_16x16_hanzi(0,5," 请检查设备连接 ");
  336.                             }
  337.                             m++;
  338.               }
  339. }
  340. void SPK_CallTimes(unsigned char Ts)
  341. {
  342.               unsigned char m;
  343.               for(m=0; m<ts; m++)=""
  344.               {
  345.                             buzzer = ~buzzer;
  346.                             Delay_ms(100);            
  347.               }
  348.               buzzer = 1;
  349. }
  350. bit Key_Use(unsigned char keynum)
  351. {
  352.               if(keynum==1)
  353.                             if(Key1 == 0)return 1;
  354.               if(keynum==2)
  355.                             if(Key2 == 0)return 1;
  356.               if(keynum==3)
  357.                             if(Key3 == 0)return 1;
  358.               if(keynum==4)
  359.                             if(Key4 == 0)return 1;
  360.               return 0;
  361. }
  362. void  Timer0(void) interrupt 1//定时器0中断函数
  363. {
  364.               TL0=0x97;
  365.               TH0=0xBD;
  366.               clk0++;   //延时17ms
  367. }


  368. void int1(void) interrupt 2//中断0,清除所有指纹
  369. {
  370.               while(k2==0);//等待松手
  371.               modeflag = 2;            
  372. }
  373. ……………………

  374. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整论文下载(word格式 可编辑):
指纹存包柜.doc (3.11 MB, 下载次数: 140)

评分

参与人数 1黑币 +8 收起 理由
穿着安踏去拉萨 + 8 楼主真的很厉害!!!可是不太懂为什么很少.

查看全部评分

回复

使用道具 举报

ID:422243 发表于 2018-11-7 12:06 | 显示全部楼层
您好!请问有PCB图   和电路图  
回复

使用道具 举报

ID:507630 发表于 2019-4-9 11:04 | 显示全部楼层
楼主这个源程序用什么软件写的呢?
回复

使用道具 举报

ID:507630 发表于 2019-4-9 11:05 | 显示全部楼层
空箱检测怎么做的?
回复

使用道具 举报

ID:507630 发表于 2019-4-9 11:07 | 显示全部楼层
演示的时候可以先录入多个指纹再打开各自对应的箱子吗?
回复

使用道具 举报

ID:507820 发表于 2019-4-9 14:06 | 显示全部楼层
感谢楼主提供宝贵的资料
回复

使用道具 举报

ID:507630 发表于 2019-4-11 11:51 | 显示全部楼层
冯少 发表于 2018-11-7 12:06
您好!请问有PCB图   和电路图

只有一个word文档
回复

使用道具 举报

ID:507630 发表于 2019-4-16 12:29 | 显示全部楼层
楼主还在吗?请问您的源程序里面用到的finger.h和oled.h的头文件有吗?可以发下吗?
回复

使用道具 举报

ID:59884 发表于 2019-4-16 16:29 | 显示全部楼层
谢谢楼主分享!
回复

使用道具 举报

ID:375715 发表于 2019-4-26 22:25 来自手机 | 显示全部楼层
挺好的
回复

使用道具 举报

ID:891841 发表于 2021-4-20 16:22 来自手机 | 显示全部楼层
szz000 发表于 2019-4-16 12:29
楼主还在吗?请问您的源程序里面用到的finger.h和oled.h的头文件有吗?可以发下吗?

请问您有这两个头文件了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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