为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

指纹识别模块单片机程序

2017-09-19 23页 doc 45KB 75阅读

用户头像

is_314871

暂无简介

举报
指纹识别模块单片机程序指纹识别模块单片机程序 #include #include #define TRUE 1 unsigned char SaveNumber=0,searchnum=0; unsigned int SearchNumber=0; unsigned int clk0=0; sbit relay =P1^4; //继电器引脚 sbit buzzer=P1^5; //蜂鸣器引脚 sbit red= P2^7;//录入模式指示灯 在板子靠近单片机处 sbit green= P2^0;//识别模式指示灯 在板子远离单...
指纹识别模块单片机程序
指纹识别模块单片机程序 #include #include #define TRUE 1 unsigned char SaveNumber=0,searchnum=0; unsigned int SearchNumber=0; unsigned int clk0=0; sbit relay =P1^4; //继电器引脚 sbit buzzer=P1^5; //蜂鸣器引脚 sbit red= P2^7;//录入模式指示灯 在板子靠近单片机处 sbit green= P2^0;//识别模式指示灯 在板子远离单片机处 sbit k1=P3^3; //模式识别 sbit k2=P3^4; //录入一次指纹 sbit k3=P3^2; //清除所有指纹(10个指纹清除) //变量定义: unsigned char code tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//:共阳数码管 0-9 //数码管引脚定义: sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位) //由于程序中定时器被用 我们用一位数码管显示 且为静太显示 所以推荐大家用1602或者12864液晶 bit changeflag=0,modeflag=0,clearallflag=0; //默认为识别模式,如果为1为录入指纹模式,每录入一次SaveNumber++ //////////////////////////////////////常用指令定义///////////////////////////// //Verify Password :验证设备握手口令 unsigned char code VPWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b}; //回送12个 //设置设备握手口令 unsigned char code STWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a}; //回送12个 //GetImage :探测手指并从传感器上读入图像 unsigned char code GIMG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05}; //回送 12个 //Gen Templet1 :根据原始图像生成指纹特征1 unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08}; //回送 12个 //Gen Templet2 :根据原始图像生成指纹特征2 unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //回送 12个 //Search Finger :以CharBufferA或CharBufferB中的特征文件搜索整个或部分指纹库 unsigned char code SEAT[18]={17, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,8, 4,1,0,0, 0,0x65, 0x00,0x73}; //回送16个 //Merge Templet ;将CharBufferA与CharBufferB中的特征文件合并生成,结果存 于ModelBuffer。 unsigned char code MERG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,5 , 0x00,0x09};//回 送12个 //Store Templet :将ModelBuffer中的文件储存到flash指纹库中 unsigned char code STOR[16]={15, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,6,6,2, 0x00,0x00, 0x00,0x0f}; //回送12个 //Read Note unsigned char code RDNT[14]={13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,4,0x19, 0, 0x00,0x1e}; //Clear Note unsigned char code DENT[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}; //DEL one templet unsigned char code DELE_one[16]={16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,7, 0x0c,0x00,0x00, 0,1, 0x00,0x15}; //DEL templet ;清空指纹库 unsigned char code DELE_all[12]={12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3, 0x0d,0x00,0x11}; ////////////////常用指令定义-------结束/////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////宏定义//////////////////////////////////////////////////////////////////////// #define FALSE 0 #define TURE 1 //状态定义表 #define on 1 #define off 0 #define MAX_NUMBER 63 #define _Nop() _nop_() //////////////////////////////////////宏定义------------结束//////////////////////////////////////////////////////// unsigned char FifoNumber=0; unsigned char FIFO[MAX_NUMBER+1]={0}; /*********1毫秒延时程序**********/ void delay1ms(unsigned int t) { unsigned int i,j; for(i=0;i=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; //校验失败,置结果标志为0 else result=TURE; flag=0; break; } } } } }/////////////////////////////do的内容----------------结束//////////////////////////////// while ((clk0 <= MaxTime) && (count <= MAX_NUMBER) && (changeflag==0)); // 由定时器以及最大接收数据来控制,保证不会在此一直循环 FifoNumber=count; //保存接收到的数据个数 } return (result); } bit VefPSW(void)//验证设备握手口令,成功返回1 { unsigned char count=0; while (1) { if(Command(VPWD,20) && (FifoNumber==11) && (FIFO[9]==0x00)) return(1); count++; if (count>=2)//如果不成功,再验证一次,如果两次不成功,返回失败 { return(0); } } } void Clear_All(void) //清空指纹库 { delay1ms(200); Command(DELE_all,50); //清空指纹库 } unsigned char ImgProcess(unsigned char BUFID) //发获取图像并生成特征文件,存入BUFID 中//输入参数为缓冲区号 { if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00)) { if(BUFID==1) { if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00)) { return 1; } else { return 0; } } else if(BUFID==2) { if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00)) { return 1; } else { return 0; } } } else { return 0; } return 0; } bit Searchfinger(void)//搜索指纹(发送搜索命令、以及根据返回值确定是否存在) { if(Command(SEAT,60) && (FifoNumber==15) && (FIFO[9]==0x00) ) { SearchNumber=FIFO[10]*0x100+FIFO[11];//搜索到的页码 //MatchScore=FIFO[12]*0x100+FIFO[13] 可以在此计算得分,从而进行安全级别 设定,本程序忽略 return 1; } else { return 0; } } unsigned char search(void)//搜索指纹 { unsigned char SearchBuf=0,i=0; while (i<20) { if (ImgProcess(1)==1)//首先读入一次指纹 { SearchBuf=Searchfinger();//进行指纹比对,如果搜索到,返回搜索到的指纹序 号 if(SearchBuf==1) { return SearchNumber; } else { return 255;//表示搜索到的指纹不正确 } } i++; } return 0; } bit savefingure(unsigned char ID)//保存指纹 { unsigned char i=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 } } unsigned char enroll(void) //采集两次指纹,生成1个 指纹模板 { unsigned char temp=0,count=0; while(1) { temp=ImgProcess(1); //生成特征1 if (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); } } } } void main(void)//主函数 { unsigned char i=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); P0=0xFF;//来一次显示,闪烁一次 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个指纹 { P0=tab[searchnum];//显示搜索到的指纹模块 //蜂鸣器响一声 //继电器打开约3秒钟 relay=0; 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)结束//////////////////////////////// } void Timer0(void) interrupt 1//定时器0中断函数 { TL0=0x97; TH0=0xBD; clk0++; //延时17ms } void int0(void) interrupt 0//中断0,清除所有指纹 { if(k3==0) //清除所有指纹 { delay1ms(10); if(k3==0)//如果仍为低电平,表示按键有效 { while(k3==0);//等待松手 clearallflag=1; changeflag=1; } } } void int1(void) interrupt 2//中断1,模式转换 { if(k1==0)//模式转换 其中用modeflag 来标志,默认从第1个指纹开始录入 { delay1ms(10); if(k1==0)//如果仍为低电平,表示按键有效 { while(k1==0);//等待松手 modeflag=~modeflag;//0表示录入指纹 1表示识别指纹 changeflag=1; } } }
/
本文档为【指纹识别模块单片机程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索