完整版指纹识别模块单片机程序.docx
《完整版指纹识别模块单片机程序.docx》由会员分享,可在线阅读,更多相关《完整版指纹识别模块单片机程序.docx(18页珍藏版)》请在冰豆网上搜索。
![完整版指纹识别模块单片机程序.docx](https://file1.bdocx.com/fileroot1/2022-10/28/87401655-2451-4647-9b2c-007206ba5b5d/87401655-2451-4647-9b2c-007206ba5b5d1.gif)
完整版指纹识别模块单片机程序
#include
#include
#defineTRUE1
unsignedcharSaveNumber=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:
根据原始图像生成指纹特征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;
unsignedcharFIFO[MAX_NUMBER+1]={0};
/*********1毫秒延时程序**********/
voiddelay1ms(unsignedintt)
{
unsignedinti,j;
for(i=0;ifor(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(coun