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

下载本文档

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

文档简介

#include<reg52.h>#include<intriiis.h>#defineTRUE1unsignedchar SaveNumbei=0,searclmum=0;unsignediiitSeaicliNumber=O;unsignediiitclk0=0;sbitrelay=P1A4;〃继电器引脚sbitbuzzei-=PlA5;〃蜂鸣器引脚sbitred= P2T;//sbitgreen=P2P;//识别模式指示灯在板子远离单片机处sbitkl=P3T;〃模式识别sbitk2=P3A4;//录入一次指纹sbitk3=P3-2;//?W除所有指纹(10个指纹清除)〃变量定义:unsignedcharcodetab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共阳数码管0-9〃数码管引脚定义:sbitSMG_gP1A3; 〃定义数码管阳级控制脚(个位)〃由于程序中定时器被用我们用一位数码管显示且为静太显示所以推荐人家用1602或者12864液晶bitchangefiag=0jiiodeflag=0,cleaiallflag=0;〃默认为识别模式,如果为1为录入指纹模式,每录入_次SaveNumber++7/////////////////常用指令定义〃〃///////////////////////////VerifyPassword:验证设备握手「I令unsigned char code VPWD[16]={16,0X01 .OXff.Oxff.Oxff.Oxff,OxOLOJ,0x13.0x00.0x00.0x00,0x00.0x00,Oxlb};〃回送12个〃设置设备握手口令unsigned chai code STWD[16]={16.0X01 .OXff.Oxff.Oxff.Oxff,OxOLOJ,0x12.0x00.0x00.0x00,0x00.0x00,0x13};〃回送12个//Getlinage :探测手指并从传感器上读入图像unsignedcharcodeGEvIG[14]={12,0X01.0Xff,0xff,0xff,0xff,0x01,0、30x00,0x05};〃回送12个//GenTempletl 1unsignedcharcodeGENT1[14]={13,0X01.0Xff.0xff.0xff.0xff.0x01^4,2,1.0x00.0x08};//回送12个//GenTemplet2 2unsignedcharcodeGENT2[14]={13,0X01.OXff.Oxff.Oxff.Oxff,0x01,0,4.2,2,0x00,0x09};//回送12个//SearchFmgerChaiBufferA或CharBufferB中的特征文件搜索整个或部分指纹库unsignedcodeSEAT[18]={17,0X01.OXff^OxffOxffOxff.0x01,0,8,4,1.0,0,0.0x65,0x00,0x73};〃回送16个//MergeTempletChaiBufferA与CharEuffbrE中的特征文件合并生成模板,结果存于ModelBufferounsignedcharcodeMERG[14]={12,0X01.OXff,Oxff,Oxff,Oxff.0x01,0,3,5、0x00,0x09};//回送12个//StoreTemplet:将ModelBuffer中的文件储存到flash指纹库中unsignedchaicodeSTOR[16]={15,0X01,OXff,Oxff,OxffOxff.0x01,066,2、0x00,OxOf};//回送12个ReadNoteunsignedcharcodeRDNT[14]={13,0X01,0Xff,0xff,0xff,0xff,0x01,0.4,0x19,0.0x00,Oxle};//ChaiNoteunsignedchaicodeDENT[46]={45,0X01,OXff,Oxff,OxffOxff.0x01、36xl&0Q0Q0O0Q0O0Q0g0Q0Q0Q0Q0O0Q0O0O0Q0x0(X0x3d};

0x00,0x00,//DELonetempletunsignedcharcodeDELE_one[16]={16.0X01,OXff,Oxff,Oxff,Oxff,0x01,0,7,0x0c,0x00,0x00,0丄0x00,0x15};//DELtemplet

;清空指纹库unsignedcharcodeDELE_all[12]={12,0X01.0Xff0xff.0xff.0xff,0x01,0,3,0x0d.0x00.0xll};////////////////常用指令定义结束/〃//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////宏定义/////////////////////////////////////////////////////////////////////〃/#defineFALSE0#defineTCRE1〃状态定义表#defineon 1#defineoff0#defineMAX_NUMEER63#define_Nop()_nop_()////////

7/////////////////宏定义_ 结束////////////////////////////////////////////////////////unsignedchar FifbNumber=O;unsignedchar FIFO[MAX_NUNIBER+1]={0};/*********!毫秒延时程序**********/voiddelay1ms(unsignedintt){unsignedmti,j;for(i=O;i<t;i++)fb【(j=0jvi20j++)}voidTxdByte(unsignedchardat)//串丨I发送信息,通过查询方式发送一个字符{TI0; 〃让TI=0SBUF=dat;〃读入数据wlule(!TI);TI=0;}

〃等待发送完毕〃清零bitConmiand(unsignedchai*p.unsignedchaiMaxTune)〃命令解析,给模块发送一个命令{unsignedcharcount=0jmpdat=0.temp=04=0.package=0,flag=0.checksum=0;bitresult=0,stait=0,stop=0;TxdByte(Oxef);//数据包包头识别码TxdByte(OxOl)^/数据包包头识别码1=*P;bP卄;P卄;

〃数组的第元素、里面存放了本数组的长度,把这个长度给变量for(count=i-l;count!=1;count~)//SentcommandString{temp=*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=FALSE;count=0;clk0=0;〃清零CLO计数do////〃/〃/////〃/〃/〃〃///〃do的内容//〃////〃////////〃/〃/〃〃////{restaitO:if(RI==1)〃如果接收到数据{tmpdat=SBUF^/先把接收到的数据放到unpdat中RI=0;if((tmpdat==Oxef)&&(start==FALSE))〃这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节{count=0;FIFO[0]=tmpdg//读入第一个应答字节(0XEF),存在第“0”个元素中flag=l;gotorestartO;//可以用中断方式进行}if(flag=l)//第一个字节已经回来,所以flag==l成立if(tmpdat!=0x01)〃接收数据错误,将重新从缓冲区接收数flag=O;〃接收应答失败result=FALSE;start=FALSE;stop=FALSE;count=0;gotorestartO;}〃如果成功接收到0xefDb可以开始接收数据flag=2;//flag=2;表示应答成功,可以开始接收数据了count++;〃现在count=l;HFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第个元素中start=TURE;〃应答成功町以开始接收数据gotorestartO;}数据了

if((flag==2)&&(stan=TURE))//flag=2;表示应答成功,可以开始接收{COUllt-H-〃数据元素下标++FIFO[count]=tmpdat;//^入数据if(count>=6){checksum=FIFO[count]+checksum;//计算校验和}if(count=8){度}if(stop){FIFO[count];0

package=FIFO[7]*0X1004-FIFO[8];〃计算包长stop=TURE;if(count==package+8){checksum=checksuni-FIFO[count-1] -if(checksum!=(FIFO[count]&Oxff))result=FALSE;//校验失败,置结果标志为elseresult=TURE;flag=O;break;}}}}}/////////////////////////////do的内容 结束////////////////////////////////while((clkO<=MaxTune)&&(count<=MAX_NUMBER)&&(changeflag=O));//由定时器以及最大接收数据来控制,保证不会在此一直循环FifoNumbei-=count; 〃保存接收到的数据个数}return(result);}bitVefPSW(void)//^证设备握手II令賊功返回1{unsignedcharcount=0:wlule(1){if(Command(VPWD,20)&&(FifbNumbr==ll)&&(FIFO[9]==OxOO))return(l);count++;if(count>=2)//如果不成功,再验证一次,如呆两次不成功,返回失败{return(O);}}}voidCleai_All(void)//清空指纹库{delaylms(200);Conmiand(DELE_alL50);〃清空指纹库}unsignedcharIingProcess(unsignedcharBUFID)〃发获取图像并生成特征文件,存入BUFED中〃输入参数为缓冲区号if(Command(GIMG89)&&(FifoNumber==11)&&(FIFO[刃=0x00))if(BUFID=l){if(Conunand(GENTh60)&&(FifoNumber==ll)&&(FIFO[9]==0x00)){}else{}}

return1;return0;elseif(BUFID==2){if(Conunand(GENT2.60)&&(FifbNumber==ll)&&(FIFO[9]==OxOO)){}}else{

}else{}

leturn1;return0;return0;}return0;}bitSearclifinger(void)//®索指纹(发送搜索命令、以及根据返回值确定是否存在){if(Conmiand(SEAT.60)&&(FifoNumber==15)&&(FIFO[9]=0x00)){SeaicliNumbei-=FIFO[10]*0x100+FIFO[11]〃(叟索到的页码//MatchScoie=FIFO[12]*0x1OO+FIFO[13] 设定,本程序忽略return1;}elsereturn0;unsignedcharsearch(void)//®索指纹{unsignedcharSeaicliBuf=0j=0;while(i<20){if(ImgProcess(l)=l)〃首先读入一次指纹{Seaicl1Buf=Searclifmger();//进行指纹比对,如果搜索到,返回搜索到的指纹序号if(SearcliBuf==l){}else{}}

returnSearchNumber;return255;//表示搜索到的指纹不正确1++;}retuni0;}bitsavefiiigme(unsigiiedcharID)〃保存指纹{unsignedchaii=0;〃现在开始进行存储指纹模板的操作for(i=0;K16;i++)//保存指纹信息{FIFO[i]=STOR[i];}FIFO[12]=LD;//PAGEJDDFLASHFIFO[14]=FIFO[14]+ID;〃校验和if(Conunand(FIFO,70)==l)//此处进行存放指纹模板的命令{return(l);}elseieturn(O);//不成功返回0}}unsignedcharemoll(void)//采集两次指纹,生成1个指纹模板{unsignedchartemp=0xount=0;wliile(l){temp=ImgProcess(l);//生成特征1if(temp==l)//生成特征文件成功{}else{

〃采集第一个特征成功count=0;buzzer=O;delavlnis(lOO);buzzer=l;break;if(temp==0)”采集指纹没有成功{count-H-;if(count>=40)//如果采集了40次,还不成功,直接采集失败,直接退出emoll函数返回0ieturn(O);}}}delaylms(2000);//延时2S开始采集下一个特征〃开始采集第二个特征while(l){temp=ImgProcess(2);〃生成特征2if(temp==l)//生成特征文件2成功{if((Conunand(MERG40)&&(FifbNumber==ll)&&(FIFO[9]==OxOO))==l )〃合并成功返回1}else{

buzzei-O;delaylms(lOO);buzzer=l;delaylms(lOO);buzzei-O;delaylnis(lOO);〃响两声,表示生成一个模板成功buzzer=l;ietuin(l);return(O);}else{

}if(temp=l)//采集指纹没有成功{count++;if(count>=25)return(O);}}}}voidmain(void)//i函数{unsignedchari=0;ETO=1; 0TL0=0x97;//17ms的初值TH0=0xBD;〃串口初始化SCON=0x50;//UART方式1:8位UART;REN=1:允许接收PCON=OxO0;//SMOD=0「波特率不加倍TMOD=Ox21;//T12,UARTTHl=0xFD:TL1=0xFD;//UART波特率设置:9600TR1=1;TRO=1;//开定时器0ITO=O;//0IT1=1;//1低电平中断EXO=1;//0EX1=1;//开中断1EA=1;SMG_g=0;P0=tab[O];//显示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);delaylms(lO);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=tab[SaveNumber];delaylms(200);PO=OxFF;//来一次显示,闪烁一次delaylins(200);PO=tab[SaveNumber];}}else{

}buzzei-O:for(i=0;i<8;i++){delaylnis(lOO);ieddied;}red=O;buzzei-1;}}}if(modeflag=0)//为识别模式{green=O;red=l;seaiclinum=searchQ;if(seaiclinum>=l&&seaiclmum<=162)//PO=tab[searchiium];//显示搜索到的指纹模块〃蜂鸣器响一声//3relay=O;buzzei-O;delaylms(100);buzzei-1;delaylms(3000);relay=l;}if(seaiclmum==255)//不正确的指纹蜂鸣器响三声

162个指纹{PO=tab[O]〃显示0buzzei-O;delavlnis(l00);buzzer=1;delaylms(100);buzzei-O;delavlnis(l00);buzzei-1;delaylnis(100);buzzei-O;d

温馨提示

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

评论

0/150

提交评论