AS608指纹模块开发教程
一.简介AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片 而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供2次开发的指纹模块;所以,只要是基于AS608芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。二.硬件原理图介绍1.硬件接口AS608模块采用8pin的控制接口,供电电压为3.3...
一.简介
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例程 请关注公众号,首页回复“指纹模块”获取资料
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)