1、完整版指纹识别模块单片机程序#include #include #define TRUE 1unsigned char SaveNumber=0,searchnum=0;unsigned int SearchNumber=0; unsigned int clk0=0;sbit relay =P14; /继电器引脚sbit buzzer=P15; /蜂鸣器引脚sbit red= P27;/录入模式指示灯 在板子靠近单片机处sbit green= P20;/识别模式指示灯 在板子远离单片机处sbit k1=P33; /模式识别sbit k2=P34; /录入一次指纹sbit k3=P32; /清除
2、所有指纹(10个指纹清除)/变量定义:unsigned char code tab10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/表:共阳数码管 0-9 /数码管引脚定义:sbit SMG_g = P13; /定义数码管阳级控制脚(个位)/由于程序中定时器被用 我们用一位数码管显示 且为静太显示 所以推荐大家用1602或者12864液晶 bit changeflag=0,modeflag=0,clearallflag=0; /默认为识别模式,如果为1为录入指纹模式,每录入一次SaveNumber+/常用指令定义/Verify Pass
3、word :验证设备握手口令unsigned char code VPWD16=16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b; /回送12个/设置设备握手口令unsigned char code STWD16=16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a; /回送12个/GetImage :探测手指并从传感器上读入图像unsigned char code GIMG14=12, 0X01 ,0X
4、ff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05; /回送12个/Gen Templet1 :根据原始图像生成指纹特征1unsigned char code GENT114=13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08; /回送12个/Gen Templet2 :根据原始图像生成指纹特征2unsigned char code GENT214=13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09; /回送12个 /Search Finger :以CharBu
5、fferA或CharBufferB中的特征文件搜索整个或部分指纹库unsigned char code SEAT18=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 MERG14=12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,5 , 0x00,0x09;/回送12个 /Store T
6、emplet :将ModelBuffer中的文件储存到flash指纹库中unsigned char code STOR16=15, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,6,6,2, 0x00,0x00, 0x00,0x0f; /回送12个/Read Noteunsigned char code RDNT14=13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,4,0x19, 0, 0x00,0x1e;/Clear Noteunsigned char code DENT46=45,0X01 ,0Xff,0xff,0xff,0xff, 0x
7、01, 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 templetunsigned char code DELE_one16=16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,7, 0x0c,0x00,0x00, 0,1, 0x00,0x15;/DEL templet ;清空指纹库unsigned char code DELE_all12=12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3, 0
8、x0d,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 FIFOMAX_NUMBER+1=0;/*1毫秒延时程序*/void delay1ms(unsigned int t) unsigned int i,j; for(i=0;it;i+) for(j=0;j120;j+) ;void T
9、xdByte(unsigned char dat)/串口发送信息,通过查询方式发送一个字符 TI = 0; /让TI0 SBUF = dat; /读入数据 while(!TI); /等待发送完毕 TI = 0; /清零bit Command(unsigned char *p,unsigned char MaxTime) /命令解析,给模块发送一个命令 unsigned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0; bit result=0, start=0,stop=0; TxdByte(0xef);/数据包包头识别
10、码 TxdByte(0x01);/数据包包头识别码 i=*p; /数组的第“0”个元素、里面存放了本数组的长度,把这个长度给变量i,方便进行操作 p+; p+; for (count=i-1; count!=1;count-) /Sent command String temp=*p+; /取第个“1”个元素的内容,然后发送 TxdByte(temp);/将数据发送出去 result=TURE;/发送完成,结果为真 (真为1) FifoNumber=0; for (count=MAX_NUMBER+1; count!=0; count-)/清空所有FIFO数组里面的内容,写入0X00 FIFO
11、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; FIFO0=tmpdat;/读入第一个应答字节(0XEF),存在第“0”个元素中 flag=1; goto restar
12、t0;/可以用中断方式进行 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; FIFOcount=tmpdat;/读入第二个应答字节(0X01),存在第“1”个元素中 start=TURE; /应答成功可以开始接收数据 goto restart0; if(flag=2)&(start=TURE)/flag=2;表示应答成功,可以开始接收数据了 count+; /数据元素下标 FIFOcount=tmpdat;/存入数据 if(coun
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1