atk301指纹识别模块-stm32-串口实现

连接

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);
	
}

 其它详细代码请参考正点原子   指纹识别模块ATK-301 — 正点原子资料下载中心 1.0.0 文档 (openedv.com)http://www.openedv.com/docs/modules/other/ATK-301.html

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值