基于单片机指纹识别系统的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机指纹识别系统的设计
任务书
课程设计题目:指纹识别
功能简述:
1)根据所学的知识和能力,设计程序可以实现根据指纹的大小、形状等特征,识别出不同的指纹。

2)利用按键标志当前指纹识别的状态,例如录入状态,识别状态,清楚状态;利用液晶1602能够显示当前指纹识别的状态信息。

3)利用继电器,对当前信息的判断,例如提醒当前指纹识别错误;利用蜂鸣器和LED等提醒当前指纹识别是否正确
目录
第一章绪论…………………………………………………….. 1.1、指纹识别中的基本概念…………………………………
1.2 指纹识别的发展前景………………………………………
1.3、指纹识别课题设计的内容与意义……………………….. 第二章方案选择………………………………………………
2.1 系统原理图设计……………………………………………
2.2方案说明………………………………………………………
2.3 方案比较……………………………………………………
2.4 方案选择………………………………………………………第三章硬件设计………………………………………………3.1 AT89C52单片机设计………………………………………
3.2 电源电路设计………………………………………………
3.3 按键控制部分电路…………………………………………
3.4 LED指示灯电路…………………………………………3.5 蜂鸣器电路………………………………………………3.6 指纹传感器模块…………………………………………
第四章软件程序设计………………………………………….
4.1程序流程图…………………………………………………4.2程序…………………………………………………………. 第五章调试……………………………………………………
5.1硬件调试…………………………………………………….
5.2软件调试……………………………………………………
摘要
随着时代的发展,社会越来越需要高效、可靠的身份识别系统传统的个人身份鉴别手段如钥匙、口令、密码、身份证件,甚至IC卡等识别方式,由于它们具有可假冒、可伪造、可盗用、可破译的弱点,已不能完全满足现代社会经济活动和社会安全防范的需要。

随着识别技术的不断成熟和计算机技术的飞速发展,各种基于人体生理特征的身份识别系统如:指纹、手掌、声音、视网膜、瞳孔和面纹等识别技术纷纷从实验室中走出来。

目前,从实用的角度看,指纹识别技术是优于其它生物识别技术的身份鉴别方法。

本次设计我们利用指纹识别传感器进行指纹采集与识别,在单片机中对指纹进行处理,用按键标志当前指纹识别的状态,录入状态,识别状态,清除状态,用液晶1602能够显示当前指纹识别的状态信息;用继电器对当前信息进行判断,例如提醒当前指纹识别错误;利用蜂鸣器和LED等提醒当前指纹识别是否正确
关键词:指纹识别;单片机;指纹识别传感器;液晶1602;继电器
第一章绪论
进入21世纪后,由于国际反恐、互联网应用等因素的推动,在全球范围内,指纹识别技术得到了更加广泛的应用,指纹识别市场进入高速发展阶段。

利用人的生理特征,例如像指纹等来识别个人的身份,将成为今后几年IT产业的重要革新。

指纹在所有的生物特征中,相对稳定、不随年龄而变化和采集较为便捷,同时它的研究历史最长、相对更为成熟。

与现有的智能卡、身份证号码和密码的身份识别系统相比,指纹识别的性价比最高,也更适于应用到大众生活中。

因此指纹识别以其革命性的便捷和安全性成为一个理想的卓越的解决方案。

1.1、指纹识别中的基本概念
指纹识别是成熟的生物识别(Biometric)技术,由于人体的身体特征具有不可复制的特点,人们把目光转向了生物识别技术,希望可以籍此技术来应付现行系统安全所面临的的挑战。

要把人体的特证用于身份识别,这些特征必须具有唯一性和稳定性。

研究和经验表明,人的指纹、掌纹、面孔、发音、虹膜、视网膜、骨架等都具有唯一性和稳定性的特征,即每个人的这些特征都与别人不同、且终生不变,因此就可以据此识别出人的身份。

基于这些特征,人们发展了指纹识别、面部识别、发音识别等多种生物识别技术,目前许多技术都已经成熟并得以应用,其中的指纹识别技术更是生物识别技术的热点。

1.2 指纹识别的发展前景
指纹行业是一个新兴的行业,本身具有很高的科技含量,相对利润高发展前景广阔。

经专家预计,指纹产品将是未来IT产业新的增长点:利润率最高、发展潜力最大。

于是,世界顶尖的指纹识别技术得到了全球范围内的高度重视,指纹识别技术的应用如火如荼地迅速发展起来。

目前,国内已经有不少企业在参与指纹识别技术的开发和应用。

指纹技术在现代生活和工作中的应用已越来越普遍,例如:指纹考勤、指纹社保、指纹银行、指纹商场、指纹接送幼儿等等生活和工作的新现象已广为人知,指纹技术正在日益刷新着我们的现代化生活方式。

1.3、指纹识别课题设计的内容与意义
指纹识别技术相对于其他识别方法有许多独到之处,具有很高的实用性和可行性。

因此,指纹识别成为最流行、最方便、最可靠的身份认证方式,己经在社会生活的诸多方面得到广泛应用。

这是由于指纹是独一无二的,两人之间不存在着相同的指纹,指纹是独一无二的,两人之间不存在着相同的指纹,同时指纹样本易于采集,难以伪造,便于开发,实用性强,可以利用多个指纹构成多重口令,提高系统的安全性。

本文主要通过对MCS-51系列单片机的结构和功能进行分析,来研究基于单片机指纹识别系统的内部结构特点和功能阐述以及工作原理,更好的了解了指纹识别系统的未来前景。

第二章方案选择
2.1系统原理图设计
2.2方案说明
2.1.1方案一:摄像头采集、飞思卡尔单片机处理
这种方案由指纹图像采集、指纹图像预处理、指纹特征提取、指纹特征匹配、特征数据库等几部分组成。

指纹识别系统的原理框图如图1所示。

图2-1、指纹识别系统框图
该系统首先由数字摄像头ov6620采集指纹,并将指纹图像转化为数字图像;然后用16位的飞思卡尔X128单片机对指纹数字图像进行预处理,再通过图像增强、分割、平滑、细化等处理过程得到便于指纹特征提取的数字图像:接着提取细化后的图像细节特征点; 然后将指纹信息数据送入STC89C52单片机中,一块液晶1602与STC89C52单片机相连,液晶用于显示当前指纹采集系统的工作状态和经对比后指纹采集的信息是否正确,用一个蜂鸣器和LED指示灯指示当前采集的指纹信息正确。

当采集到的指纹信息正确,蜂鸣器发出响声并且LED 指示灯点亮。

2.1.2方案二指纹识别传感器
代替第一种方案中的摄像头和飞思卡尔单片机,我们利用一个指纹识别传感器来对指纹进行采集,识别以及部分处理,然后将信息输送到AT89C52单片机中,利用按键控制当前指纹识别的状态,用LED灯进行显示,即录入状态,识别状态,清除状态;利用液晶1602能够显示当前指纹识别的状态信息,即录入指纹的编号以及当前指纹;利用继电器,对当前信息的判断,例如提醒当前指纹识别错误;利用蜂鸣器提醒当前指纹识别是否正确,如果指纹录入正确,蜂鸣器发出响声。

2.3 方案比较
1)复杂性:方案一采取用数字摄像头ov6620采集指纹图像,然后用16位的飞思卡尔X128单片机进行图像处理,还要进行图像增强、分割、平滑、细化等处理过程才能得到便于指纹特征提取的数字图像;而这些过程在方案二中只用一个指纹传感器模块就可以代替,所以方案二设计简单。

2)准确性:方案一中所采集的摄像头分辨率有限,所以采集的指纹信息有一定的误差,方案二中指纹传感器模块是利用集成的光学头进行处理的,比较精确。

3)局限性:由于方案一中使用的飞思卡尔单片机处理程序比较复杂,超出了我们的学习范围,而方案二传感器就使程序简单化了。

2.4 方案选择
鉴于各种原因,我们最终选择第二种方案,使用指纹传感器模块来设计系统。

第三章硬件设计
3.1 AT89C52单片机设计
3.1.1 主要性能
有12k字节Flash闪速存储器,1024字节内部RAM,32个I/O口线,两个16位定时/计数器,5个中断向量,一个全双工串行通信口,片内振荡器及时钟电路。

3.1.2引脚结构图(如图3-1)
图3-1 AT89C52管脚图
3.1.3 一些端口的介绍:
P30口:RXD(串行输入口)
P31口:TXD(串行输出口)
XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。

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

3.1.4 单片机最小系统
1)外部晶振的设计
STC89C52的内部有一个用于构成振荡器的高增益反相放大器,通过XTAL1,ATAL2外部接上一片作为反馈元件的晶体,与C1和C2构成了并联谐振电路,使其构成自激振荡器,电容的值具有微调的作用,我们取30PF,具体的接法如图3-2外部晶振电路。

STC89C52的工作频率范围在 0-24MHZ。

我们选用的是11.0592MHZ的晶振,振荡周期约为1us机器周期约为0.1us,所以这个晶振可以满足这个系统的要求。

并且晶振不能离单片机太远,不然使用外部晶振进行软件调试时就会发现找不到信号。

2)复位电路的设计
MCS51单片机通常采用上电自动复位和按钮复位两种方式,本系统采用简单的自动复位电路如图2-2所示。

单片机在上电瞬间,RC电路充电,RST引脚端
出现正脉冲,只要RST端保持两个机器周期以上的高电平,就能使单片机有效复位。

其中电容选10uF、电容选10K。

1
2
22pF
C3
10uf
R1
10K
图3-3复位电路
3.2 电源电路设计
本系统采用的5V电源主要采用两种方法,第一是直接用9V电池然后通过一个变压电路,利用7805将转化成5V供单片机和液晶显示部分使用;其二是用220V通过变压器等将其转化成5V。

两种方法都可以,但是由于第一种方法便于携带、而且成本相对较低所以我们选用第一种方案。

图3-4 电源电路
3.3 按键控制部分电路
1)消除抖动
按键的闭合与否反应在电压上就是呈现出高电平或低电平,如果高电平表示断开,那么低电平则表示闭合,通过电平的高低状态的检测可确认键按下与否。

为了确保CPU对一次按键动作只确认一次,并且防止干扰信号的影响,必需加入消除电平抖动的措施,下图3-5为按键抖动示意图:
图3-5按键闭合及断开前后的电压
消除抖动通常有硬、软硬两种方法,硬件消除抖动可采取双稳态电路或滤波消抖电路;软件消抖是在第一次检测到有键按下时,执行一段延时程序再确认该键是否仍闭合,如果还是闭合状态则确认该键按下,从而消除抖动和干扰影响。

当按键较多时,我们多采用硬件件消抖法。

本系统中按键少直接采用直接接入的方式。

2)按键接口设计
按键接口设计有两种方法,独立式按键和矩阵式键盘。

独立式按键各键相独立,每个按键各接入一根输入线,只要检测输入线的电平就可以识别按键状态。

这种方法电路配置灵活,软件结构简单,但每个按键需占用一根输入口。

由于该设计方案IO资源浪费大。

故此方法只适用于按键少或其他控制功能很简单的场合。

由于本设计中的按键只有3个,考虑系统可靠性和键盘设计的简单所以采用独立式按键。

本系统的按键电路如图3-6所示:
图3-6独立按键电路
按键按下是呈低电平,我们采用软件消抖来减少对的单片机影响。

3.4 LED指示灯电路
图3-7 LED灯指示电路
当k2键按下时,录入模式指示灯red亮;当k1键按下时,识别模式指示灯green 亮。

3.5 蜂鸣器电路
图3-8蜂鸣器电路
3.6 指纹传感器模块
1)指纹模块电路如下所示:
图3-9指纹识别模块
指纹模块里面主要是DSP芯片,型号为PS1802,加上外面的CMOS芯片,CMOS 芯片主要是对指纹进行“照相”,生成指纹特征,如图3-8所示就是一个指纹模板,录入两次这样的指纹特征就能生成一个指纹模板。

具体的工作过程是:扫描指纹(录入图像)、生成特征、合成模板(建立一个指纹库文件,成功录入一个指纹)。

图 3-10 指纹模板
指纹模板就是“照一次相”,指纹模块里面的CMOS芯片采集一次指纹信息,然后进行模糊处理生成0和1两种记录信息,存入指纹模块的FLASH芯片里面。

当切换到识别模式的时候,指纹模块就会先让CMOS芯片采集一次指纹,然后和FLASH芯片的数据进行对比。

看是不是存在,如果存在就能返回是几号指纹。

这样我们就能通过单片机或者电脑进行指纹识别与登记了。

2)指纹传感器模块实物图
指纹模块型号是:FM-180,此模块上里面包含了:
1、光学头
2、通信连接线
3、DSP芯片(在模块里面)
4、稳压芯片
5、FLASH芯片
6、CMSO传感器(在模块里面)等部件组成。

1、光
2、通信连
3、DSP芯
图3-11指纹传感器模块实物图
第四章软件程序设计
该设计主要通过设定的3个按键来实现一定的功能,3个按键分别为模式切换(识别模式和录入指纹模式)、指纹录入、删除所有指纹。

4.1程序流程图
4.1.1程序主流程图
(1)指纹录入:先进行录入模式,然后按一下录入指纹,灯会闪烁,录入成功一次,蜂鸣器响一次,这时候拿开手指,1秒放入同一个手指,会再录入一次,如果两次都成功,就成功录入了一个指纹。

蜂鸣器会响两次,同时显示录入指纹成功。

如果不成功就会显示录入失败。

录入完成后,可以进入识别模式,或者接着录入下一个指纹。

录入完成,按一次指纹转换,进入指纹识别开锁模式。

单片机主程序流程设计:
4、稳压芯
5、FLASH
6、CMOS
4.2 系统关键代码
引脚使用:
sbit relay =P1^4; //继电器引脚
sbit buzzer=P1^5; //蜂鸣器引脚
sbit red= P2^7;//录入模式指示灯在板子靠近单片机处
sbit green= P2^0;//识别模式指示灯在板子远离单片机处
sbit k2=P3^4; //录入一次指纹
sbit k1=P3^3; //模式识别转换
sbit k3=P3^2; //清除所有指纹(10个指纹清除)
部分主函数代码:
void main(void)//主函数
{
unsigned char i=0;
ET0=1; //定时器0开中断
TL0=0x97; //17ms的初值
TH0=0xBD;
delay1ms(5);
LcdRw=0; //只对液晶进行写操作,不进行读操作
delay1ms(5);
LCD_Initial();//液晶初始化
delay1ms(5);
GotoXY(0,0);//x,y
Print(Identify);
//串口初始化
SCON=0x50; //UART方式1:8位UART; REN=1:允许接收 PCON=0x00; //SMOD=0:波特率不加倍
TMOD=0x21; //T1方式2,用于UART波特率
TH1=0xFD;
TL1=0xFD; //UART波特率设置:9600
TR1=1;
TR0=1;// 开定时器0
IT0=0;//中断0低电平中断
IT1=1;//中断1低电平中断
EX0=1;//开中断0
EX1=1;//开中断1
EA=1;
mode();//看当前是什么模式
for(i=0;i<6;i++)//开始握手6次,如果没有一次成功,表示模块通信不正常。

只要成功就跳出此循环
{
if(VefPSW())//与模块握手通过,绿灯亮起。

进入识别模式
{
green=0; //读一次
buzzer=0;
shownum(0);
delay1ms(300);
buzzer=1;
break;
}
else
{
red=1;
green=1;
break;
}
}
while(1)
{
if(k2==0)//录入一个指纹
{
delay1ms(10);
if(k2==0)//如果仍为低电平,表示按键有效
{
while(k2==0);//等待松手
if(VefPSW()==1&&modeflag==1&&SaveNumber<10)//与模块握手通过
{
if(enroll()==1)//采集两次,生成1个指纹模板成功
{
if(savefingure(SaveNumber+1)==1)//保存也成功
{
SaveNumber++;//加一次
shownum(SaveNumber);
}
}
}
else
{
buzzer=0;
for(i=0;i<8;i++)
{
delay1ms(100);
red=~red;
}
red=0;
buzzer=1;
}
}
}
if(modeflag==0)//为识别模式
{
searchnum=search();
if(searchnum>=1&&searchnum<=162)//最多是162个指纹
{
shownum(searchnum);
//蜂鸣器响一声
relay=0;
buzzer=0;
delay1ms(100);
buzzer=1;
for(i=0;i<20;i++)
{
delay1ms(150);
}
relay=1;
}
if(searchnum==255)//不正确的指纹蜂鸣器响三声
{
shownum(0);
buzzer=0;delay1ms(100); buzzer=1;delay1ms(100);
buzzer=0;delay1ms(100); buzzer=1;delay1ms(100);
buzzer=0;delay1ms(100); buzzer=1;delay1ms(100);
}
}
if(clearallflag==1)
{
clearallflag=0;
Clear_All();
red=0; //红色灯亮
green=1;
//蜂鸣器长响一次,表示清除所有指纹结束
modeflag=1;//进入录入指纹模式
GotoXY(0,0);//x,y
Print(Input);
shownum(0);
buzzer=0;
delay1ms(800);
buzzer=1;
SaveNumber=0;
}
if(changeflag==1)
{
mode();//显示当前模式
changeflag=0;
}
}/////////////while(1)结束////////////////////////////////
}
void int0(void) interrupt 0//中断0,清除所有指纹
{
if(k3==0) //清除所有指纹
{
delay1ms(10);
if(k3==0)//如果仍为低电平,表示按键有效
{
while(k3==0);//等待松手
clearallflag=1;
changeflag=1;
}
}
}
void Timer0(void) interrupt 1//定时器0中断函数
{
TL0=0x97;
TH0=0xBD;
clk0++; //延时17ms
}
void int1(void) interrupt 2//中断1,模式转换
{
if(k1==0)//模式转换其中用modeflag 来标志,默认从第1个指纹开始录入
{
delay1ms(10);
if(k1==0)//如果仍为低电平,表示按键有效
{
while(k1==0);//等待松手
modeflag=~modeflag;//0表示录入指纹 1表示识别指纹
changeflag=1;//模式发生了转换
}
}
}
第五章调试
完成了硬件的设计、制作和软件编程之后,要使系统能够按设计正常运行,必须进行硬件调试和软件调试。

5.1硬件调试
硬件调试的主要任务是排除硬件故障,其中包括设计错误和工艺性故障。

(1) 在电路的电源焊接一个电源指示灯,判断电路中通电是否正常。

(2)将电路中的电源线布置在通用板的四周,这样使用电源很方便,减少干扰,同时可以减少短路故障发生的可能。

(3)元器件合理布局,且尽量减少占用板子的面积,力争做到节俭。

特别是单片机的晶振尽量靠近单片机,减少干扰。

(4)液晶的焊接注意方向,且调节背光的电位器不可以少。

5.2软件调试
软件调试的任务是利用开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现硬件故障。

程序的调试应一个模块一个模块地进行,首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来总调。

联调需要注意的是,各程序模块间能否正确传递参数,特别要注意各子程序的现场保护与恢复。

本设计主要有:○1指纹识别传感器图像采集模块
○2单片机图像处理
○3按键模块和指示灯模块
○4指纹液晶显示和蜂鸣器、继电器模块
不断地对单片机下程序,观看调试结果。

参考文献
[1] 河桥,段清明,邱春玲.单片机原理及应用.北京:中国铁道出版社,2007.12
[2] 冯星奎,李林艳,颜祖泉.一种新的指纹图像细化算法.中国图像图形学报,1999, 4(10)835-838.
[3]吕凤军.数字图象处理编程入门一一做一个自己的Photoshop.北京:清华大学出版社,1999.
[4] 刘文星,王雄沂,母国光.纹线跟踪及其在细化指纹后处理中的应用.光电
子·傲光,2002,13 (2):184-187.
[5] 刘家锋,唐降龙,赵泉.一个基于特征点匹配的联机指纹鉴别系统.哈尔滨工业大学学报,2002.34 (1):132-136
[6] 简兵,庄镇泉等.基于脊线跟踪的指纹图细节提取算法.电路与系统学报,2001
[7] 刘旭,田捷.自动指纹识别算法在嵌入式系统的实现[ J].计算机工程与应用,2002.
[8] 周毅,等著.基于SPI协议的实现,计算机仿真.2003.
[9] 窦振中.单片机外围器件实用手册(存储器分册).北京:北京航空航天大学出版社,20O0
[10] 李华.MCS-51系列单片机实用接口技术.北京:北京航空航天大学出版社,1998
[11] 张培仁,孙占辉,张村峰.基于c语言编程MCS一51单片机原理与应用[M].北京:清华大学出版社,2003.
附件2 程序清单
#include <reg52.h>
#include <intrins.h>
#include"lcd1602.h"
sbit relay =P1^4; //继电器引脚
sbit buzzer=P1^5; //蜂鸣器引脚
sbit red= P2^7;//录入模式指示灯在板子靠近单片机处
sbit green= P2^0;//识别模式指示灯在板子远离单片机处
sbit k2=P3^4; //录入一次指纹
sbit k1=P3^3; //模式识别转换
sbit k3=P3^2; //清除所有指纹(10个指纹清除)
#define Max_User 10
#define error 2
unsigned char SaveNumber=0,searchnum=0;
unsigned int SearchNumber=0;
unsigned int clk0=0;
unsigned char str[3]={0,'\0','\0'};
unsigned char code Identify[16]="Lock: Idenfity";
unsigned char code Input[16] ="Lock: Input ";
bit modeflag=0,clearallflag=0,changeflag=0;//默认为识别模式
////////////////常用指令定义/////////////////////////////
//Verify Password :验证设备握手口令
unsigned char code VPWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b}; //回送12个
//设置设备握手口令
unsigned char code STWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a}; //回送12个
//GetImage :探测手指并从传感器上读入图像
unsigned char code GIMG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05}; //回送12个
//Gen Templet1 :根据原始图像生成指纹特征1
unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08}; //
回送12个
//Gen Templet2 :根据原始图像生成指纹特征2
unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //回
送12个
//Search Finger :以CharBufferA或CharBufferB中的特征文件搜索整
个或部分指纹库
unsigned char code SEAT[18]={17, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,8, 4,1,0,0, 0,0x65, 0x00,0x73}; //回送16个
//Merge Templet ;将CharBufferA与CharBufferB中的特征文件合并生
成模板,结果存于ModelBuffer。

unsigned char code MERG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,5 , 0x00,0x09};//回送12个
//Store Templet :将ModelBuffer中的文件储存到flash指纹库中unsigned char code STOR[16]={15, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,6,6,2, 0x00,0x00, 0x00,0x0f}; //回送12个
//Read Note
unsigned char code RDNT[14]={13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,4,0x19, 0, 0x00,0x1e};
//Clear Note
unsigned char code DENT[46]={45,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,36,0x18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00,0x3 d};
//DEL one templet
unsigned char code DELE_one[16]={16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,7, 0x0c, 0x00,0x00, 0,1, 0x00,0x15};
//DEL templet ;清空指纹库
unsigned char code DELE_all[12]={12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3, 0x0d,0x00,0x11};
////////常用指令定义-------结束//////////////////
/////////宏定义///////////////////
#define FALSE 0
#define TURE 1
//状态定义表
#define on 1
#define off 0
#define MAX_NUMBER 63
#define _Nop() _nop_()
////////////////宏定义------------结束///////////////////////
unsigned char FifoNumber=0;
xdata unsigned char FIFO[MAX_NUMBER+1]={0};
/*********1毫秒延时程序**********/
void delay1ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
void TxdByte(unsigned char dat)//串口发送信息,通过查询方式发送一个字

{
TI = 0; //让TI=0
SBUF = dat; //读入数据
while(!TI); //等待发送完毕
TI = 0; //清零
}
bit Command(unsigned char *p,unsigned char MaxTime) //命令解析,给模块发送一个命令
{
unsigned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;
bit result=0, start=0,stop=0;
TxdByte(0xef);//数据包包头识别码
TxdByte(0x01);//数据包包头识别码
i=*p; //数组的第“0”个元素、里面存放了本数组的长度,把这个长度给变量i,方便进行操作
p++;
p++;
for (count=i-1; count!=1;count--) //Sent command String {
temp=*p++;//取第个“1”个元素的内容,然后发送
TxdByte(temp);//将数据发送出去
}
result=TURE;//发送完成,结果为真 (真为1)
FifoNumber=0;
for (count=MAX_NUMBER+1; count!=0; count--)//清空所有FIFO[]数组里面的内容,写入0X00
FIFO[count-1]=0x00;
if (result)
{
result=FALSE;
start =FALSE;
stop =FALSE;
count=0;
clk0=0; //清零CL0计数
do //////////do的内容//////////////////////////////// {
restart0:
if (RI==1)//如果接收到数据
{
tmpdat=SBUF;//先把接收到的数据放到tmpdat中
RI=0;
if ((tmpdat==0xef)&&(start==FALSE))//这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节
{
count=0;
FIFO[0]=tmpdat;//读入第一个应答字节(0XEF),存
在第“0”个元素中
flag=1;
goto
restart0;//可以用中断方式进行
}
if(flag==1)//第一个字节已经回来,所以flag==1成立
{
if(tmpdat!=0x01) //接收数据错误,将重新从缓冲区接收数据
{
flag=0;//接收应答失败
result=FALSE;
start =FALSE;
stop=FALSE;
count=0;
goto
restart0;
}
//如果成功接收到0xef01,可以开始接收数据
flag=2;//flag=2;表示应答成功,可以开始接收数据了
count++;//现在count=1;
FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第“1”个元素中
start=TURE; //应答成功可以开始接收数据
goto
restart0;
}
if((flag==2)&&(start==TURE))//flag=2;表示应答成功,可以开始接收数据了
{
count++; //数据元素下标++
FIFO[count]=tmpdat;//存入数据
if(count>=6)
{
checksum=FIFO[count]+checksum; //计算校验和
}
if(count==8)
{
package=FIFO[7]*0X100+FIFO[8]; //计算包长度
stop= TURE;
}
if(stop)
{
if(count==package+8)
{
checksum=checksum-FIFO[count-1];
if(checksum!=FIFO[count]&0xff)
result=FALSE; //校验失败,置结果标志为0
else
result=TURE;
flag=0;
break;
}
}
}
}
}/////////////////////////////do的内容----------------结束////////////////////////////////
while ((clk0<=MaxTime)&&(count<=MAX_NUMBER)&& (changeflag==0) ); //由定时器以及最大接收数据来控制,保证不会在此一直循环
FifoNumber=count; //保存接收到的数据个数
}
return (result);
}
bit VefPSW(void)//验证设备握手口令,成功返回1
{
unsigned char count=0;
while (1)
{
if(Command(VPWD,20) && (FifoNumber==11) && (FIFO[9]==0x00)) return(1);
count++;
if (count>=2)//如果不成功,再验证一次,如果两次不成功,返回失败
{
return(0);
}
}
}
void Clear_All(void) //清空指纹库
{
delay1ms(200);
Command(DELE_all,50); //清空指纹库
}
unsigned char ImgProcess(unsigned char BUFID) //发获取图像并生成特征
文件,存入BUFID中//输入参数为缓冲区号
{
if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00))
{
if(BUFID==1)
{
if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00))
{
return 1;
}
else
{
return 0;
}
}
else if(BUFID==2)
{
if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00))
{
return 1;
}
else
{
return 0;
}
}
}
else
{
return 0;
}
return 0;
}
bit Searchfinger(void)//搜索指纹(发送搜索命令、以及根据返回值确定是否
存在)
{
if( Command(SEAT,60) && (FifoNumber==15) && (FIFO[9]==0x00) ) //
搜索到指纹
{
SearchNumber=FIFO[10]*0x100+FIFO[11];//搜索到的页码
//MatchScore=FIFO[12]*0x100+FIFO[13] 可以在此计算得分,从而进行安全级别设定,本程序忽略
return 1;
}
else
{
return 0;
}
}
unsigned char search(void)//搜索用户
{
unsigned char SearchBuf=0,i=0;
while (i<20)
{
if (ImgProcess(1)==1)//首先读入一次指纹
{
SearchBuf=Searchfinger();//进行指纹比对,如果搜索到,返回搜索到的指纹序号
if(SearchBuf==1)
{
return SearchNumber;
}
else
{
return 255;//表示搜索到的指纹不正确
}
}
i++;
}
return 0;
}
bit savefingure(unsigned char ID)//保存指纹
{
unsigned char i=0;
//现在开始进行存储指纹模板的操作
for (i=0;i<16;i++) //保存指纹信息
{
FIFO[i]=STOR[i];
}
FIFO[12]=ID; //把指纹模板存放的PAGE_ID也就是FLASH的位置
FIFO[14]=FIFO[14]+ID; //校验和
if (Command(FIFO,70)==1)//不成功返回0 //此处进行存放指纹模板的命
{return(1);}
else
{return(0);} //不成功返回0
}
unsigned char enroll(void) //采集两次指纹,生成1个指纹模板
{
unsigned char temp=0,count=0;
while(1)
{
temp=ImgProcess(1); //生成特征1
if (temp==1)//生成特征文件成功
{
break;
}
else
{
if (temp==0)//采集指纹没有成功
{
count++;
if (count>=40)//如果采集了40次,还不成功,直接采集失败,直接退出enroll函数----返回0
return(0);
}
}
}
//采集第一个特征成功
count=0;
buzzer=0;
delay1ms(100);
buzzer=1;
delay1ms(2000);//延时2S开始采集下一个特征
//开始采集第二个特征
while(1)
{
temp=ImgProcess(2); //生成特征2
if (temp==1)//生成特征文件2成功
{
if ( (Command(MERG,40)&& (FifoNumber==11) && (FIFO[9]==0x00))==0 ) //合并不成功返回0,成功返回1
{
return 0;
}
else//特征文件合并生成模板,结果存于ModelBuffer
{
buzzer=0;
delay1ms(100);
buzzer=1;
delay1ms(100);
buzzer=0;
delay1ms(100); //响两声,表示生成一个模板成功 buzzer=1;
return 1;
}
}
else
{
if (temp==1)//采集指纹没有成功
{
count++;
if (count>=25)
return(0);
}
}
}
}
void shownum(unsigned char dat)
{
unsigned char numdat=0;
numdat=dat;
GotoXY(0,1);//x,y
Print("Finger:");
GotoXY(0,8);//x,y
str[0]=0x30+numdat/10;
str[1]=0x30+numdat%10;
Print(str);
}
void mode(void)
{
if(modeflag==0)
{
GotoXY(0,0);//x,y
Print(Identify);
green=0;
red=1;
}
else
{
GotoXY(0,0);//x,y
Print(Input);
red=0;
green=1;
}
shownum(0);
}
void main(void)//主函数
{
unsigned char i=0;
ET0=1; //定时器0开中断
TL0=0x97; //17ms的初值
TH0=0xBD;
delay1ms(5);
LcdRw=0; //只对液晶进行写操作,不进行读操作
delay1ms(5);
LCD_Initial();//液晶初始化
delay1ms(5);
GotoXY(0,0);//x,y
Print(Identify);
//串口初始化
SCON=0x50; //UART方式1:8位UART; REN=1:允许接收 PCON=0x00; //SMOD=0:波特率不加倍
TMOD=0x21; //T1方式2,用于UART波特率
TH1=0xFD;
TL1=0xFD; //UART波特率设置:9600
TR1=1;
TR0=1;// 开定时器0
IT0=0;//中断0低电平中断
IT1=1;//中断1低电平中断
EX0=1;//开中断0
EX1=1;//开中断1
EA=1;
mode();//看当前是什么模式
for(i=0;i<6;i++)//开始握手6次,如果没有一次成功,表示模块通信不正常。

只要成功就跳出此循环
{
if(VefPSW())//与模块握手通过,绿灯亮起。

进入识别模式
{
green=0; //读一次
buzzer=0;
shownum(0);
delay1ms(300);
buzzer=1;
break;
}
else
{
red=1;
green=1;
break;
}
}
while(1)
{
if(k2==0)//录入一个指纹
{
delay1ms(10);
if(k2==0)//如果仍为低电平,表示按键有效
{
while(k2==0);//等待松手
if(VefPSW()==1&&modeflag==1&&SaveNumber<10)//与模块握手通过
{
if(enroll()==1)//采集两次,生成1个指纹模板成功
{
if(savefingure(SaveNumber+1)==1)//保存也成功
{
SaveNumber++;//加一次
shownum(SaveNumber);。

相关文档
最新文档