美泰MEMS惯性传感器国际百万级装车纪录

时间:2025-04-28  作者:Diven  阅读:0

一、简介

美泰MEMS惯性传感器国际百万级装车纪录

AS608是一款集成了指纹图像采集和指纹比对算法的指纹识别模块。采用了高质量的光学传感器,能够实时采集人体指纹图像,并通过指纹比对算法进行指纹识别。AS608具有高精度、快速、可靠的特点,应用于各种指纹识别场景,如门禁系统、安防系统、考勤系统等。

本实验用到了CW32-48F大学计划板、0.96寸OLED显示屏模块、AS608指纹模块及Keil5开发环境。

二、AS608指纹模块使用说明

(1)引脚说明(该模块共8个引脚,只使用前6个引脚)

da28dd24-4552-11ee-a2ef-92fbcf53809c.png

(2)通讯方法

通过给AS608串口发送特定的指令调用模块内置的算法进行相应的操作。

常用的指令有:

da47356c-4552-11ee-a2ef-92fbcf53809c.png

da6b01c2-4552-11ee-a2ef-92fbcf53809c.png

指令格式有三种:命令包格式、数据包格式结束包格式。

da9979f8-4552-11ee-a2ef-92fbcf53809c.png 
以命令包格式为例,包头是2个字节的数据,固定为0xEF01;芯片地址4个字节,默认是0xFFFFFFFF;包识别用来区分指令类型,如命令包固定为0x01,数据包格式固定为0x02;包长度指这一条指令有多少个重要的数据,包长度=包长度至校验和(指令、参数或数据)的总字节数,包含校验和,但不包含包长度本身的字节数;指令就是需要AS608执行的操作,参数和具体的指令有关,不同的指令,参数的长度和数值都有所不同;校验和是为了确保串口通讯正确。

模块接收到命令后会产生应答,将有关命令执行情况与结果上报给上位机,上位机只有在收到模块的应答包后才能确认模块收包情况与指令执行情况。模块应答包中包含一个参数:确认码。确认码表示执行指令完毕的情况。

dac88f72-4552-11ee-a2ef-92fbcf53809c.png

确认码定义:

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(); //权限管理 }}


审核编辑:刘清

猜您喜欢

光敏电阻,又称光电导体,是对光线敏感的电阻元件,其阻值会随光强的变化而变化。光敏电阻应用于光传感器、自动照明、光电开关等领域。本文将探讨光敏电阻的阻值与光强之间...
2025-04-18 04:00:06

贴片电阻在电子电路中是很重要的配件,主要作用是限制电流的流动,并根据欧姆定律(V=IR)在电路中产生电压降。被应用于各种电子设备,从手机到电脑,再到汽车电子系统...
2024-11-29 10:26:17


PM_13.2X8.5MM_SM是一种重要的电子元件,广泛应用于各类电子产品中。随着科技的迅速发展,该元件的需求不断增加,成为现代电路设计中不可或缺的一部分。本...
2025-02-24 13:02:12

冲击钻、电镐和电锤是建筑和装修中常用的电动工具,各自有不同的分类和用途。冲击钻主要用于钻孔,适合于木材、金属和混凝土等材料。根据功率和转速的不同,冲击钻可以分为...
2013-05-05 00:00:00

贴片电阻,这种小巧的电子元件,在我们的生活中是重要的配件,虽然我们很少注意到,但却应用于各种电子产品中。从我们每天使用的智能手机、电脑和平板电视,到复杂的医疗设...
2024-11-29 10:26:25

汽车电池,如同汽车的心脏,为启动和运行提供着源源不断的电力。而汽车电池充电电路,则是血管的配件,将电能安全高效地输送给电池,确保其时刻保持最佳状态。简单来说,汽...
2024-02-24 00:00:00

作者:阎稳,王国东,姜运生机载计算机的几何结构一般采用高强度机箱和底板来连接各功能模块。底板总线类型大部分采用VME总线规范。VME总线是1981年Motor...
2021-01-19 10:51:00

隔离式ADC(带电源)是高性能的模拟数字转换器,应用于多个领域。在工业自动化中,隔离式ADC能够有效地隔离信号,确保数据采集的准确性和系统的安全性,尤其是在高电...
2012-11-04 00:00:00

高度规作为精密测量工具,应用于多个领域。在建筑和土木工程中,高度规用于确保结构的垂直度和水平度,保证建筑的安全与稳定。在机械制造行业,高度规能够帮助工人准确测量...
2014-07-24 00:00:00