#include <reg52.h>
#include <intrins.h>
#include " LCD12864.h " //里面定义了12864液晶的端口接法 以及 12864程序声名
sbit relay =P1^4; //继电器引脚
sbit buzzer=P1^5; //蜂鸣器引脚
sbit red= P2^7;//录入模式指示灯 在板子靠近单片机处
sbit green= P2^0;//识别模式指示灯 在板子远离单片机处
sbit k3=P3^2; //清除所有指纹(10个指纹清除)
sbit k1=P3^3; //模式识别
sbit k2=P3^4; //录入一次指纹
#define FALSE 0
#define TURE 1
#define MAX_NUMBER 30
#define _Nop() _nop_()
unsigned char SaveNumber=0,searchnum=0;
unsigned int SearchNumber=0,clk0=0;
bit modeflag= 0 , clearallflag=0, changeflag=0;
//默认为识别模式
//如果为1为录入指纹模式,每录入一次SaveNumber++
unsigned char strnum[4]={0};
unsigned char FifoNumber=0;
unsigned char idata FIFO[MAX_NUMBER+1]={0};
//////////////////////////////////////常用指令定义/////////////////////////////
//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};
void delay1ms(unsigned int count) //1MS 延时子程序
{
unsigned char i=0;
unsigned int k=0;
for(k=0;k<count;k++)
{
for(i=0;i<160;i++)
{
;
}
}
}
void TxdByte(unsigned char dat)//串口发送信息,通过查询方式发送一个字符
{
TI = 0; //让TI=0
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);//数据包包头识别码
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[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(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; //校验失败,置结果标志为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 if(BUFID==2)
{
if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00))
{
return 1;
}
}
else
{
;
}
}
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 ) //首先读入一次指纹 这里表示有指纹按在上面了
{
指纹模块录入与识别程序,通过12864液晶显示相关提示信息
5星 · 超过95%的资源 需积分: 9 6 浏览量
2013-09-29
17:03:48
上传
评论 3
收藏 57KB RAR 举报
bom0211
- 粉丝: 4
- 资源: 26
最新资源
- HTML+CSS+JS网页设计:从入门到精通.zip
- 数据库课程设计:从理论到实践的全面指南.zip
- Python闭包:深入理解与应用场景解析.zip
- Win64OpenSSL-3-3-0.exe
- 课高分程设计-基于C++实现的民航飞行与地图简易管理系统-南京航空航天大学
- 航天器遥测数据故障检测系统python源码+文档说明+数据库(课程设计)
- 北京航空航天大学操作系统课设+ppt+实验报告
- 基于Vue+Echarts实现风力发电机中传感器的数据展示监控可视化系统+源代码+文档说明(高分课程设计)
- 基于单片机的风力发电机转速控制源码
- 基于C++实现的风力发电气动平衡监测系统+源代码+测量数据(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页