指纹识别模块单片机程序_第1页
指纹识别模块单片机程序_第2页
指纹识别模块单片机程序_第3页
指纹识别模块单片机程序_第4页
指纹识别模块单片机程序_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include <reg52.h>#include <intriiis.h>#define TRUE 1unsigned charSaveNumbei=0,searclmum=0;unsigned iiit SeaicliNumber=O;unsigned iiit clk0=0;sbit relay =P 1A4; 继电器引脚sbit buzzei-=PlA5; 蜂鸣器引脚sbit red=P2T;/录入模式指示灯在板子靠近单片机处sbit green= P2P;/识别模式指示灯 在板子远离单片机处sbitkl=P3T;模式识别sbit k2=P3A4; /录入一次

2、指纹sbit k3=P3-2; /?W除所有指纹(10个指纹清除)变量定义:unsigned char code tab10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/表:共阳数 码管0-9数码管引脚定义:sbit SMG_g = P1A3;定义数码管阳级控制脚(个位)由于程序中定时器被用我们用一位数码管显示且为静太显示所以推荐人家用1602或者12864液晶 bit changefiag=0jiiodeflag=0,cleaiallflag=0; 默认为识别模式,如果为1为录入指纹模式, 每录入_次 SaveNumber+7/常用指

3、令定义/Verify Password :验证设备握手I令.OXff.Oxff.Oxff.Oxff,.OXff.Oxff.Oxff.Oxff,unsignedcharcodeVPWD16= 16,0X01OxOLOJ,0x13.0x00.0x00.0x00,0x00.0x00,Oxlb; 回送 12 个设置设备握手口令unsignedchaicodeSTWD16= 16.0X01OxOLOJ,0x12.0x00.0x00.0x00,0x00.0x00,0x13; 回送 12 个/Getlinage:探测手指并从传感器上读入图像unsigned char code GEvIG14=12, 0X0

4、1 .0Xff,0xff,0xff,0xff, 0x01, 0、3丄0x00,0x05; 回送 12个/Gen Templetl:根据原始图像生成指纹特征1unsigned char code GENT114= 13,0X01 .0Xff.0xff.0xff.0xff.0x014,2,1.0x00.0x08;/ 回 送 12个/Gen Templet2:根据原始图像生成指纹特征2unsigned char code GENT214= 13,0X01 .OXff.Oxff.Oxff.Oxff,0x01,0,4.2,2,0x00,0x09; /回送 12个/Search Fmger :以ChaiB

5、ufferA或CharBufferB中的特征文件搜索整个或部分指纹库 unsigned char code SEAT18=17, 0X01 .OXffOxffOxffOxff. 0x01, 0,8, 4,1.0,0, 0.0x65, 0x00,0x73; 回送 16 个/Merge Templet ;将ChaiBufferA与CharEuffbrE中的特征文件合并生成模板,结果存 于 ModelBufferounsigned char code MERG14=12, 0X01 .OXff,Oxff,Oxff,Oxff. 0x01, 0,3,5、0x00,0x09;/回 送12个/Store T

6、emplet :将ModelBuffer中的文件储存到flash指纹库中unsigned chai code STOR16= 15, 0X01 ,OXff,Oxff,OxffOxff. 0x01, 066,2、0x00,0x00,0x00,OxOf; /回送 12 个Read Noteunsigned char code RDNT14= 13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0.4,0x19, 0. 0x00,Oxle;/Chai Noteunsigned chai code DENT46=45,0X01 ,OXff,Oxff,OxffOxff. 0x01,

7、0、36xl&0Q0Q0O0Q0O0Q0g0Q0Q0Q0Q0O0Q0O0O0Q0x0(X0x3d;/DEL one templetunsigned char code DELE_one16= 16. 0X01 ,OXff,Oxff,Oxff,Oxff, 0x01, 0,7, 0x0c,0x00,0x00, 0丄 0x00,0x15;/DEL templet;清空指纹库unsigned char code DELE_all12= 12,0X01 .0Xff0xff.0xff.0xff, 0x01, 0,3, 0x0d.0x00.0xll;/常用指令定义结束/宏定义/#define FAL

8、SE 0 #define TCRE 1状态定义表#define on1#define off 0#define MAX_NUMEER 63#define _Nop() _nop_()/7/宏定义_结束/unsigned charFifbNumber=O;unsigned charFIFO MAX_NUNIBER+1 =0 ;/*!毫秒延时程序*/void delay 1 ms (unsigned int t)unsigned mt i,j;for(i=O;i<t;i+) fb【(j=0jvi20j+)void TxdByte(unsigned char dat)/串丨I发送信息,通过查询

9、方式发送一个字符 TI = 0;让 TI=0SBUF = dat; 读入数据wlule(!TI);等待发送完毕TI = 0;清零bit Conmiand(unsigned chai *p.unsigned chai MaxTune) 命令解析,给模块发送一个命令 unsigned char count=0jmpdat=0.temp=04=0.package=0,flag=0.checksum=0;bit result=0, stait=0,stop=0;TxdByte(Oxef);/数据包包头识别码TxdByte(OxOl)/数据包包头识别码1=*P;数组的第“0”个元素、里面存放了本数组的长

10、度,把这个长度给变量b方便进行操作P卄;P卄;for (count=i-l; count!=1 ;count) /Sent command Stringtemp=*p+; 取第个“ 1 ”个元素的内容,然后发送 TxdEyte(temp);/将数据发送出去result=TURE;/发送完成,结果为真(真为1)FifbNumber=O;for (count=MAX.NUNIBER+l; count?=0; count-)/清空所有 FIFO口数组里面的内容,写 入 0X00FIFO count-! =0x00;if (result)result=FALSE;start =FALSE;stop =

11、FALSE;count=0;clk0=0; 清零CLO计数do /do 的内容/restaitO:if (RI= 1)如果接收到数据tmpdat=SBUF/先把接收到的数据放到unpdat中RI=0;if (tmpdat=Oxef)&&(start=FALSE)这个数据为第一个传回来的数 据,也就是“指令应答”的第一个字节count=0;FIFO0=tmpdg/读入第一个应答字节(0XEF),存在第“0” 个元素中flag=l;gotorestartO;/可以用中断方式进行if(flag=l)/第一个字节已经回来,所以flag=l成立if(tmpdat!=0x01) 接收数据错

12、误,将重新从缓冲区接收数flag=O;接收应答失败result=FALSE;start =FALSE;stop=FALSE;count=0;gotorestartO;如果成功接收到0xefDb可以开始接收数据 flag=2;/flag=2;表示应答成功,可以开始接收数据了 count+;现在 count=l;HFOcount=tmpdat;/读入第二个应答字节(0X01),存在第个元素中start=TURE; 应答成功町以开始接收数据goto restartO;if(flag=2)&&(stan=TURE)/flag=2;表示应答成功,可以开始接收数据了COUllt-H-; 数

13、据元素下标+ +FIFOcount=tmpdat;/ 入数据 if(count>=6) checksum=FIFOcount+checksum; / 计算校验和if(count=8)package=FIFO7*0X1004-FIFO8; 计 算包长度stop= TURE;if(stop)if(count=package+8)checksum=checksuni-FIFO count-1 -FIFO count;if(checksum != (FIFO count &Oxff)result=FALSE; /校验失败,置结果标志为0elseresult=TURE;flag=O; br

14、eak;/do 的内容结束/while (clkO <= MaxTune) && (count <= MAX_NUMBER) && (changeflag=O); /由定时器以及最大接收数据来控制,保证不会在此一直循环FifoNumbei-=count;保存接收到的数据个数return (result);bit VefPSW(void)/证设备握手I I令賊功返回1unsigned char count=0:wlule (1)if(Command(VPWD,20) && (FifbNumb亡r=ll) && (FIFO

15、9=OxOO)return(l);count+;if(count>=2)/如果不成功,再验证一次,如呆两次不成功,返回失败return(O);void Cleai_All(void) /清空指纹库delay lms(200);C onmiand (DELE_alL 5 0); 清空指纹库unsigned char IingProcess(unsigned char BUFID) 发获取图像并生成特征文件,存入 BUFED 中输入参数为缓冲区号if(Command(GIMG89) && (FifoNumber= 11) && (FIFO刃=0x00)if(B

16、UFID=l)if(Conunand(GENTh60) && (FifoNumber=ll) && (FIFO9=0x00)return 1;elsereturn 0;else if(BUFID=2)if(Conunand(GENT2.60) && (FifbNumber=ll) && (FIFO9=OxOO)leturn 1;elsereturn 0;elsereturn 0;return 0;bit Searclifinger(void)/®索指纹(发送搜索命令、以及根据返回值确定是否存在)if(Conmiand(S

17、EAT.60) && (FifoNumber= 15) && (FIFO9=0x00)SeaicliNumbei-=FIFO 10*0x 100+FIFO 11 (叟索到的页码/MatchScoie=FIFO 12*0x 1OO+FIFO13町以在此计算得分,从而进行安全级别设定,本程序忽略return 1;elsereturn 0;unsigned char search(void)/®索指纹unsigned char SeaicliBuf=0j=0;while (i<20)if (ImgProcess(l)=l) 首先读入一次指纹Seaicl

18、1Buf=Searclifmger();/进行指纹比对,如果搜索到,返回搜索到的指纹序 号if(SearcliBuf=l)return SearchNumber;elsereturn 255;/表示搜索到的指纹不正确1+;retuni 0;bit savefiiigme(unsigiied char ID)保存指纹unsigned chai i=0;现在开始进行存储指纹模板的操作for (i=0;K16;i+)/保存指纹信息FIFOi=STORi;FIFO12=LD;/把指纹模板存放的PAGEJDD也就是FLASH的位置FIFO14=FIFO14+ID; 校验和if (Conunand(FIF

19、O,70)=l)/此处进行存放指纹模板的命令return(l);elseieturn(O);/不成功返回0 unsigned char emoll(void) /采集两次指纹,生成1个指纹模板unsigned char temp=0xount=0;wliile(l)temp=ImgProcess(l); / 生成特征 1if (temp=l)/生成特征文件成功采集第一个特征成功count=0;buzzer=O;delavlnis(lOO);buzzer=l;break;elseif (temp=0) ”采集指纹没有成功count-H-;if (count>=40)/如果采集了 40次,还

20、不成功,直接采集失败,直接退出emoll函数返回0ieturn(O);delaylms(2000);/延时2S开始采集下一个特征开始采集第二个特征while(l)temp=ImgProcess(2); 生成特征 2if (temp=l)/生成特征文件2成功if ( (Conunand(MERG40)&& (FifbNumber=ll) && (FIFO9=OxOO)=l)合并成功返回1buzzei-O;delaylms(lOO);buzzer=l;delaylms(lOO);buzzei-O;delaylnis(lOO); 响两声,表示生成一个模板成功 buzz

21、er=l;ietuin(l);elsereturn(O);elseif (temp=l)/采集指纹没有成功count+;if (count>=25)return(O);void main(void)/i 函数 unsigned char i=0;ETO=1;定时器0开中断TL0=0x97; /17ms 的初值TH0=0xBD;串口初始化SCON=0x50; /UART 方式 1:8 位 UART; REN=1:允 许接收PCON=OxO 0; /SMOD=0波特率不加倍TMOD=Ox21; /T1方式2,用于UART波特率THl=0xFD:TL1 =0xFD; /UART 波特率设置:9

22、600TR1=1;TRO=1;/开定时器0ITO=O;/中断0低电平中断IT1=1;/中断1低电平中断EXO=1;/开中断0EX1=1;/开中断1EA=1;SMG_g = 0;P0 = tabO;/显示 0for(i=0;i<6;i+)/开始握手6次,如果没有一次成功,表示模块通信不正常。只要成功就 跳出此循坏if(VefPSW()=l)/与模块握手通过,绿灯亮起。进入识别模式green=O;buzzer=O;delaylms(300);buzzei-1;green=l;red=O;break; 成功就退出这个循坏wlule(l)if(k2=0)/录入一个指纹通过delaylms(lO)

23、;if(k2=0)/如果仍为低电平,表示按键有效wlule(k2=0);/ 等待松手if(VefPSW()= 1&&modeflag= 1&&SaveNumber<10)/ 4 模块握:f-if(emoll()=l)/采集两次,生成1个指纹模板成功if(savefuigiire(SaveNumber+1 )=1)/ 保存也成功SaveNumber+y/加一次 PO=tabSaveNumber;delaylms(200);PO=OxFF;/来一次显示,闪烁一次delaylins(200); PO=tabSaveNumber;elsebuzzei-O: for

24、(i=0;i<8;i+) delaylnis(lOO);i eddied;red=O; buzzei-1;if(modeflag=0)/为识别模式green=O;red=l;seaiclinum=searchQ; if(seaiclinum>=l&&seaiclmum<= 162)/只能存入 162 个指纹 PO=tab searchiium;/显示搜索到的指纹模块蜂鸣器响一声/继电器打开约3秒钟relay=O;buzzei-O;delay lms( 100);buzzei-1;delaylms(3000);relay=l;if(seaiclmum=25 5)/不正确的指纹 蜂鸣器响三声PO=tabO显示 0buzzei-O;delavlnis(l00); buzzer= 1 ;delaylms( 100);buzzei-O;de

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论