【经验】基于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的RC522刷卡模块的应用实验分享
RC522刷卡模块是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员,是NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片。
设计经验 发布时间 : 2023-12-26
【经验】芯源CW32系列单片机低功耗模式介绍及UART深度休眠模式示例
CW32单片机低功耗模式介绍及UART深度休眠模式示例。
设计经验 发布时间 : 2023-05-31
ESD测试是什么?武汉芯源的CW32能扛8000V?
ESD测试是确保电子设备在静电放电环境下稳定运行的重要手段之一。通过不断完善测试标准和规范、采用先进的测试设备和技术、加强测试人员的培训和管理等措施,可以进一步提高测试结果的准确性和可靠性。
设计经验 发布时间 : 2024-08-21
【技术】武汉芯源CW32单片机UART基本数据收发功能介绍
通用异步收发器是一种通用串行数据总线,常用于系统内各子模块间的数据交换。本文将以武汉芯源推出的CW32系列单片机的CW32L083为例,介绍UART基本数据收发功能。
技术探讨 发布时间 : 2023-04-25
【CW32】基于CW32的GY-33颜色识别模块的应用
GY-33是一种基于TCS34725颜色传感器的颜色识别模块。TCS34725是一种高精度光学传感器,能够检测红、绿、蓝三个基本色的光谱信息,从而实现对物体颜色的准确识别,本实验使用到了CW32F030C8小蓝板、GY-33颜色识别模块、0.96寸OLED显示屏,RGB全彩LED模块、轻触开关模块及Keil5开发环境
厂牌及品类 发布时间 : 2023-09-30
基于CW32的仪表精度测量实现(二):不同的信号采用的滤波算法
对于低频信号可以采用低通滤波器滤波,低通滤波器的主要功能是允许低频信号通过,同时抑制高于某个特定截止频率的高频信号。低通滤波可以简单的认为:设定一个频率点,当信号频率高于这个频率时不能通过。
设计经验 发布时间 : 2024-08-17
如何使用CW32单片机通过ESP8266连接OneNET物联网平台,发送温湿度数据到平台,并接受平台的云控制?
本实验使用到了CW32-48F大学计划开发板、DHT11温湿度传感器模块、ESP8266WIFI模块及Keil5开发环境。
设计经验 发布时间 : 2023-12-06
基于CW32的无刷直流空心杯电机有感控制驱动方案
空心杯电机(Hollow-Cup Motor)是一种特殊类型的微型无刷直流电机,具有空心的旋转部分。它通常由外部固定的外壳和内部旋转的空心杯组成。空心杯电机具有较高的功率密度和扭矩输出,适用于一些特定的应用场景,如精密仪器、机器人、医疗设备等。空心杯电机的工作原理是基于无刷直流电机的原理。它采用无刷电机的结构,包括定子(固定部分)和转子(旋转部分)。
应用方案 发布时间 : 2024-05-16
解析CW32单片机的独立看门狗IWDT和窗口看门狗WWDT
看门狗在那些对安全性和稳定性要求较高的应用中特别重要,如工业控制、汽车电子、医疗设备和航空航天等领域。通过使用看门狗,可以大大减少系统因软件故障而导致的长时间不可用或错误操作的风险。本文介绍CW32单片机的两个看门狗:独立看门狗IWDT和窗口看门狗WWDT。
技术探讨 发布时间 : 2024-08-17
【应用】基于CW32的无刷水泵控制系统,使水泵更加节能、高效
本课题研究的目的是设计一套基于CW32的无位置传感器无刷直流电机控制系统,既可以改进水泵的工作模式,使水泵工作点最优;又可以使水泵电机结构简单,控制方式更为灵活。以此将整个系统加入各个不同场景中,让CW32低功耗优点,能让水泵共更加节能,高效。
应用方案 发布时间 : 2023-09-15
武汉芯源半导体邀您相约CITE2024中国电子信息博览会
CITE2024第十二届中国电子信息博览会将于2024年4月9-11日在深圳福田会展中心隆重开展,武汉芯源半导体将为电子行业参观者展示智能指纹锁、麦克风、燃气表、LED调光板、可燃气体报警器、筋膜枪、角磨机、血氧仪、温控器、BLDC无刷电机、永磁同步电机无感FOC控制方案等多款CW32单片机典型应用方案,诚邀您莅临9B122武汉芯源半导体展位参观交流!
厂牌及品类 发布时间 : 2024-04-05
基于CW32的仪表精度测量实现(一):相关滤波原理
滤波的概念滤波是指通过某种方法将信号中的某些频率成分增强或抑制,达到去除噪声、改善信号质量、分离信号等目的的过程。滤波器是实现滤波功能的关键组件,它可以改变信号的频谱特性,对不同频率区域的信号进行处理。
设计经验 发布时间 : 2024-08-17
基于CW32的无刷直流空心杯电机无感方波控制驱动方案
本方案采用CW32F030C8T6作为主控芯片,采用无感方波控制算法控制无刷直流空心杯电机。CW32F030C8T6是一款高性能、低功耗的32位微控制器,具有丰富的片上外设资源,可以适合用于电机控制。无感方波控制算法是一种简单有效的电机控制算法,不需要使用霍尔传感器,可以降低硬件成本。
应用方案 发布时间 : 2024-04-23
使用JLink烧录CW32程序
本篇主要介绍使用JLink烧录CW32程序。
设计经验 发布时间 : 2024-03-15
持续奋进,快速完善自有32位超低功耗MCU产品阵容
7月25日,2024全球MCU生态发展大会在深圳隆重召开,武汉芯源半导体在现场为电子行业参观者展示了多款MCU典型应用方案。,武汉芯源半导体技术总监张亚凡发表了主题演讲《持续奋进,快速完善自有32位超低功耗MCU产品阵容》,在宏观方面展示现有产品布局和未来产品计划,在微观方面展示产品外设细节功能的改进。
厂牌及品类 发布时间 : 2024-08-16
电子商城
服务
可加工PCB层数:1-30层;板材类型:FR4板/铝基板/铜基板/刚扰结合板/FPC板/高精密板/Rogers高频板;成品尺寸:5*5mm~53*84cm;板厚:0.1~5.0mm。
最小起订量: 1 提交需求>
可加工PCB板层数:1~30层,板材类型:单双面板/多层板/HDI盲埋孔板/高频高速板/微波射频天线板/高精度阻抗板/厚铜板/微波FR4/耐腐蚀光模块PCB等,成品尺寸:5*5cm~58*70cm; 板厚0.2~6mm。
最小起订量: 1 提交需求>
登录 | 立即注册
提交评论