完整版指纹识别模块单片机程序.docx
- 文档编号:3038674
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:19
- 大小:20.17KB
完整版指纹识别模块单片机程序.docx
《完整版指纹识别模块单片机程序.docx》由会员分享,可在线阅读,更多相关《完整版指纹识别模块单片机程序.docx(19页珍藏版)》请在冰点文库上搜索。
完整版指纹识别模块单片机程序
#include
#include
#defineTRUE1
unsignedcharSaveNumber=0,searchnum=0;unsignedintSearchNumber=0;
unsignedintclk0=0;
sbitrelay=P1A4;//继电器引脚
sbitbuzzer=P1A5;II蜂鸣器引脚
sbitred=卩2人7;〃录入模式指示灯在板子靠近单片机处
sbitgreen=卩2人0;〃识别模式指示灯在板子远离单片机处
sbitk仁卩3人3;II模式识别
sbitk2=P3A4;II录入一次指纹
sbitk3=P3A2;II清除所有指纹(10个指纹清除)
〃变量定义:
unsignedcharcodetab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};II表:
共阳数码管0-9
〃数码管引脚定义:
sbitSMG_g=P"3;II定义数码管阳级控制脚(个位)
II由于程序中定时器被用我们用一位数码管显示且为静太显示所以推荐大家用1602或者
12864液晶
bitchangeflag=0,modeflag=0,clearallflag=0;II默认为识别模式,如果为
每录入一次SaveNumber++
1为录入指纹模式,
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII常用指令定义IIIIIIIIIIIIIIIIIIIIIIIIIIIII
IIVerifyPassword:
验证设备握手口令
unsignedcharcodeVPWD[16]={16,0X01
0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};II回送12个
0Xff,0xff,0xff,0xff,
II设置设备握手口令
unsignedcharcodeSTWD[16]={16,0X01
0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a};II回送12个
code
0Xff,0xff,0xff,0xff,
//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_()
//////////////////////////////////////宏定义结束////////////////////////////////////////////////////////
unsignedchar
FifoNumber=0;
unsignedchar
FIFO[MAX_NUMBER+1]={0};
毫秒延时程序**********/
voiddelay1ms(unsignedintt){
unsignedinti,j;
for(i=0;i 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 restart。 ;//可以用中断方式进行 }if(flag==1)//第一个字节已经回来,所以flag==1成立 1”个元素中 数据了 FIFO[count]; flag=0;//接收应答失败result=FALSE;start=FALSE;stop=FALSE; count=0; gotorestart0; }//如果成功接收到0xef01,可以开始接收数据flag=2;//flag=2;表示应答成功,可以开始接收数据了count++;//现在count=1; FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第 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]- if(checksum! =(FIFO[count]&0xff))result=FALSE;//校验失败,置结果标志为 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)//此处进行存放指纹模板的命令 { return (1); } else return(0);//不成功返回0 unsignedcharenroll(void)//采集两次指纹,生成1个指纹模板 { unsignedchartemp=0,count=0; while (1) { temp=ImgProcess (1);//生成特征1if(temp==1)//生成特征文件成功{ //采集第一个特征成功count=0; buzzer=0;delay1ms(100); buzzer=1; break; } else { if(temp==0)//采集指纹没有成功 { count++; if(count>=40)//如果采集了40次,还不成功,直接采集失败,直接退出enroll函数----返回0 return(0); } } } delay1ms(2000);//延时2S开始采集下一个特征 //开始采集第二个特征 while (1) { temp=ImgProcess (2);//生成特征2 if(temp==1)//生成特征文件2成功 { if((Command(MERG,40)&&(FifoNumber==11)&&(FIFO[9]==0x00))==1) //合并成功返回1 buzzer=0; delay1ms(100); buzzer=1; delay1ms(100); buzzer=0; delay1ms(100);//响两声,表示生成一个模板成功 buzzer=1; return (1); } else { return(0); } } else { if(temp==1)//采集指纹没有成功 { count++; if(count>=25) return(0); } } } } voidmain(void)//主函数 { unsignedchari=0; ET0=1;//定时器0开中断 TL0=0x97;//17ms的初值TH0=0xBD; //串口初始化 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; SMG_g=0; P0=tab[0];//显示0 for(i=0;i<6;i++)//开始握手6次,如果没有一次成功,表示模块通信不正常。 只要成功就跳出此循环 { if(VefPSW()==1)//与模块握手通过,绿灯亮起。 进入识别模式 { green=0;buzzer=0; delay1ms(300);buzzer=1; green=1; red=0; 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++;//加一次P0=tab[SaveNumber]; delay1ms(200); PO=OxFF;〃来一次显示,闪烁一次 delay1ms(200); P0=tab[SaveNumber]; } } } else { buzzer=0;for(i=0;i<8;i++){delay1ms(100);red=~red; } red=0; buzzer=1; } } } if(modeflag==0)//为识别模式 { green=0; red=1; searchnum=search(); if(searchnum>=1&&searchnum<=162)//只能存入162个指纹 { PO=tab[searchnum];〃显示搜索到的指纹模块 //蜂鸣器响一声 //继电器打开约3秒钟 relay=O; buzzer=0; delay1ms(100); buzzer=1; delay1ms(3000); relay=1; } if(searchnum==255)//不正确的指纹蜂鸣器响三声 { P0=tab[0];//显示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(modeflag==1)//录入模式 { green=1; red=0; } if(clearallflag==1) { clearallflag=0; Clear_All(); red=0;//红色灯亮 green=1; //蜂鸣器长响一次,表示清除所有指纹结束 modeflag=1;//进入录入指纹模式 P0=tab[0];//表示没有指纹录入 buzzer=0; delay1ms(800); buzzer=1; SaveNumber=0; } if(changeflag==1) { changeflag=0; if(modeflag==0)//识别模式 { green=0; red=1; P0=tab[0];//显示当前有几个指纹 } else//录入模式 { red=0; green=1; P0=tab[0];//显示0 }////////////////////////////while (1)结束//////////////////////////////// } voidTimer0(void)interrupt1//定时器0中断函数{ TL0=0x97; TH0=0xBD;clk0++;//延时17ms } voidint0(void)interrupt0//中断0,清除所有指纹 { if(k3==0)//清除所有指纹 { delay1ms(10); if(k3==0)//如果仍为低电平,表示按键有效{ while(k3==0);//等待松手 clearallflag=1; changeflag=1; } } } voidint1(void)interrupt2//中断1,模式转换 { if(k1==0)//模式转换其中用modeflag来标志,默认从第1个指纹开始录入{ delay1ms(10); if(k1==0)//如果仍为低电平,表示按键有效{ while(k1==0);//等待松手modeflag=~modeflag;//0表示录入指纹1表示识别指纹chan
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 指纹识别 模块 单片机 程序