连接
1、ATK-301 电容 指纹识别模块简介 ATK-301 电容 指纹识别模块(以下简称 LB301 模块)是 ALIENTEK 推出的一款高性 能的电容半导体指纹识别模块。LB301 采用了瑞典 FPC 公司按压式电容指纹传感器,该传 感器具有功耗低、稳定、图像一致性效果好、耐静电等级高的特点。模块搭配 GigaDevice (兆易创新)生产的指纹控制专用芯片,针对指纹传感器做出了大量的图像优化、速度优 化、算法优化,使模块具有识别速度快,通过率高的等特点。相对传统光学指纹模块,本 模块具有识别速度更快、体积更小、功耗更低等特点。 模块配备了串口通讯接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简 单的串口通讯按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门 禁系统、指纹锁等场合。技术指标如表 1.1 所示
技术指标:
项目 说明 工作电压(V) 3.0~3.6V,
典型值:3.3V 工作电流(mA) 20~50mA,
典型值:40mA
静态功耗(uA) 3~10uA,
典型值:5uA
工作环境 温度(°C):-20~70
传感器图像大小(pixel) 192*192pixel
分辨率 508DPI
对比速度 1:1<6ms 拒真率(FRR) <1%
认假率(FAR) <0.001% 指纹存容量 500 枚(ID:0~499)
使用寿命 1,000,000 次
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include "usart2.h"
#include "LB301.h"
#include "led.h"
#define usart2_baund 57600//串口2波特率,根据指纹模块波特率更改
SysPara LB301Para;//指纹模块LB301参数
u16 ValidN;//模块内有效指纹个数
void Add_FR(void); //录指纹
void Del_FR(void); //删除指纹
void press_FR(void);//刷指纹
u16 GET_NUM(void);//获取数值
int main(void)
{
u8 ensure;
u8 key_num;
u16 count = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(); //初始化延时函数
LED_Init();
uart_init(115200); //初始化串口1波特率为115200,用于支持USMART
usart2_init(usart2_baund);//初始化串口2,用于与指纹模块通讯
KEY_Init(); //按键初始化
printf("与LB301模块握手....\r\n");
while(PS_GetImage() == 0xff)//与LB301模块握手(读取图像指令有数据返回说明模块已经连接)
{
delay_ms(400);
printf("未检测到模块!!!\r\n");
delay_ms(800);
printf("尝试连接模块...\r\n");
}
printf("通讯成功!!!\r\n");
printf("波特率:%d 地址:%x\r\n",usart2_baund,LB301Addr);
ensure=PS_ReadSysPara(&LB301Para); //读参数
if(ensure==0x00)
{
printf("库容量:%d 对比等级: %d\r\n",LB301Para.PS_max-ValidN,LB301Para.PS_level);
}
else;
printf("key0删指纹,key1录指纹 \r\n");
while(1)
{
key_num=KEY_Scan(0);
if(key_num)
{
if(key_num==1)
{
printf("正在删除指纹\r\n");
Del_FR();
}
if(key_num==2)
{
printf("正在录指纹\r\n");
Add_FR(); //录指纹
}
}
//查询刷指纹
if(++count > 10)
{
count = 0;
press_FR();
}
delay_ms(1);
}
}
//录指纹
void Add_FR(void)
{
u8 i=0,ensure ,processnum=1,pressCout=1,len;
u16 ID;
while(1)
{
switch (processnum)
{
case 1: //连续按压4次指纹分别存到4个charBuffer里
i++;
printf("请按指纹(%d)\r\n",pressCout);
ensure=PS_GetImage();
if(ensure==0x00)
{
i=0;
delay_ms(100);//这里需要延时一下,模块内部处理图像需要时间
ensure=PS_GenChar(pressCout);//生成特征
if(ensure==0x00)
{
printf("指纹正常\r\n");
pressCout++;
if(pressCout >=5)
{
pressCout = 0;
processnum=2;//跳到第二步
}
}else;
}else ;
break;
case 2:
ensure=PS_RegMB();
if(ensure==0x00)
{
printf("生成指纹模板成功\r\n");
processnum=3;//跳到第三步
}else {processnum=0;}
delay_ms(1200);
break;
case 3:
printf("请输入ID 0=< ID <=499\r\n");
ID=500;
do
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("您发送的id为:\r\n\r\n");
switch(len)
{
case 1:ID=USART_RX_BUF[0]-48;break;
case 2:ID=(USART_RX_BUF[0]-48)*10+(USART_RX_BUF[1]-48);break;
case 3:ID=(USART_RX_BUF[0]-48)*100+(USART_RX_BUF[1]-48)*10+(USART_RX_BUF[2]-48);break;
}
printf("ID %d\r\n",ID);
USART_RX_STA=0;
}
}while(!(ID<LB301Para.PS_max));//输入ID必须小于模块容量最大的数值
ensure=PS_StoreMB(CharBuffer1,ID);//储存模板
if(ensure==0x00)
{
printf("录入指纹成功\r\n");
PS_ValidTempleteNum(&ValidN);//读库指纹个数
delay_ms(1500);
return ;
}else {processnum=0;}
break;
}
delay_ms(200);
if(i>=20)//超过20次没有按手指则退出
{
break;
}
}
}
//刷指纹
void press_FR(void)
{
SearchResult seach;
u8 ensure;
ensure=PS_AutoIdentify(&seach);
if(ensure==0x00)//自动验证成功
{
printf("ID:%d 匹配得分:%d\r\n",seach.pageID,seach.mathscore);
if(seach.pageID==1)
LED0=!LED0;
else if(seach.pageID==2)
LED1=!LED1;
delay_ms(3000);
}
else if(ensure != 0xff)
{
printf("验证错误\r\n");
delay_ms(500);
}
}
//删除指纹
void Del_FR(void)
{
u8 ensure,len;
u16 num;
printf("删除指纹\r\n");
delay_ms(50);
//num=GET_NUM();//获取返回的数值
printf("请输入指纹ID,按key1清除全部指纹\r\n");
num=500;
do
{
if(KEY1==0)
{num=0xff00; break; }
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("您发送的id为:\r\n\r\n");
switch(len)
{
case 1:num=USART_RX_BUF[0]-48;break;
case 2:num=(USART_RX_BUF[0]-48)*10+(USART_RX_BUF[1]-48);break;
case 3:num=(USART_RX_BUF[0]-48)*100+(USART_RX_BUF[1]-48)*10+(USART_RX_BUF[2]-48);break;
}
printf("ID %d\r\n",num);
USART_RX_STA=0;
}
}while(!(num<LB301Para.PS_max));//输入ID必须小于模块容量最大的数值
if(num==0xFFFF)
goto MENU ; //返回主页面
else if(num==0xFF00)
{
printf("正在清空指纹库\r\n");
ensure=PS_Empty();//清空指纹库
}
else
ensure=PS_DeletChar(num,1);//删除单个指纹
if(ensure==0)
{
printf("删除指纹成功\r\n");
}
else
delay_ms(1200);
PS_ValidTempleteNum(&ValidN);//读库指纹个数
MENU:
delay_ms(50);
}