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





审核编辑:刘清

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

    关注

    2573

    文章

    54378

    浏览量

    786096
  • 指纹识别
    +关注

    关注

    43

    文章

    1753

    浏览量

    104446
  • 串口通讯
    +关注

    关注

    2

    文章

    266

    浏览量

    26219
  • 上位机
    +关注

    关注

    27

    文章

    994

    浏览量

    56713
  • OLED显示
    +关注

    关注

    1

    文章

    57

    浏览量

    17415

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    智能指纹CW32系列有哪些应用场景?

    智能指纹CW32系列有哪些应用场景
    发表于 12-05 06:34

    CW32单片机在智能马桶的应用

    1.温度感应与控制 智能马桶内设有温度传感器,通过CW32单片机的处理,可以实时感知到用户所需的座圈温度并根据用户的设定进行调节。当温度过高或过低时,单片机将发出信号,通过控制模块对座圈的加热或制冷
    发表于 12-04 08:01

    基于芯源CW32 MCU的LED闪烁示例及代码分析

    最近我在项目中使用了芯源的CW32 MCU,这是一款非常适合物联网和低功耗应用的微控制器。在初步学习和使用中,我做了一个简单的LED闪烁实验,通过这篇帖子给大家分享一下代码及相关的配置步骤。 硬件
    发表于 12-04 06:52

    CW32 MCU温度监测应用

    监测环境温度,并通过串口将数据发送到PC端进行显示。 硬件连接 CW32 MCU LM35温度传感器 USB转串口模块 代码实现 #include \"cw32f030.h\"
    发表于 12-03 08:03

    cw32 systick怎么用?

    cw32 systick怎么用
    发表于 12-01 08:10

    使用J-Flash来编程CW32 MCU

    1.安装J-Flash: 从SEGGER官方网站下载最新版本的J-Flash工具。 按照安装向导的指示完成安装过程。 2.连接硬件: 将CW32 MCU通过调试器(如J-LINK)连接到你的计算机
    发表于 11-25 07:00

    CW32 MCU用什么IDE开发?

    推荐使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE开发CW32 MCU应用,其中新版本IAR EWARM直接支持CW32 MCU,Keil MDK-ARM则需要安装CW
    发表于 11-12 07:52

    CW32 MCU有哪些系列?

    目前CW32 MCU有通用高性能MCU、安全低功耗MCU、无线射频MCU等3个系列。其中射频MCU集成了无线收发器,主要包括CW32R031(2.4GHz BLE-Lite)系列和CW32W031(Sub-1G)系列。
    发表于 11-12 07:34

    如何使用新版本J-Flash编程CW32 MCU

    :AppData是隐藏目录,需打开显示。 3、将CW32 MCU器件支持包JlinkDevices_WHXY.rar解压到新建的JlinkDevices子目录即可。 4、运行JFlash.exe,通过Jlink连接CW32 MCU测试板,进行编程测试ok。
    发表于 11-12 07:24

    CW32 MCU的工作电压、工作温度是多少?

    CW32通用型MCU工作电压是1.65V~5.5V,射频MCU工作电压则是1.8V/2.2V~3.6V;通用型CW32F系列MCU,比如:CW32F030、CW32F020、
    发表于 11-12 06:49

    CW32 MCU用什么仿真器开发?

    理论上各主流IDE枚举的、支持ARM Cortex内核的所有硬件仿真器,比如:J-LINK,ULINK,DAP,ST-Link等,都可以仿真、下载CW32 MCU的应用代码。如果想实现量产或者离线下载应用代码,则必须配套支持CW32 MCU的PC端软件,因此推荐使用
    发表于 11-12 06:01

    如何使用新版本J-Flash编程CW32 MCU?

    CW32 MCU器件支持包JlinkDevices_WHXY.rar解压到新建的JlinkDevices子目录即可。 4、运行JFlash.exe,通过Jlink连接CW32 MCU测试板,进行编程测试
    的头像 发表于 07-01 15:05 465次阅读
    如何使用新版本J-Flash编程<b class='flag-5'>CW32</b> MCU?

    回收三星S21指纹排线 适用于三星系列指纹模组

    深圳帝欧电子回收三星S21指纹排线,收购适用于三星S21指纹模组。回收三星指纹排线,收购三星指纹排线,全国高价回收三星指纹排线,专业求购
    发表于 05-19 10:05

    代码+案例+生态:武汉芯源半导体CW32嵌入式开发实战正式出版

    尊敬的各位电子工程师、嵌入式开发爱好者们:大家好!今天,我们怀着无比激动与自豪的心情,向大家宣布一个重大喜讯——武汉芯源半导体的单片机CW32正式出书啦!《基于ARMCortex-M0+的CW32
    的头像 发表于 03-03 15:15 1014次阅读
    代码+案例+生态:武汉芯源半导体<b class='flag-5'>CW32</b>嵌入式开发实战正式出版

    代码+案例+生态:武汉芯源半导体CW32嵌入式开发实战正式出版

    尊敬的各位电子工程师、嵌入式开发爱好者们: 大家好!今天,我们怀着无比激动与自豪的心情,向大家宣布一个重大喜讯——武汉芯源半导体的单片机CW32正式出书啦!《基于ARM Cortex-M0+
    发表于 03-03 15:14