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

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

3天内不再提示

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

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





审核编辑:刘清

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

    关注

    2550

    文章

    51043

    浏览量

    753106
  • 指纹识别
    +关注

    关注

    43

    文章

    1742

    浏览量

    102232
  • 串口通讯
    +关注

    关注

    1

    文章

    258

    浏览量

    24916
  • 上位机
    +关注

    关注

    27

    文章

    941

    浏览量

    54791
  • OLED显示
    +关注

    关注

    1

    文章

    55

    浏览量

    17001

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

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

收藏 人收藏

    评论

    相关推荐

    CW32模块使用 指纹识别传感器

    光学指纹识别传感器采用了国内著名指纹识别芯片公司杭州晟元芯片威廉希尔官方网站 有限公司(Synochip) 的 AS608 指纹识别芯片。芯片内置 DSP 运算单元,集成了
    的头像 发表于 09-18 15:15 391次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 <b class='flag-5'>指纹</b>识别传感器

    【项目展示】基于CW32的遥控循迹小车

    CW32循迹小车.zip_免费高速下载|百度网盘-分享无限制  一、概述 CW32循迹、遥控小车具有循迹和遥控两种功能,小车的硬件模块CW32F030C8T6小蓝板、智能小车控制底板
    的头像 发表于 05-31 17:33 1295次阅读
    【项目展示】基于<b class='flag-5'>CW32</b>的遥控循迹小车

    基于CW32的有刷直流电机控制实验三:直流电机闭环位置和速度控制实验

    硬件接线说明 实验使用的模块主要有6个:小车主控板(黑色)、CW32F030小蓝板、OLED屏幕、TB6612电机驱动模块、直流减速电机、DAP-Link下载器。 安装好后的图片如下: 如果
    的头像 发表于 05-31 17:01 587次阅读
    基于<b class='flag-5'>CW32</b>的有刷直流电机控制实验三:直流电机闭环位置和速度控制实验

    CW32量产烧录工具

    本节主要介绍CW32微控制器的烧录器CW-Writer,以及与之配合的软件CW-Programmer的使用方法。烧录器CW-Writer通过ISP协议,可实现对
    的头像 发表于 04-25 15:22 1395次阅读
    <b class='flag-5'>CW32</b>量产烧录工具

    CW32快速开发入门

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

    ATK-AS608 指纹模块用户手册

    电子发烧友网站提供《ATK-AS608 指纹模块用户手册.pdf》资料免费下载
    发表于 04-01 09:42 4次下载

    指纹挂锁方案——采用ACH512或ACM32FP4指纹芯片和88*112传感器,指纹识别速度快,BOM成本低

    方案概述指纹挂锁方案采用ACH512或ACM32FP4指纹芯片和88*112传感器,指纹识别速度快,BOM成本低,非常适合挂锁、内门锁、箱包锁、箱柜锁等场景。方案特点• 主控+算法单芯片
    发表于 03-12 11:46

    R503指纹模块用户手册V1

    R503指纹模块
    发表于 01-22 14:09 0次下载

    R307指纹识别模块用户手册

    R307指纹识别模块
    发表于 01-22 14:05 0次下载

    R306指纹识别模块用户手册V1

    R306指纹识别模块
    发表于 01-22 14:03 0次下载

    R303指纹识别模块用户手册

    R303指纹识别模块用户手册1
    发表于 01-22 14:02 1次下载

    R302指纹识别模块用户手册-V1

    R302指纹识别模块用户手册-V1
    发表于 01-22 14:00 1次下载

    R311指纹识别模块用户手册

    R311指纹识别模块用户手册
    发表于 01-19 16:49 3次下载

    as608上位机连接失败

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

    基于CW32的门禁综合系统

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