一.简介

AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片 而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供2次开发的指纹模块;所以,只要是基于AS608芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。
在这里插入图片描述

二.硬件原理图介绍

1.硬件接口
AS608模块采用8pin的控制接口,供电电压为3.3V(不能使用5V供电),通信总线有两种,分别为串口通讯(TX、RX)和USB通讯(D+、D-);采用串口通讯,编程相对简单,也是比较常用的一种,但是兼容性不好;采用USB通讯,编程相对较难,但USB作为最常用的总线接口,有很好的兼容性。
在这里插入图片描述
2.控制电路图
以51单片机为例,AS608模块touch引脚接到单片机的普通IO上,当有指纹按下,该引脚触发一个高电平信号;TX、RX引脚分别接到单片机的P30、P31串口引脚上。
注:AS608只能用+3.3V供电,不可用+5V供电。
在这里插入图片描述

三.通讯协议格式

单片机要实现对AS608指纹模块的控制,就需要根据AS608芯片规定的通讯协议格式来发送和处理串口数据,整个模块各个功能的实现也是围绕该协议格式进行的。
在这里插入图片描述
控制指令有三类,指令包、数据包、结束包;一般指令包是由单片机发送到模块上,模块接收到指令包后,返回对应的数据包;

  • 指令包主要包括:包头、芯片地址、包标识、包长度、控制参数和校验和;
  • 数据包主要包括:包头、芯片地址、包标识、包长度、数据和校验和 ;
  • 数据包与结束包的区别在于包标识,02H: 数据包,且有后续包。 08H: 最后一个数据包,即结束包。
四.控制程序

以指纹密码锁为例,
1.常用控制指令
一般要实现一个指纹密码锁的功能,只需用到以下指令:
录入图像、生成特征、搜索指纹、自动验证指纹、自动注册模板、删除指纹。
2.录入指纹
首先要是实现开锁,需要在系统里面录入指纹信息,需要:
录入图像->生成特征->快速查找图像->自动注册模板
(1)录入图像指令
在这里插入图片描述

void SFG_getimage()			      //录入指纹图像
{
   uchar i;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X03;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   summaf=0x05;
   SBUF=summaf;
   while(TI==0);
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
        
   while(RI==0);
   RI=0;
   querenma=SBUF;
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
}

(2)生成特征指令
存入指纹图像,存入单片机给定的缓冲区号BufferID中;
在这里插入图片描述

void SFG_genchar(uchar bufferID) //生成特征并存于charbuffer1/2  调用后
{
   uchar i;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X04;
   while(TI==0);
   TI=0;
   SBUF=0X02;
   while(TI==0);
   TI=0; 
   SBUF=bufferID;
   while(TI==0);
   TI=0;   
   summaf=0x07+bufferID;
   sum[0]=summaf;
   sum[1]=summaf>>8;
   SBUF=sum[1];
   while(TI==0)
   TI=0;
   SBUF=sum[0];
   while(TI==0)
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
   while(RI==0);
   RI=0;
   querenma=SBUF;
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
}

(3)快速查找图像
生成图像后要验证是否有在Buffer里面;
在这里插入图片描述

void SFG_fastsearch(uchar bufferID)  //搜索指纹返回指纹ID号   sum、pagenum>255都会使程序卡@@@
{
   uchar i,ID1,ID2;
//	SBUF=0xef;
//   while(TI==0);
//   TI=0;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X08;
   while(TI==0);
   TI=0;
		
   SBUF=0X1b;
   while(TI==0);
   TI=0;
        
   SBUF=bufferID;
   while(TI==0);
   TI=0;   
	 
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
	 
   SBUF=180;
   while(TI==0);
   TI=0;
        
   summaf=9+0x1b+bufferID+180;
   sum[0]=summaf;
   sum[1]=summaf>>8;
   SBUF=sum[1];
   while(TI==0);
   TI=0;
   SBUF=sum[0];
   while(TI==0);
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
	        
   while(RI==0);
   RI=0;
   querenma=SBUF;
        
   while(RI==0);
   RI=0;
   ID1=SBUF;
   while(RI==0);
   RI=0;
   ID2=SBUF;				  //接收到的ID号
   while(RI==0);
   RI=0;
   while(RI==0);
   RI=0;
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
   //PageID=ID1;
   PageID=(ID1<<8)+ID2;
}

(4)自动注册模板
最后将Buffer里面的图像存入Flash里面
在这里插入图片描述
在这里插入图片描述

void SFG_enroll()				 //自动注册模板返回存储ID  =录图像+合并生成模板+储存模板
{
   uchar i,ID1,ID2;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X03;
   while(TI==0);
   TI=0;
        
   SBUF=0X10;
   while(TI==0);
   TI=0;
           
   SBUF=0X00;
   while(TI==0);
   TI=0;
   summaf=0x14;
   SBUF=summaf;	   //校验和
   while(TI==0);
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
   while(RI==0);
   RI=0;
   querenma=SBUF;
   while(RI==0);
   RI=0;
   ID1=SBUF;
   while(RI==0);
   RI=0;
   ID2=SBUF;
        
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
   //PageID=ID1;
   PageID=(ID1<<8)+ID2;
}

2.自动验证指纹
录入指纹后,就可以匹配本人的指纹实现开锁,只需要发送自动验证指纹指令,返回的确认码为0x00,即为匹配成功,不为0x00即匹配失败;
在这里插入图片描述

void SFG_identify()				//自动验证指纹     录图像+生成特征+搜索
{
   uchar i,ID1,ID2,temp[10]; 
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X03;
   while(TI==0);
   TI=0;
        
   SBUF=0X11;
   while(TI==0);
   TI=0;
           
   SBUF=0X00;
   while(TI==0);
   TI=0;
   summaf=0x15;
   SBUF=summaf;	   //校验和
   while(TI==0);
   TI=0;  
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;
//		querenma=SBUF;
	 }
   while(RI==0);
   RI=0;
   querenma=SBUF;
	 temp[0]= querenma;
   while(RI==0);
   RI=0;
   ID1=SBUF;
	 temp[1]= ID1;
   while(RI==0);
   RI=0;
   ID2=SBUF;
	 temp[3]= ID2;   
   while(RI==0);
   RI=0;
   while(RI==0);
   RI=0;			  //得分 
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]>>8)+sum[0];									 
   //PageID=ID1;
   PageID=(ID1>>8)+ID2;
	 
	 for(i=0;i<3;i++)
	{
		SBUF = temp[i];
		while(TI==0);
		TI=0;
	}

(3)删除指纹
管理员如果需要删除系统中录入的指定指纹信息,需要写入删除所要删除指纹的ID号,然后发送删除指纹指令即可删除相应的指纹。
在这里插入图片描述

void SFG_deletchar(uint pageID)   //删除指纹		     校验和在2字节的页码处应分高低字节相加
{
   uchar i,ID1,ID2;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X07;
   while(TI==0);
   TI=0;
        
   SBUF=0X0c;
   while(TI==0);
   TI=0;
        
   ID1=pageID;ID2=pageID>>8;
   SBUF=ID2;
   while(TI==0);
   TI=0;
   SBUF=ID1;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=1;
   while(TI==0);
   TI=0;
        
   summaf=0x15+ID1+ID2;
   sum[0]=summaf;
   sum[1]=summaf>>8;
   SBUF=sum[1];
   while(TI==0);
   TI=0;
   SBUF=sum[0];
   while(TI==0);
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
   while(RI==0);
   RI=0;
   querenma=SBUF;
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
}
    
五.总结

只要实现以上几个指令,就可以实现一个指纹密码锁的基本功能了。

更多指纹模块AS608的51和stm32例程 请关注公众号,首页回复“指纹模块”获取资料
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐