0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AS608指纹模块使用说明

CW32生态社区 来源:CW32生态社区 2023-08-24 12:21 次阅读

一、简介

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

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

CW32-48F大学计划板

AS608指纹模块

二、AS608指纹模块使用说明

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

(2)通讯方法

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

常用的指令有:

ce8f9f26-4231-11ee-a2ef-92fbcf53809c.png

cea25d78-4231-11ee-a2ef-92fbcf53809c.png

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

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

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

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

四、最终实验现象

cf8c951e-4231-11ee-a2ef-92fbcf53809c.png  

录入指纹
cfdf7edc-4231-11ee-a2ef-92fbcf53809c.png  

识别指纹

d008ede4-4231-11ee-a2ef-92fbcf53809c.png  

删除指纹

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OLED
    +关注

    关注

    119

    文章

    6198

    浏览量

    224084
  • 指纹识别
    +关注

    关注

    43

    文章

    1742

    浏览量

    102230
  • 指纹模块
    +关注

    关注

    0

    文章

    26

    浏览量

    3891
  • CW32
    +关注

    关注

    1

    文章

    203

    浏览量

    626

原文标题:【CW32】基于CW32的AS608指纹模块的应用

文章出处:【微信号:CW32生态社区,微信公众号:CW32生态社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AS608指纹识别模块

    请问AS608指纹识别模块,在断电之后还保持着之前录入的指纹吗?下一次通电是不是不需要再次录入指纹了?
    发表于 04-13 17:01

    AS608模块通过USB转串口线与电脑通讯出现以下错误提示是怎么回事?

    看了《ATK-AS608指纹识别模块用户手册 》中关于上位机测试有关说明:***************以下为原文****************2.5 上位机测试2.5.1 串口模式
    发表于 09-27 00:33

    请问有As608指纹模块基于51单片机的驱动程序代码吗?

    求各位大神分享一下As608指纹模块基于51单片机或者stm32战舰f1的驱动程序代码。谢谢您了
    发表于 03-06 04:35

    怎样去开发一种AS608指纹模块

    AS608指纹模块于51单片机的二次开发前言提要一、初识AS608:二、设计1.思路2.上原理图:3.程序设计中需要注意的几个点:串口:总结前言提要记得好久之前听老师说:你们有一个学姐
    发表于 07-13 07:32

    怎样去设计一种基于stm32VE的AS608指纹解锁模块

    基于stm32VE的AS608指纹解锁模块是怎样工作的?怎样去设计一种基于stm32VE的AS608指纹解锁
    发表于 02-14 07:58

    STM32+AS608指纹模块串口通讯过程是怎样的?

    STM32+AS608指纹模块串口通讯过程是怎样的?
    发表于 02-18 06:56

    如何去实现基于AS608指纹+STM32串口通信的指纹录入设计呢

    AS608指纹识别模块是什么?如何去实现基于AS608指纹+STM32串口通信的指纹录入设计呢?
    发表于 02-18 06:37

    请问怎样将as608指纹采集模块指纹图像传到电脑里面?

    请问怎样将as608指纹采集模块指纹图像传到电脑里面?
    发表于 06-05 15:08

    基于51单片机AS608指纹自动识别电路设计(毕业设计)

    本设计是基于STC89C52单片机的指纹识别设计,采用AS608指纹模块做为传感器,LCD1602显示屏显示信息。具有指纹添加,
    发表于 11-05 09:21 46次下载
    基于51单片机<b class='flag-5'>AS608</b><b class='flag-5'>指纹</b>自动识别电路设计(毕业设计)

    ATK-AS608指纹模块用户手册

    )的 AS608 指纹识别芯片。芯片内置 DSP 运算单元,集成了指纹识别算法,能高效快速采集图像并识别指纹特征。模块配备了串口、USB 通
    发表于 11-15 09:34 299次下载

    STM32+AS608指纹模块串口通讯

    STM32+AS08指纹模块串口通讯一. 使用硬件:stm32F103 -mini stm32开发板+AS608指纹模块+usb转串口实物图
    发表于 12-24 18:47 38次下载
    STM32+AS<b class='flag-5'>608</b><b class='flag-5'>指纹</b><b class='flag-5'>模块</b>串口通讯

    AS608指纹+STM32串口通信录入或删除指纹

    目录一、硬件使用分类1.整体图展示2.STM32F103RCT6单片机3.AS608指纹模块4.USB转TTL一、硬件使用分类1.整体图展示采用STM32F103RCT6作为
    发表于 12-24 18:55 30次下载
    <b class='flag-5'>AS608</b><b class='flag-5'>指纹</b>+STM32串口通信录入或删除<b class='flag-5'>指纹</b>

    一文详解AS608指纹识别模块

    AS608 指纹识别模块主要是采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹
    的头像 发表于 04-14 14:53 2.8w次阅读
    一文详解<b class='flag-5'>AS608</b><b class='flag-5'>指纹</b>识别<b class='flag-5'>模块</b>

    AS608指纹识别模块简介

    AS608 指纹识别模块主要是采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹
    的头像 发表于 06-21 15:08 2973次阅读
    <b class='flag-5'>AS608</b><b class='flag-5'>指纹</b>识别<b class='flag-5'>模块</b>简介

    基于CW32的AS608指纹模块的应用

    AS608是一款集成了指纹图像采集和指纹比对算法的指纹识别模块
    的头像 发表于 08-28 11:30 1541次阅读
    基于CW32的<b class='flag-5'>AS608</b><b class='flag-5'>指纹</b><b class='flag-5'>模块</b>的应用