指纹识别模块录入程序.docx

上传人:b****8 文档编号:9536626 上传时间:2023-02-05 格式:DOCX 页数:50 大小:28.07KB
下载 相关 举报
指纹识别模块录入程序.docx_第1页
第1页 / 共50页
指纹识别模块录入程序.docx_第2页
第2页 / 共50页
指纹识别模块录入程序.docx_第3页
第3页 / 共50页
指纹识别模块录入程序.docx_第4页
第4页 / 共50页
指纹识别模块录入程序.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

指纹识别模块录入程序.docx

《指纹识别模块录入程序.docx》由会员分享,可在线阅读,更多相关《指纹识别模块录入程序.docx(50页珍藏版)》请在冰豆网上搜索。

指纹识别模块录入程序.docx

指纹识别模块录入程序

指纹识别模块录入程序如下:

#include

#include

sbitrelay=P2^1;//继电器引脚

sbitbuzzer=P2^0;//蜂鸣器引脚

sbitled=P2^2;

sbitled1=P1^0;

sbitk2=P3^2;//录入一次指纹

sbitk1=P3^3;//模式识别转换

sbitk3=P3^4;//清除所有指纹(10个指纹清除)

sbitrs=P2^5;

sbitlcden=P2^7;

sbitwr=P2^6;

//sbitks=P1^0;

//sbiter=P1^1;

//sbitkm=P2^2;

//sbitjb=P1^3;

#defineMax_User10

#defineerror2

#defineuintunsignedint

#defineucharunsignedchar

unsignedcharSaveNumber=0,searchnum=0;

unsignedintSearchNumber=0;

unsignedintclk0=0;

unsignedcharstr[3]={0,'\0','\0'};

uchartable1[]="Please";

uchartable2[]="Inputfingerprint";

uchartable3[]="Thendooris";

uchartable4[]="alreadyopen";

uchartable5[]="ErrorWaring";

uchartable8[]="Doorsecurity";//门禁系统

bitmodeflag=0,clearallflag=0,changeflag=0;//默认为识别模式,如果为1为录入指纹模式,每录入一次SaveNumber++

//////////////////////////////////////常用指令定义/////////////////////////////

//VerifyPassword:

验证设备握手口令

unsignedcharcodeVPWD[16]={16,0X01,0Xff,0xff,0xff,0xff,0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//回送12个

//设置设备握手口令

unsignedcharcodeSTWD[16]={16,0X01,0Xff,0xff,0xff,0xff,0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a};//回送12个

//GetImage:

探测手指并从传感器上读入图像

unsignedcharcodeGIMG[14]={12,0X01,0Xff,0xff,0xff,0xff,0x01,0,3,1,0x00,0x05};//回送12个

//GenTemplet1:

根据原始图像生成指纹特征1

unsignedcharcodeGENT1[14]={13,0X01,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08};//回送12个

//GenTemplet2:

根据原始图像生成指纹特征2

unsignedcharcodeGENT2[14]={13,0X01,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09};//回送12个

//SearchFinger:

以CharBufferA或CharBufferB中的特征文件搜索整个或部分指纹库

unsignedcharcodeSEAT[18]={17,0X01,0Xff,0xff,0xff,0xff,0x01,0,8,4,1,0,0,0,0x65,0x00,0x73};//回送16个

//MergeTemplet;将CharBufferA与CharBufferB中的特征文件合并生成模板,结果存于ModelBuffer。

unsignedcharcodeMERG[14]={12,0X01,0Xff,0xff,0xff,0xff,0x01,0,3,5,0x00,0x09};//回送12个

//StoreTemplet:

将ModelBuffer中的文件储存到flash指纹库中

unsignedcharcodeSTOR[16]={15,0X01,0Xff,0xff,0xff,0xff,0x01,0,6,6,2,0x00,0x00,0x00,0x0f};//回送12个

//ReadNote

unsignedcharcodeRDNT[14]={13,0X01,0Xff,0xff,0xff,0xff,0x01,0,4,0x19,0,0x00,0x1e};

//ClearNote

unsignedcharcodeDENT[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,0x3d};

//DELonetemplet

unsignedcharcodeDELE_one[16]={16,0X01,0Xff,0xff,0xff,0xff,0x01,0,7,0x0c,0x00,0x00,0,1,0x00,0x15};

//DELtemplet;清空指纹库

unsignedcharcodeDELE_all[12]={12,0X01,0Xff,0xff,0xff,0xff,0x01,0,3,0x0d,0x00,0x11};

//////////////////////////////////////常用指令定义-------结束///////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////宏定义////////////////////////////////////////////////////////////////////////

#defineFALSE0

#defineTURE1

//状态定义表

#defineon1

#defineoff0

#defineMAX_NUMBER63

#define_Nop()_nop_()

//////////////////////////////////////宏定义------------结束////////////////////////////////////////////////////////

unsignedcharFifoNumber=0;

xdataunsignedcharFIFO[MAX_NUMBER+1]={0};

/*********1毫秒延时程序**********/

voiddelay1ms(unsignedintt)

{

unsignedinti,j;

for(i=0;i

for(j=0;j<120;j++)

;

}

voidTxdByte(unsignedchardat)//串口发送信息,通过查询方式发送一个字符

{

TI=0;//让TI=0

SBUF=dat;//读入数据

while(!

TI);//等待发送完毕

TI=0;//清零

}

bitCommand(unsignedchar*p,unsignedcharMaxTime)//命令解析,给模块发送一个命令

{

unsignedcharcount=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;

bitresult=0,start=0,stop=0;

TxdByte(0xef);//数据包包头识别码

TxdByte(0x01);//数据包包头识别码

i=*p;//数组的第“0”个元素、里面存放了本数组的长度,把这个长度给变量i,方便进行操作

p++;

p++;

for(count=i-1;count!

=1;count--)//SentcommandString

{

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);

}

bitVefPSW(void)//验证设备握手口令,成功返回1

{

unsignedcharcount=0;

while

(1)

{

if(Command(VPWD,20)&&(FifoNumber==11)&&(FIFO[9]==0x00))

return

(1);

count++;

if(count>=2)//如果不成功,再验证一次,如果两次不成功,返回失败

{

return(0);

}

}

}

voidClear_All(void)//清空指纹库

{

delay1ms(200);

Command(DELE_all,50);//清空指纹库

}

unsignedcharImgProcess(unsignedcharBUFID)//发获取图像并生成特征文件,存入BUFID中//输入参数为缓冲区号

{

if(Command(GIMG,89)&&(FifoNumber==11)&&(FIFO[9]==0x00))

{

if(BUFID==1)

{

if(Command(GENT1,60)&&(FifoNumber==11)&&(FIFO[9]==0x00))

{

return1;

}

else

{

return0;

}

}

elseif(BUFID==2)

{

if(Command(GENT2,60)&&(FifoNumber==11)&&(FIFO[9]==0x00))

{

return1;

}

else

{

return0;

}

}

}

else

{

return0;

}

return0;

}

bitSearchfinger(void)//搜索指纹(发送搜索命令、以及根据返回值确定是否存在)

{

if(Command(SEAT,60)&&(FifoNumber==15)&&(FIFO[9]==0x00))//搜索到指纹

{

SearchNumber=FIFO[10]*0x100+FIFO[11];//搜索到的页码

//MatchScore=FIFO[12]*0x100+FIFO[13]可以在此计算得分,从而进行安全级别设定,本程序忽略

return1;

}

else

{

return0;

}

}

unsignedcharsearch(void)//搜索用户

{

unsignedcharSearchBuf=0,i=0;

while(i<20)

{

if(ImgProcess

(1)==1)//首先读入一次指纹

{

SearchBuf=Searchfinger();//进行指纹比对,如果搜索到,返回搜索到的指纹序号

if(SearchBuf==1)

{

returnSearchNumber;

}

else

{

return255;//表示搜索到的指纹不正确

}

}

i++;

}

return0;

}

bitsavefingure(unsignedcharID)//保存指纹

{

unsignedchari=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

}

unsignedcharenroll(void)//采集两次指纹,生成1个指纹模板

{

unsignedchartemp=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

{

return0;

}

else//特征文件合并生成模板,结果存于ModelBuffer

{

buzzer=0;

delay1ms(100);

buzzer=1;

delay1ms(100);

buzzer=0;

delay1ms(100);//响两声,表示生成一个模板成功

buzzer=1;

return1;

}

}

else

{

if(temp==1)//采集指纹没有成功

{

count++;

if(count>=25)

return(0);

}

}

}

}

/***********************/

voiddelay(uintx)

{

uinta,b;

for(a=x;a>0;a--)

for(b=10;b>0;b--);

}

voidwrite_com(ucharcom)//些命令,RS=0

{

wr=0;

P0=com;

rs=0;

lcden=0;

delay(10);

lcden=1;

delay(10);

lcden=0;

}

voidwrite_data(uchardat)//写数据,RS=1

{

wr=0;

P0=dat;

rs=1;

lcden=0;

delay(10);

lcden=1;

delay(10);

lcden=0;

}

voidinit()

{

write_com(0x38);//显示模式设置:

16×2显示,5×7点阵,8位数据接口

delay(20);

write_com(0x0f);//显示模式设置

delay(20);

write_com(0x06);//显示模式设置:

光标右移,字符不移

delay(20);

write_com(0x01);//清屏幕指令,将以前的显示内容清除

delay(20);

}

/************************/

voidzwmm()

{

uinta;

write_com(0x80);//设置第二行首字符显示的位置,为第二行,第一列

a=0;

while(table8[a]!

='\0')//只要没有写到结束标志,就继续写

{//这是写字符的第一种方法,用while循环。

write_data(table8[a]);

a++;

}

}

voidinput()

{

uchara;

a=0;

write_com(0x84);//设置第二行首字符显示的位置,为第二行,第一列

while(table1[a]!

='\0')//只要没有写到结束标志,就继续写

{//这是写字符的第一种方法,用while循环。

write_data(table1[a]);

a++;

}

a=0;

write_com(0x80+0x40);//设置第二行首字符显示的位置,为第二行,第一列

a=0;

while(table2[a]!

='\0')//只要没有写到结束标志,就继续写

{//这是写字符的第一种方法,用while循环。

write_data(table2[a]);

a++;

}

}

voidopen()

{

uchara;

write_com(0x80);//设置第二行首字

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1