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

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

3天内不再提示

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

武汉芯源半导体 来源:CW32生态社区 2023-08-28 11:30 次阅读

一、简介

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





审核编辑:刘清

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

    关注

    2526

    文章

    48093

    浏览量

    740051
  • 指纹识别
    +关注

    关注

    43

    文章

    1715

    浏览量

    101715
  • 串口通讯
    +关注

    关注

    1

    文章

    249

    浏览量

    24545
  • 上位机
    +关注

    关注

    26

    文章

    861

    浏览量

    54044
  • OLED显示
    +关注

    关注

    1

    文章

    52

    浏览量

    16916

原文标题:【CW32优秀项目展示】基于CW32的AS608指纹模块的应用

文章出处:【微信号:武汉芯源半导体,微信公众号:武汉芯源半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CW32快速开发入门

    CW32快速开发入门
    的头像 发表于 04-24 18:56 804次阅读
    <b class='flag-5'>CW32</b>快速开发入门

    as608上位机连接失败

    AS608是一款常见的指纹识别模块,广泛应用于门禁系统、考勤系统等领域。然而,有时我们在使用过程中会遇到上位机连接失败的情况,导致无法正常工作。本文将详细分析AS608上位机连接失败的
    的头像 发表于 01-05 15:29 833次阅读

    基于CW32的门禁综合系统

    基于CW32单片机的门禁综合系统是一款功能强大的智能门禁解决方案,它提供了三种开锁方式:密码开锁、指纹开锁和刷卡开锁,为用户提供方便、安全的门禁控制。该系统的核心控制器采用了CW32单片机,具备
    的头像 发表于 12-28 11:43 1264次阅读
    基于<b class='flag-5'>CW32</b>的门禁综合系统

    基于CW32的无刷水泵方案

    基于CW32的无刷水泵方案
    的头像 发表于 11-03 17:28 443次阅读
    基于<b class='flag-5'>CW32</b>的无刷水泵方案

    基于CW32的物联网应用

    CW32】基于CW32的物联网应用
    的头像 发表于 11-02 15:55 335次阅读
    基于<b class='flag-5'>CW32</b>的物联网应用

    基于CW32的RC522刷卡模块的应用

    基于CW32的RC522刷卡模块的应用
    的头像 发表于 11-02 14:53 531次阅读
    基于<b class='flag-5'>CW32</b>的RC522刷卡<b class='flag-5'>模块</b>的应用

    2023电赛A题国奖CW32 开源分享

    电赛A题开源分享,主控为CW32
    的头像 发表于 11-02 10:16 783次阅读
    2023电赛A题国奖<b class='flag-5'>CW32</b> 开源分享

    基于CW32热敏电阻采集温度应用

    基于CW32热敏电阻采集温度应用
    的头像 发表于 10-25 16:45 245次阅读
    基于<b class='flag-5'>CW32</b>热敏电阻采集温度应用

    CW32实时时钟(RTC)介绍

    CW32实时时钟(RTC)介绍
    的头像 发表于 10-24 15:36 521次阅读
    <b class='flag-5'>CW32</b>实时时钟(RTC)介绍

    CW32 PWM输出功能介绍

    CW32 PWM输出功能介绍
    的头像 发表于 09-27 16:12 411次阅读
    <b class='flag-5'>CW32</b> PWM输出功能介绍

    AS608指纹模块使用说明

    AS608是一款集成了指纹图像采集和指纹比对算法的指纹识别模块。它采用了高质量的光学传感器,能够实时采集人体
    的头像 发表于 08-24 12:21 1861次阅读
    <b class='flag-5'>AS608</b><b class='flag-5'>指纹</b><b class='flag-5'>模块</b>使用说明

    cw32和stm32的区别

    cw32和stm32的区别 CW32和STM32是两种常见的单片机,被广泛应用于各种电子设备中。在本文中,我们将深入探讨CW32和STM32之间的区别和优劣势。 1. 硬件性能 硬件性能是衡量单片机
    的头像 发表于 08-16 11:15 2248次阅读

    AS608指纹识别模块简介

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

    CW32开发者扶持计划#CW32 #芯片

    CW32
    CW32生态社区
    发布于 :2023年05月24日 16:56:14

    求助,如何连接ESP32 Devkit V1与AS608指纹传感器、NEO-6M gps模块和SIM-900A模块

    我的名字是 anz,我是一名软件工程课程的学生,我对 Arduino 和 ESP 开发还很陌生。我需要帮助来完成分配给我的项目,该项目是使用 ESP32 devkit v1 板和 AS608 指纹
    发表于 05-05 10:39