#includereg52.h#includeintrins.h#defineTRUE1unsignedcharSaveNumber=0,searchnum=0;unsignedintSearchNumber=0;unsignedintclk0=0;sbitrelay=P1^4;//继电器引脚sbitbuzzer=P1^5;//蜂鸣器引脚sbitred=P2^7;//录入模式指示灯在板子靠近单片机处sbitgreen=P2^0;//识别模式指示灯在板子远离单片机处sbitk1=P3^3;//模式识别sbitk2=P3^4;//录入一次指纹sbitk3=P3^2;//清除所有指纹(10个指纹清除)//变量定义:unsignedcharcodetab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//表:共阳数码管0-9//数码管引脚定义:sbitSMG_g=P1^3;//定义数码管阳级控制脚(个位)//由于程序中定时器被用我们用一位数码管显示且为静太显示所以推荐大家用1602或者12864液晶bitchangeflag=0,modeflag=0,clearallflag=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:根据原始图像生成指纹特征1unsignedcharcodeGENT1[14]={13,0X01,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08};//回送12个//GenTemplet2:根据原始图像生成指纹特征2unsignedcharcodeGENT2[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个//ReadNoteunsignedcharcodeRDNT[14]={13,0X01,0Xff,0xff,0xff,0xff,0x01,0,4,0x19,0,0x00,0x1e};//ClearNoteunsignedcharcodeDENT[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};//DELonetempletunsignedcharcodeDELE_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;unsignedcharFIFO[MAX_NUMBER+1]={0};/*********1毫秒延时程序**********/voiddelay1ms(unsignedintt){unsignedinti,j;for(i=0;it;i++)for(j=0;j120;j++);}voidTxdByte(unsignedchardat)//串口发送信息,通过查询方式发送一个字符{TI=0;//让TI=0SBUF=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[]数组里面的内容,写入0X00FIFO[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;gotorestart0;//可以用中断方式进行}if(flag==1)//第一个字节已经回来,所以flag==1成立{if(tmpdat!=0x01)//接收数据错误,将重新从缓冲区接收数据{flag=0;//接收应答失败result=FALSE;start=FALSE;stop=FALSE;count=0;gotorestart0;}//如果成功接收到0xef01,可以开始接收数据flag=2;//flag=2;表示应答成功,可以开始接收数据了count++;//现在count=1;FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第“1”个元素中start=TURE;//应答成功可以开始接收数据gotorestart0;}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]-FIFO[count];if(checksum!=(FIFO[count]&0xff))result=FALSE;//校验失败,置结果标志为0elseresult=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)&&