TxdByte(0x01);//数据包包头识别码
i=*p; //数组的第“0”个元素、里面存放了本数组的长度,把这个长度给变量i,方便进行操作 p++;
p++; //不知道为什么它命令中定义了一个无效字节,所以挪了两次 for (count=i-1; count!=1;count--) //Sent command String { }
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;
//清零CL0计数
temp=*p++;
TxdByte(temp);//将命令发送出去
{
count=0; clk0=0;
{
restart0:
{
do /////////////////////////////do的内容////////////////////////////////
if (RI==1)//如果接收到数据
tmpdat=SBUF;//先把接收到的数据放到tmpdat中
RI=0;
{
count=0; flag=1; goto
restart0;
//继续接受收
FIFO[0]=tmpdat;//读入第一个应答字节(0XEF),存在第“0”个元素中
if ((tmpdat==0xef)&&(start==FALSE))//这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节
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; start=TURE; goto
restart0;
//应答成功可以开始接收数据
FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第“1”个元素中
}
if((flag==2)&&(start==TURE))
{
count++; //数据元素下标++ if(count>=6)
{ } {
//计算包长度,这是帧格式规定的
} { }
stop= TURE;
FIFO[count]=tmpdat;//依次存入
checksum=FIFO[count]+checksum; //从这里才是计算校验和,这与帧格式有关
if(count==8)
package=FIFO[7]*0X100+FIFO[8];
if(stop)
if(count==package+8)
{ //校验不完全正确,因为没有比对第二个校验码 }
checksum=checksum-FIFO[count-1]; if(checksum!=FIFO[count]&0xff)
result=FALSE; //校验失败,置结果标志为0 result=TURE; else flag=0; break;
} }
}/////////////////////////////do的内容----------------结束////////////////////////////////
while ((clk0<=MaxTime)&&(count<=MAX_NUMBER) && ( changeflag == 0 ));
FifoNumber=count; }
}
return (result);
//保存接收到的数据个数
其它的重要函数: bit VefPSW(void)
//验证设备握手口令,成功返回1,通过发送VPWD指令来进行的。通过判断FIFO中的响应帧中的确认码和响应帧字节数来知道是否成功执行。具体如下:
while (1) {
if(Command(VPWD,20) && (FifoNumber==11) && (FIFO[9]==0x00)) {
return (1) ; }
count++;
if (count>=2)//如果不成功,再验证一次,如果两次不成功,返回失败
{
return(0); }
}
void Clear_All(void) //清空所有指纹信息,清空前首先验证和指纹模块通讯是否正常
{ }
if( VefPSW() == 1 ) //验证成功 { }
Command(DELE_all,50); //清空指纹库
unsigned char ImgProcess(unsigned char BUFID) //发获取图像并生成特征文件,存入BUFID中//输入参数为缓冲区号,1为生成特征文件1,2是生成特征文件2,这是通过发送GEN1和GEN2命令完成的。在录入指纹的时候需要进行两次采集和成模版再存储。在识别的时候只需要用这个函数采集一个特征文件去指纹库做比对。
bit Searchfinger(void)//搜索指纹(发送搜索命令、以及根据返回值确定是否存在) ,应该是默认使用特征文件1进行比对,如果比对成功,则结果放在Searchnum中。
unsigned char search(void)//先获取一次特征文件,调用上一个函数,如果比对成功则返回searchnum,如果不成功则返回255。 bit savefingure(unsigned char ID)//保存指纹
unsigned char enroll(void) //采集两次指纹,生成1个 指纹模板 void numshow(unsigned char num)//指纹号显示函数 {
strnum[0]= num/100+48; //+48是为了转换在ASCII码 百 strnum[1]= (num0)/10+48;//+48是为了转换在ASCII码 十
strnum[2]= num+48; //+48是为了转换在ASCII码 个 Display_HZ_Line(3,0,\指纹号:\ Display_HZ_Line(3,4,strnum);
}
void modecheck(void)//模式指示函数 {
if(modeflag==0)
{ } else { }
numshow(0);
red=0; green=1;
Display_HZ_Line(1,0,\ 录入模式 \green=0; red=1;
Display_HZ_Line(1,0,\ 识别模式 \
}
void shakehands(void)//握手函数,其实就是调用了若干次bit VefPSW(void) 主函数分析
void main(void) {
timer_init();//定时器初始化 uart_init();//串口初始化 Display_Init();//12864初始化 Lcd_ClrScreen();//清屏
externalint_init();//外部中断初始化
Display_HZ_Line(0,0,\ 指纹识别系统 \ shakehands();//与模块握手 {
if( modeflag == 1 )//为录入指纹模式
{
if(k2==0)//按一次按键,录入一个指纹
{
delay1ms(10); {
while(k2==0);//等待松手
if( SaveNumber<162 )//还没有超过录入上限 {
if(enroll()==1)//采集两次,生成1个指纹模板成功
if(k2==0)//如果仍为低电平,表示按键有效
while(1)//查询四个标志
{ if(savefingure(SaveNumber+1)==1)//保存也成功 { SaveNumber++;//加一次
Display_HZ_Line(2,0,\ 录入成功 \delay1ms(800);
Display_HZ_Line(2,0,\ \ numshow(SaveNumber);
}
} else { Display_HZ_Line(2,0,\ 录入失败 delay1ms(800);
Display_HZ_Line(2,0,\ }
}
}
} }
if( modeflag==0 )//为识别模式 {
searchnum=search();
if(searchnum>=1 && searchnum <= 162 ) { numshow(searchnum);//显示搜索到的指纹 buzzer=0;delay1ms(100);buzzer=1;//蜂鸣器响三声 relay=0;delay1ms(3000); relay=1;//继电器打开3秒
}
if(searchnum==255)//识别指纹失败 {
//蜂鸣器响三声 numshow(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(clearallflag==1) {
\\
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库指纹考勤机的设计与实现(2)在线全文阅读。
相关推荐: