【经验】基于CW32的AS608指纹模块的应用
AS608是一款集成了指纹图像采集和指纹比对算法的指纹识别模块。它采用了高质量的光学传感器,能够实时采集人体指纹图像,并通过指纹比对算法进行指纹识别。AS608具有高精度、快速、可靠的特点,广泛应用于各种指纹识别场景,如门禁系统、安防系统、考勤系统等。
本实验用到了CW32-48F大学计划板、0.96寸OLED显示屏模块、AS608指纹模块及Keil5开发环境。
例程资料链接如下:
BD网盘链接:
https://pan.baidu.com/s/1q7b0_AOx_rUxi_XPcJL7zw
提取码:vp02
AS608指纹模块使用说明
(1) 引脚说明(该模块共8个引脚,只使用前6个引脚)
(2) 通讯方法
通过给AS608串口发送特定的指令调用模块内置的算法进行相应的操作。
常用的指令有:
指令格式有三种:命令包格式、数据包格式和结束包格式。
以命令包格式为例,包头是2个字节的数据,固定为0xEF01;芯片地址4个字节,默认是0xFFFFFFFF;包识别用来区分指令类型,如命令包固定为0x01,数据包格式固定为0x02;包长度指这一条指令有多少个重要的数据,包长度=包长度至校验和(指令、参数或数据)的总字节数,包含校验和,但不包含包长度本身的字节数;指令就是需要AS608执行的操作,参数和具体的指令有关,不同的指令,参数的长度和数值都有所不同;校验和是为了确保串口通讯正确。
模块接收到命令后会产生应答,将有关命令执行情况与结果上报给上位机,上位机只有在收到模块的应答包后才能确认模块收包情况与指令执行情况。模块应答包中包含一个参数:确认码。确认码表示执行指令完毕的情况。
确认码定义:
00H:表示指令执行完毕或 OK;
01H:表示数据包接收错误;
02H:表示传感器上没有手指;
03H:表示录入指纹图像失败;
(3) 指纹录入实现流程
录入指纹图像
当手指放在光学指纹窗口时,模块自动拍下指纹图像。
生成特征
记录图像中的指纹特征,并将该特征存入缓存区。
再次录入图像
当手指放在光学指纹窗口时,再次拍下指纹图像。
再次生成特征
记录二次图像中的指纹特征,并将该特征存入另一缓存区。
精确比对两枚指纹特征
对录入的两个指纹特征进行比对。
合并特征(生成模板)
比对成功无误后,将两个特征合并成一个指纹模板。
储存模板
将生成的模板存储到到AS608内部Flash,存储时需指定存储地址,即指纹ID。
上面以指纹录入功能为例,简要介绍了功能实现的基本流程,更多详情请参考AS60x指纹识别SOC用户手册和ATK-AS608指纹识别模块用户手册。
核心代码
main.c:
#include "main.h"
#include "Uart.h"
#include "LED.h"
#include "AS608.h"
#include "OLED.h"
#include "Delay.h"
#include "BTIM.h"
#include "Key.h"
uint8_t flag_add=0; //指纹录制标识位
uint8_t flag_passport=0; //密码输入标识位
uint8_t flag_key_function=0; //按键功能标识位
const uint16_t passpot=123; //管理员密码
/*-----------------------刷指纹-----------------------*/
void AS608_MatchFingerPrints(void)
{
if(Is_Press==1) //有手指按下
{
SearchResult seach;
uint8_t result;
result=PS_GetImage();
if(result==0x00)//获取图像成功
{
result=PS_GenChar(CharBuffer1);
OLED_Clear();
if(result==0x00) //生成特征成功
{
result=PS_HighSpeedSearch(CharBuffer1,0,6,&seach); //自定义检索ID为0~6的指纹库,最大范围为0~300
if(result==0x00)//搜索成功
{
OLED_ShowString(2,1," ID= "); //指纹识别成功后自定义显示内容
OLED_ShowNum(2,10,seach.pageID,1);
OLED_ShowString(3,1," Welcome! ");
/*
指纹识别成功后的自定义功能
*/
}
else
{
OLED_ShowString(1,1," Refuse! "); //指纹识别失败,遭到系统拒绝
}
}
else
{
OLED_ShowString(1,1," Error! "); //指纹识别过程出现错误,3秒后重启识别功能可再次识别
OLED_ShowString(2,1," 3 ");
Delay_s(1);
OLED_ShowString(2,1," 2 ");
Delay_s(1);
OLED_ShowString(2,1," 1 ");
}
Delay_s(1);
}
Display_Meum();
flag_passport=0;
}
}
/*-----------------------录指纹-----------------------*/
void AS608_AddFingerPrints(void)
{
uint8_t result,steps=0;
flag_add=1;
OLED_Clear();
OLED_ShowString(1,1,"AddFingerPrints");
while(1) //在指纹录制环节中循环
{
switch (steps)
{
case 0: //录制环节0
flag_key_function=1;
OLED_ShowString(2,1,"Choose ID:"); //指纹ID选择界面
OLED_ShowNum(2,11,Finger_ID,1);
OLED_ShowString(3,1," ");
OLED_ShowString(4,1,"back");
OLED_ShowString(4,8,"+");
OLED_ShowString(4,13,"ok");
switch(Key_Scan())
{
case 1: //退出指纹录制,返回主界面,
Display_Meum();
return ;
case 2: //选择录入的指纹对应的ID
if(Finger_ID!=6) Finger_ID++;
else Finger_ID=1;
break;
case 3: //进入下一个环节
steps=1;
break;
}
break;
case 1: //录制环节1
if(Key_Scan()!=0){Display_Meum();return ;}; //按任意键退出
OLED_ShowString(2,1," ");
OLED_ShowString(3,1,"Please press..."); //操作提示
OLED_ShowString(4,1," ");
result=PS_GetImage(); //首次获取指纹图像
if(result==0x00)
{
result=PS_GenChar(CharBuffer1);//生成特征1
if(result==0x00)
{
OLED_ShowString(3,1," OK! Get it... ");
Delay_s(1);
OLED_ShowString(2,1," ");
steps=2; //进入下一个环节
}
}
break;
case 2: //录制环节2
if(Key_Scan()!=0){Display_Meum();return ;}; //按任意键退出
OLED_ShowString(3,1,"Press Again..."); //操作提示
result=PS_GetImage(); //再次获取指纹图像
if(result==0x00)
{
result=PS_GenChar(CharBuffer2);//生成特征2
if(result==0x00)
{
OLED_ShowString(3,1," OK! Get it... ");
Delay_s(1);
steps=3; //进入下一个环节
}
}
break;
case 3: //录制环节3
result=PS_Match(); //特征1与特征2进行匹配
if(result==0x00) //匹配成功
{
steps=4; //进入下一个环节
OLED_ShowString(3,1," Matching... ");
}
else //匹配失败
{
OLED_ShowString(2,1," Fail! ");
OLED_ShowString(3,1," 3 ");
Delay_s(1);
OLED_ShowString(3,1," 2 ");
Delay_s(1);
OLED_ShowString(3,1," 1 ");
steps=0; //回到录制环节0
}
Delay_s(1);
break;
case 4: //录制环节4
result=PS_RegModel(); //合并特征,生成指纹模板
if(result==0x00)
{
steps=5; //进入下一个环节
OLED_ShowString(3,1," OK! ");
}
else
{
OLED_ShowString(2,1," Fail! ");
OLED_ShowString(3,1," 3 ");
Delay_s(1);
OLED_ShowString(3,1," 2 ");
Delay_s(1);
OLED_ShowString(3,1," 1 ");
steps=0;
}
Delay_s(1);
break;
case 5:
result=PS_StoreChar(CharBuffer2,Finger_ID); //储存指纹
if(result==0x00)
{
flag_key_function=0;
OLED_ShowString(3,1,"AddSuccessfully");
Delay_s(1);
Display_Meum(); //回到主页面
return ;
}
break;
}
}
}
/*-----------------------主页面-----------------------*/
void Display_Meum()
{
OLED_Clear();
flag_add = 0;
flag_key_function = 0;
if(PS_ValidTempleteNum(&validFinger_num)==0xff) //读取指纹模块当下信息参数
OLED_ShowString(2,1," ERROR!!! "); //提示读取失败,原因可能是线没接好或者模块损坏
else
{
OLED_ShowString(1,1,"----Welcome----");
OLED_ShowString(2,1,"ValidNum:");
OLED_ShowNum(2,10,validFinger_num,1);
OLED_ShowString(4,1,"add delet ");
if(delet_num==0) OLED_ShowString(4,15,"+");
else OLED_ShowNum(4,15,delet_num,1);
}
}
/*-----------------------密码输入-----------------------*/
void PassportInput()
{
static uint8_t i=0;
flag_key_function=1;
OLED_ShowString(1,1,"No access!"); //密码输入提示
OLED_ShowString(2,1,"Input Passport:");
OLED_ShowNum(3,6,passport_num1,1);
OLED_ShowNum(3,8,passport_num2,1);
OLED_ShowNum(3,10,passport_num3,1);
OLED_ShowString(4,1,"+");
if(i==0) OLED_ShowString(4,6,"^");
OLED_ShowString(4,12,"back");
switch(Key_Scan())
{
case 1://加
if(i==0) {passport_num1++;if(passport_num1==10) passport_num1=0;}
if(i==1) {passport_num2++;if(passport_num2==10) passport_num2=0;}
if(i==2) {passport_num3++;if(passport_num3==10) passport_num3=0;}
if((passport_num1*100+passport_num2*10+passport_num3)==passpot)
{
OLED_ShowNum(3,10,passport_num3,1);
Delay_ms(500);
OLED_Clear();
OLED_ShowString(2,1," Access! ");
access=1; //打开指纹录制/删除权限
PA07_SETLOW(); //LED全部点亮,指示权限全开
PA08_SETLOW();
PC13_SETLOW();
Delay_s(2);
Display_Meum();
flag_passport=0;
passport_num1=0;
passport_num2=0;
passport_num3=0;
i=0;
}
break;
case 2:// 切换数字
if(++i==3) i=0;
if(i==1) OLED_ShowString(4,6," ^ ");
else if(i==2) OLED_ShowString(4,6," ^");
else if(i==0) OLED_ShowString(4,6,"^ ");
break;
case 3://退出
passport_num1=0;
passport_num2=0;
passport_num3=0;
Display_Meum();
flag_passport=0;
i=0;
break ;
}
}
/*------------------指纹录制/删除权限管理-------------------*/
void Permission_Management(void)
{
if(Key_Scan()==20) //若返回键值为20,则打开密码输入标识
{
OLED_Clear();
flag_passport=1;
}
if(flag_passport==1)//若密码标识打开,则进入密码输入界面
PassportInput();
}
/*--------------------------主函数--------------------------*/
int main()
{
LED_Init(); //3个LED指示灯
OLED_Init(); //OLED屏幕显示
BTIM_Init(); //启动定时器配合应答包接收
UART2_Init(); //与AS608进行串口通信,波特率为57600
Key_GPIO_Init(); //三个按键
AS608_WAK_GPIO_Init(); //WAK引脚,感应手指按下
Display_Meum(); //屏幕主界面
while(1)
{
AS608_MatchFingerPrints(); //指纹识别
Permission_Management(); //权限管理
}
}
最终实验现象
- |
- +1 赞 0
- 收藏
- 评论 0
本文由咪猫转载自CW32生态社区公众号,原文标题为:【CW32】基于CW32的AS608指纹模块的应用,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
【经验】芯源CW32系列单片机低功耗模式介绍及UART深度休眠模式示例
CW32单片机低功耗模式介绍及UART深度休眠模式示例。
设计经验 发布时间 : 2023-05-31
使用JLink烧录CW32程序
本篇主要介绍使用JLink烧录CW32程序。
设计经验 发布时间 : 2024-03-15
基于CW32的RC522刷卡模块的应用实验分享
RC522刷卡模块是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员,是NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片。
设计经验 发布时间 : 2023-12-26
CW32 is a Low-power 32-bit Microcontroller, Using Arm Cortex-m0+core, Very Suitable for Intelligent Temperature Controllers with Low Power Consumption Requirements
The CW32 designed by Wuhan Xinyuan Semiconductor Co., Ltd. using ARM Cortex-M0+core is a low-power 32-bit microcontroller, currently used in temperature controllers such as air conditioning, floor heating, water heating, and electric heating.
应用方案 发布时间 : 2024-11-08
武汉芯源半导体邀您相约CITE2024中国电子信息博览会
CITE2024第十二届中国电子信息博览会将于2024年4月9-11日在深圳福田会展中心隆重开展,武汉芯源半导体将为电子行业参观者展示智能指纹锁、麦克风、燃气表、LED调光板、可燃气体报警器、筋膜枪、角磨机、血氧仪、温控器、BLDC无刷电机、永磁同步电机无感FOC控制方案等多款CW32单片机典型应用方案,诚邀您莅临9B122武汉芯源半导体展位参观交流!
原厂动态 发布时间 : 2024-04-05
基于CW32F003E4P7的便携指夹式血氧仪全套解决方案,实现0.2%的弱灌注检测能力
武汉芯源半导体作为国内优秀的半导体设计厂商,可提供基于CW32F003E4P7的便携指夹式血氧仪全套解决方案,实现0.2%的弱灌注检测能力。
应用方案 发布时间 : 2024-11-07
基于CW32的无刷直流空心杯电机有感控制驱动方案
空心杯电机(Hollow-Cup Motor)是一种特殊类型的微型无刷直流电机,具有空心的旋转部分。它通常由外部固定的外壳和内部旋转的空心杯组成。空心杯电机具有较高的功率密度和扭矩输出,适用于一些特定的应用场景,如精密仪器、机器人、医疗设备等。空心杯电机的工作原理是基于无刷直流电机的原理。它采用无刷电机的结构,包括定子(固定部分)和转子(旋转部分)。
应用方案 发布时间 : 2024-05-16
【应用】基于CW32的无刷水泵控制系统,使水泵更加节能、高效
本课题研究的目的是设计一套基于CW32的无位置传感器无刷直流电机控制系统,既可以改进水泵的工作模式,使水泵工作点最优;又可以使水泵电机结构简单,控制方式更为灵活。以此将整个系统加入各个不同场景中,让CW32低功耗优点,能让水泵共更加节能,高效。
应用方案 发布时间 : 2023-09-15
Application of CW32F003F4P7 Series Products on Level Switches
This intelligent tuning fork material level switch uses CW32F003F4P7 from Wuhan Core Source Semiconductor as the main control chip. As the main control unit of the material level switch, CW32F003F4P7 drives the vibration components to generate a certain oscillation frequency. When there is a change in liquid level, it causes a change in oscillation frequency. CW32F003F4P7 detects this change, outputs a switch signal to the equipment main control unit, and then senses the liquid level situation.
应用方案 发布时间 : 2024-11-07
武汉芯源CW32系列单片机数字电压电流表产品硬件设计指南
本文基于武汉芯源CW32系列单片机,介绍数字电压电流表产品硬件设计指南,希望对各位工程师有所帮助。
设计经验 发布时间 : 2024-06-20
【技术】武汉芯源CW32单片机UART基本数据收发功能介绍
通用异步收发器是一种通用串行数据总线,常用于系统内各子模块间的数据交换。本文将以武汉芯源推出的CW32系列单片机的CW32L083为例,介绍UART基本数据收发功能。
技术探讨 发布时间 : 2023-04-25
授人以渔,24电赛H题完赛资料开源,思想开源——(3)控制思想讲解
本文主要为2024电赛智能小车基于CW32单片机控制器的小车云控制平台的控制思想讲解,并简单介绍了调试过程中的挑战和解决思路。
设计经验 发布时间 : 2024-10-09
基于CW32的无刷直流空心杯电机无感方波控制驱动方案
本方案采用CW32F030C8T6作为主控芯片,采用无感方波控制算法控制无刷直流空心杯电机。CW32F030C8T6是一款高性能、低功耗的32位微控制器,具有丰富的片上外设资源,可以适合用于电机控制。无感方波控制算法是一种简单有效的电机控制算法,不需要使用霍尔传感器,可以降低硬件成本。
应用方案 发布时间 : 2024-04-23
【经验】芯源CW32系列MCU电容式触摸按键设计指南
芯源半导体的CW32系列MCU电容式触摸按键设计指南向客户提供利用CW32内部资源结合软件编程实现电容式触摸按键有效触摸检测的方法。本指南内容重点在于工作原理、软件检测过程以及调试指引。通过本文可了解到如何利用内置电压比较器和内置定时器及软件配合,实现灵活方便的按键检测。在介绍标准演示板和演示软件的性能参数同时,还会给出详细的调试建议以及设计参数选择倾向分析,帮助客户快速自信地完成设计并实施调试。
设计经验 发布时间 : 2023-07-27
用免费PCB,做了个很特别的集线器
为简化调试工作,设计了一个集线器,能在5秒内显示连接的COM端口号。集线器采用4to1串口HUB+MCU方案,支持4路TTL串口转USB,并及时提醒USB连接断开。硬件包括CH344Q芯片、CW32单片机、MT9700电源等,尺寸适合免费打样。软件基于标准库,采用裸机编程,上位机用Python编写。项目已开源,旨在提高工作效率。
设计经验 发布时间 : 2024-09-25
电子商城
服务
可加工PCB层数:1-30层;板材类型:FR4板/铝基板/铜基板/刚扰结合板/FPC板/高精密板/Rogers高频板;成品尺寸:5*5mm~53*84cm;板厚:0.1~5.0mm。
最小起订量: 1 提交需求>
可贴PCB板厚范围:0.6~2.0mm,也支持生产软硬接合板,拼板长宽:50*50mm~550*500mm,PCBA快速贴片支持01005CHIP元件。
最小起订量: 1片 提交需求>
登录 | 立即注册
提交评论