0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AS608指紋識(shí)別模塊簡(jiǎn)介

CHANBAEK ? 來(lái)源:物聯(lián)網(wǎng)知識(shí) ? 作者:跋扈洋 ? 2023-06-21 15:08 ? 次閱讀

一、 簡(jiǎn)介

AS608 指紋識(shí)別模塊主要是指采用了杭州晟元芯片技術(shù)有限公司(Synochip)的 AS608 指紋識(shí)別芯片 而做成的指紋模塊,模塊廠商只是基于該芯片設(shè)計(jì)外圍電路,集成一個(gè)可供2次開(kāi)發(fā)的指紋模塊;所以,只要是基于AS608芯片的指紋模塊,其控制電路及控制協(xié)議幾乎是一樣的,只是廠家和性能不同而已。

三、 AS608模塊引腳描述

Vi 模塊電源正輸入端。

Tx 串行數(shù)據(jù)輸出。TTL 邏輯電平

Rx 串行數(shù)據(jù)輸入。TTL 邏輯電平

GND 信號(hào)地。內(nèi)部與電源地連接

WAK 感應(yīng)信號(hào)輸出,默認(rèn)高電平有效

(用戶可讀取狀態(tài)引腳(WAK)判斷有無(wú)手指按下)

Vt 觸摸感應(yīng)電源輸入端,.3v 供電

U+ USB D+

U- USB D-

四、開(kāi)發(fā)流程

圖片

圖片

程序

AS608.H

#ifndef __AS608_H
  #define __AS608_H
  #include < stdio.h >
  #include "stm32f10x.h" 
  #define AS608_USER     1
  #define PS_Sta   PAin(6)//讀指紋模塊狀態(tài)引腳
  #define CharBuffer1 0x01
  #define CharBuffer2 0x02

  extern u32 AS608Addr;//模塊地址


  typedef struct  
  {
    u16 pageID;//指紋ID
    u16 mathscore;//匹配得分
}SearchResult;
  typedef struct
  {
    u16 PS_max;//指紋最大容量
    u8  PS_level;//安全等級(jí)
  u32 PS_addr;
    u8  PS_size;//通訊數(shù)據(jù)包大小
    u8  PS_N;//波特率基數(shù)N
}SysPara;
  void PS_StaGPIO_Init(void);//初始化PA6讀狀態(tài)引腳
  u8 PS_GetImage(void); //錄入圖像 
  u8 PS_GenChar(u8 BufferID);//生成特征 
  u8 PS_Match(void);//精確比對(duì)兩枚指紋特征 
  u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//搜索指紋 
  u8 PS_RegModel(void);//合并特征(生成模板) 

  u8 PS_StoreChar(u8 BufferID,u16 PageID);//儲(chǔ)存模板 
  u8 PS_DeletChar(u16 PageID,u16 N);//刪除模板 
u8 PS_Empty(void);//清空指紋庫(kù) 


  u8 PS_WriteReg(u8 RegNum,u8 DATA);//寫系統(tǒng)寄存器 

  u8 PS_ReadSysPara(SysPara *p); //讀系統(tǒng)基本參數(shù) 


  u8 PS_SetAddr(u32 addr);  //設(shè)置模塊地址 

  u8 PS_WriteNotepad(u8 NotePageNum,u8 *content);//寫記事本 


u8 PS_ReadNotepad(u8 NotePageNum,u8 *note);//讀記事 

  u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//高速搜索 

  u8 PS_ValidTempleteNum(u16 *ValidN);//讀有效模板個(gè)數(shù) 

  u8 PS_HandShake(u32 *PS_Addr); //與AS608模塊握手

  const char *EnsureMessage(u8 ensure);//確認(rèn)碼錯(cuò)誤信息解析

  #endif

AS608.C

#include < string.h >
#include "delay.h"   
#include "usart2.h"
#include "as608.h"


u32 AS608Addr = 0XFFFFFFFF; //默認(rèn)


//初始化PA6為下拉輸入        
//讀摸出感應(yīng)狀態(tài)(觸摸感應(yīng)時(shí)輸出高電平信號(hào))
void PS_StaGPIO_Init(void)
{   
  RCC- >APB1ENR |= 1< 2;//使能PORTA時(shí)鐘
  GPIOA- >CRL &=0XF0FFFFFF;//復(fù)位PA6
  GPIOA- >CRL |=0X08000000;//輸入模式,默認(rèn)下拉
  GPIOA- >ODR &=~(1< 6);//下拉
}
//串口發(fā)送一個(gè)字節(jié)
static void MYUSART_SendData(u8 data)
{
  while((USART2- >SR&0X40)==0); 
  USART2- >DR = data;
}
//發(fā)送包頭
static void SendHead(void)
{
  MYUSART_SendData(0xEF);
  MYUSART_SendData(0x01);
}
//發(fā)送地址
static void SendAddr(void)
{
  MYUSART_SendData(AS608Addr >>24);
  MYUSART_SendData(AS608Addr >>16);
  MYUSART_SendData(AS608Addr >>8);
  MYUSART_SendData(AS608Addr);
}
//發(fā)送包標(biāo)識(shí),
static void SendFlag(u8 flag)
{
  MYUSART_SendData(flag);
}
//發(fā)送包長(zhǎng)度
static void SendLength(int length)
{
  MYUSART_SendData(length >>8);
  MYUSART_SendData(length);
}
//發(fā)送指令碼
static void Sendcmd(u8 cmd)
{
  MYUSART_SendData(cmd);
}
//發(fā)送校驗(yàn)和
static void SendCheck(u16 check)
{
  MYUSART_SendData(check >>8);
  MYUSART_SendData(check);
}
//判斷中斷接收的數(shù)組有沒(méi)有應(yīng)答包
//waittime為等待中斷接收數(shù)據(jù)的時(shí)間(單位1ms)
//返回值:數(shù)據(jù)包首地址
static u8 *JudgeStr(u16 waittime)
{
  char *data;
  u8 str[8];
  str[0]=0xef;str[1]=0x01;str[2]=AS608Addr >>24;
  str[3]=AS608Addr >>16;str[4]=AS608Addr >>8;
  str[5]=AS608Addr;str[6]=0x07;str[7]='\\0';
  USART2_RX_STA=0;
  while(--waittime)
  {
    delay_ms(1);
    if(USART2_RX_STA&0X8000)//接收到一次數(shù)據(jù)
    {
      USART2_RX_STA=0;
      data=strstr((const char*)USART2_RX_BUF,(const char*)str);
      if(data)
        return (u8*)data;  
    }
  }
  return 0;
}
//錄入圖像 PS_GetImage
//功能:探測(cè)手指,探測(cè)到后錄入指紋圖像存于ImageBuffer。
//模塊返回確認(rèn)字
u8 PS_GetImage(void)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x03);
  Sendcmd(0x01);
  temp =  0x01+0x03+0x01;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  return ensure;
}
//生成特征 PS_GenChar
//功能:將ImageBuffer中的原始圖像生成指紋特征文件存于CharBuffer1或CharBuffer2       
//參數(shù):BufferID -- > charBuffer1:0x01  charBuffer1:0x02                        
//模塊返回確認(rèn)字
u8 PS_GenChar(u8 BufferID)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x04);
  Sendcmd(0x02);
  MYUSART_SendData(BufferID);
  temp = 0x01+0x04+0x02+BufferID;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  return ensure;
}
//精確比對(duì)兩枚指紋特征 PS_Match
//功能:精確比對(duì)CharBuffer1 與CharBuffer2 中的特征文件 
//模塊返回確認(rèn)字
u8 PS_Match(void)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x03);
  Sendcmd(0x03);
  temp = 0x01+0x03+0x03;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  return ensure;
}
//搜索指紋 PS_Search
//功能:以CharBuffer1或CharBuffer2中的特征文件搜索整個(gè)或部分指紋庫(kù).若搜索到,則返回頁(yè)碼。
//參數(shù):  BufferID @ref CharBuffer1  CharBuffer2
//說(shuō)明:  模塊返回確認(rèn)字,頁(yè)碼(相配指紋模板)
u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x08);
  Sendcmd(0x04);
  MYUSART_SendData(BufferID);
  MYUSART_SendData(StartPage >>8);
  MYUSART_SendData(StartPage);
  MYUSART_SendData(PageNum >>8);
  MYUSART_SendData(PageNum);
  temp = 0x01+0x08+0x04+BufferID
  +(StartPage >>8)+(u8)StartPage
  +(PageNum >>8)+(u8)PageNum;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
  {
    ensure = data[9];
    p- >pageID   =(data[10]< 8)+data[11];
    p- >mathscore=(data[12]< 8)+data[13];  
  }
  else
    ensure = 0xff;
  return ensure;  
}
//合并特征(生成模板)PS_RegModel
//功能:將CharBuffer1與CharBuffer2中的特征文件合并生成 模板,結(jié)果存于CharBuffer1與CharBuffer2  
//說(shuō)明:  模塊返回確認(rèn)字
u8 PS_RegModel(void)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x03);
  Sendcmd(0x05);
  temp = 0x01+0x03+0x05;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  return ensure;    
}
//儲(chǔ)存模板 PS_StoreChar
//功能:將 CharBuffer1 或 CharBuffer2 中的模板文件存到 PageID 號(hào)flash數(shù)據(jù)庫(kù)位置。
//參數(shù):  BufferID @ref charBuffer1:0x01  charBuffer1:0x02
//       PageID(指紋庫(kù)位置號(hào))
//說(shuō)明:  模塊返回確認(rèn)字
u8 PS_StoreChar(u8 BufferID,u16 PageID)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x06);
  Sendcmd(0x06);
  MYUSART_SendData(BufferID);
  MYUSART_SendData(PageID >>8);
  MYUSART_SendData(PageID);
  temp = 0x01+0x06+0x06+BufferID
  +(PageID >>8)+(u8)PageID;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  return ensure;  
}
//刪除模板 PS_DeletChar
//功能:  刪除flash數(shù)據(jù)庫(kù)中指定ID號(hào)開(kāi)始的N個(gè)指紋模板
//參數(shù):  PageID(指紋庫(kù)模板號(hào)),N刪除的模板個(gè)數(shù)。
//說(shuō)明:  模塊返回確認(rèn)字
u8 PS_DeletChar(u16 PageID,u16 N)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x07);
  Sendcmd(0x0C);
  MYUSART_SendData(PageID >>8);
  MYUSART_SendData(PageID);
  MYUSART_SendData(N >>8);
  MYUSART_SendData(N);
  temp = 0x01+0x07+0x0C
  +(PageID >>8)+(u8)PageID
  +(N >>8)+(u8)N;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  return ensure;
}
//清空指紋庫(kù) PS_Empty
//功能:  刪除flash數(shù)據(jù)庫(kù)中所有指紋模板
//參數(shù):  無(wú)
//說(shuō)明:  模塊返回確認(rèn)字
u8 PS_Empty(void)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x03);
  Sendcmd(0x0D);
  temp = 0x01+0x03+0x0D;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  return ensure;
}
//寫系統(tǒng)寄存器 PS_WriteReg
//功能:  寫模塊寄存器
//參數(shù):  寄存器序號(hào)RegNum:4\\5\\6
//說(shuō)明:  模塊返回確認(rèn)字
u8 PS_WriteReg(u8 RegNum,u8 DATA)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x05);
  Sendcmd(0x0E);
  MYUSART_SendData(RegNum);
  MYUSART_SendData(DATA);
  temp = RegNum+DATA+0x01+0x05+0x0E;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  if(ensure==0)
    printf("\\r\\n設(shè)置參數(shù)成功!");
  else
    printf("\\r\\n%s",EnsureMessage(ensure));
  return ensure;
}
//讀系統(tǒng)基本參數(shù) PS_ReadSysPara
//功能:  讀取模塊的基本參數(shù)(波特率,包大小等)
//參數(shù):  無(wú)
//說(shuō)明:  模塊返回確認(rèn)字 + 基本參數(shù)(16bytes)
u8 PS_ReadSysPara(SysPara *p)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x03);
  Sendcmd(0x0F);
  temp = 0x01+0x03+0x0F;
  SendCheck(temp);
  data=JudgeStr(1000);
  if(data)
  {
    ensure = data[9];
    p- >PS_max = (data[14]< 8)+data[15];
    p- >PS_level = data[17];
    p- >PS_addr=(data[18]< 24)+(data[19]< 16)+(data[20]< 8)+data[21];
    p- >PS_size = data[23];
    p- >PS_N = data[25];
  }    
  else
    ensure=0xff;
  if(ensure==0x00)
  {
    printf("\\r\\n模塊最大指紋容量=%d",p- >PS_max);
    printf("\\r\\n對(duì)比等級(jí)=%d",p- >PS_level);
    printf("\\r\\n地址=%x",p- >PS_addr);
    printf("\\r\\n波特率=%d",p- >PS_N*9600);
  }
  else 
      printf("\\r\\n%s",EnsureMessage(ensure));
  return ensure;
}
//設(shè)置模塊地址 PS_SetAddr
//功能:  設(shè)置模塊地址
//參數(shù):  PS_addr
//說(shuō)明:  模塊返回確認(rèn)字
u8 PS_SetAddr(u32 PS_addr)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x07);
  Sendcmd(0x15);
  MYUSART_SendData(PS_addr >>24);
  MYUSART_SendData(PS_addr >>16);
  MYUSART_SendData(PS_addr >>8);
  MYUSART_SendData(PS_addr);
  temp = 0x01+0x07+0x15
  +(u8)(PS_addr >>24)+(u8)(PS_addr >>16)
  +(u8)(PS_addr >>8) +(u8)PS_addr;        
  SendCheck(temp);
  AS608Addr=PS_addr;//發(fā)送完指令,更換地址
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;  
    AS608Addr = PS_addr;
  if(ensure==0x00)
    printf("\\r\\n設(shè)置地址成功!");
  else
    printf("\\r\\n%s",EnsureMessage(ensure));
  return ensure;
}
//功能:模塊內(nèi)部為用戶開(kāi)辟了256bytes的FLASH空間用于存用戶記事本,
//  該記事本邏輯上被分成 16 個(gè)頁(yè)。
//參數(shù):  NotePageNum(0~15),Byte32(要寫入內(nèi)容,32個(gè)字節(jié))
//說(shuō)明:  模塊返回確認(rèn)字
u8 PS_WriteNotepad(u8 NotePageNum,u8 *Byte32)
{
  u16 temp;
  u8  ensure,i;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(36);
  Sendcmd(0x18);
  MYUSART_SendData(NotePageNum);
  for(i=0;i< 32;i++)
   {
     MYUSART_SendData(Byte32[i]);
     temp += Byte32[i];
   }
  temp =0x01+36+0x18+NotePageNum+temp;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
    ensure=data[9];
  else
    ensure=0xff;
  return ensure;
}
//讀記事PS_ReadNotepad
//功能:讀取FLASH用戶區(qū)的128bytes數(shù)據(jù)
//參數(shù):  NotePageNum(0~15)
//說(shuō)明:  模塊返回確認(rèn)字+用戶信息
u8 PS_ReadNotepad(u8 NotePageNum,u8 *Byte32)
{
  u16 temp;
  u8  ensure,i;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x04);
  Sendcmd(0x19);
  MYUSART_SendData(NotePageNum);
  temp = 0x01+0x04+0x19+NotePageNum;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
  {
    ensure=data[9];
    for(i=0;i< 32;i++)
    {
      Byte32[i]=data[10+i];
    }
  }
  else
    ensure=0xff;
  return ensure;
}
//高速搜索PS_HighSpeedSearch
//功能:以 CharBuffer1或CharBuffer2中的特征文件高速搜索整個(gè)或部分指紋庫(kù)。
//      若搜索到,則返回頁(yè)碼,該指令對(duì)于的確存在于指紋庫(kù)中 ,且登錄時(shí)質(zhì)量
//      很好的指紋,會(huì)很快給出搜索結(jié)果。
//參數(shù):  BufferID, StartPage(起始頁(yè)),PageNum(頁(yè)數(shù))
//說(shuō)明:  模塊返回確認(rèn)字+頁(yè)碼(相配指紋模板)
u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x08);
  Sendcmd(0x1b);
  MYUSART_SendData(BufferID);
  MYUSART_SendData(StartPage >>8);
  MYUSART_SendData(StartPage);
  MYUSART_SendData(PageNum >>8);
  MYUSART_SendData(PageNum);
  temp = 0x01+0x08+0x1b+BufferID
  +(StartPage >>8)+(u8)StartPage
  +(PageNum >>8)+(u8)PageNum;
  SendCheck(temp);
  data=JudgeStr(2000);
   if(data)
  {
    ensure=data[9];
    p- >pageID   =(data[10]< 8) +data[11];
    p- >mathscore=(data[12]< 8) +data[13];
  }
  else
    ensure=0xff;
  return ensure;
}
//讀有效模板個(gè)數(shù) PS_ValidTempleteNum
//功能:讀有效模板個(gè)數(shù)
//參數(shù): 無(wú)
//說(shuō)明: 模塊返回確認(rèn)字+有效模板個(gè)數(shù)ValidN
u8 PS_ValidTempleteNum(u16 *ValidN)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//命令包標(biāo)識(shí)
  SendLength(0x03);
  Sendcmd(0x1d);
  temp = 0x01+0x03+0x1d;
  SendCheck(temp);
  data=JudgeStr(2000);
  if(data)
  {
    ensure=data[9];
    *ValidN = (data[10]< 8) +data[11];
  }    
  else
    ensure=0xff;

  if(ensure==0x00)
  {
    printf("\\r\\n有效指紋個(gè)數(shù)=%d",(data[10]< 8)+data[11]);
  }
  else
    printf("\\r\\n%s",EnsureMessage(ensure));
  return ensure;
}
//與AS608握手 PS_HandShake
//參數(shù): PS_Addr地址指針
//說(shuō)明: 模塊返新地址(正確地址)  
u8 PS_HandShake(u32 *PS_Addr)
{  
  SendHead();
  SendAddr();
  MYUSART_SendData(0X01);
  MYUSART_SendData(0X00);
  MYUSART_SendData(0X00);
  delay_ms(200);
  if(USART2_RX_STA&0X8000)//接收到數(shù)據(jù)
  {    
    if(//判斷是不是模塊返回的應(yīng)答包        
          USART2_RX_BUF[0]==0XEF
        &&USART2_RX_BUF[1]==0X01
        &&USART2_RX_BUF[6]==0X07
      )
      {
        *PS_Addr=(USART2_RX_BUF[2]< 24) + (USART2_RX_BUF[3]< 16)
                +(USART2_RX_BUF[4]< 8) + (USART2_RX_BUF[5]);
        USART2_RX_STA=0;
        return 0;
      }
    USART2_RX_STA=0;          
  }
  return 1;    
}
//模塊應(yīng)答包確認(rèn)碼信息解析
//功能:解析確認(rèn)碼錯(cuò)誤信息返回信息
//參數(shù): ensure
const char *EnsureMessage(u8 ensure) 
{
  const char *p;
  switch(ensure)
  {
    case  0x00:
      p="OK";break;    
    case  0x01:
      p="數(shù)據(jù)包接收錯(cuò)誤";break;
    case  0x02:
      p="傳感器上沒(méi)有手指";break;
    case  0x03:
      p="錄入指紋圖像失敗";break;
    case  0x04:
      p="指紋圖像太干、太淡而生不成特征";break;
    case  0x05:
      p="指紋圖像太濕、太糊而生不成特征";break;
    case  0x06:
      p="指紋圖像太亂而生不成特征";break;
    case  0x07:
      p="指紋圖像正常,但特征點(diǎn)太少(或面積太?。┒怀商卣?;break;
    case  0x08:
      p="指紋不匹配";break;
    case  0x09:
      p="沒(méi)搜索到指紋";break;
    case  0x0a:
      p="特征合并失敗";break;
    case  0x0b:
      p="訪問(wèn)指紋庫(kù)時(shí)地址序號(hào)超出指紋庫(kù)范圍";
    case  0x10:
      p="刪除模板失敗";break;
    case  0x11:
      p="清空指紋庫(kù)失敗";break;  
    case  0x15:
      p="緩沖區(qū)內(nèi)沒(méi)有有效原始圖而生不成圖像";break;
    case  0x18:
      p="讀寫 FLASH 出錯(cuò)";break;
    case  0x19:
      p="未定義錯(cuò)誤";break;
    case  0x1a:
      p="無(wú)效寄存器號(hào)";break;
    case  0x1b:
      p="寄存器設(shè)定內(nèi)容錯(cuò)誤";break;
    case  0x1c:
      p="記事本頁(yè)碼指定錯(cuò)誤";break;
    case  0x1f:
      p="指紋庫(kù)滿";break;
    case  0x20:
      p="地址錯(cuò)誤";break;
    default :
      p="模塊返回確認(rèn)碼有誤";break;
  }
 return p;  
}

刷指紋

void press_FR(void)
{
  SearchResult seach;
  u8 ensure;
  ensure=PS_GetImage();
  if(ensure==0x00)//獲取圖像成功 
  {  
    ensure=PS_GenChar(CharBuffer1);
    if(ensure==0x00) //生成特征成功
    {    
      ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);
      if(ensure==0x00)//搜索成功
      {        
        printf("search the fingerprint successfully\\n");//搜索指紋成功        

        printf("Match ID:%d  Match score:%d\\n",seach.pageID,seach.mathscore);//顯示匹配指紋的ID和分?jǐn)?shù)


        if(seach.pageID==0)
          LED=0;
      }
      else 
      {
        printf("%c",ensure);    
          LED=1;
      }        
    }
    else
      printf("%c",ensure);
   delay_ms(1000);//延時(shí)后清除顯示
   printf("\\n");
  }

}

錄入指紋

void Add_FR(void)
{
  u8 i=0,ensure ,processnum=0;
  u16 ID;
  while(1)
  {
    switch (processnum)
    {
      case 0:
        i++;
        printf("please finger\\n");   //請(qǐng)按手指
        ensure=PS_GetImage();//錄入圖像返回字
        if(ensure==0x00) 
        {
          ensure=PS_GenChar(CharBuffer1);//生成特征
          if(ensure==0x00)
          {
            printf("zhengque\\n");//指紋正確
            i=0;
            processnum=1;//跳到第二步            
          }
          else printf("%c\\n",ensure);          
        }
        else  printf("%c\\n",ensure);            
        break;

      case 1:
        i++;
         printf("please click on the finger\\n");//再按一次手指
        ensure=PS_GetImage();
        if(ensure==0x00) 
        {
          ensure=PS_GenChar(CharBuffer2);//生成特征      
          if(ensure==0x00)
          {
            printf("Fingerprint right\\n");//指紋正確
            i=0;
            processnum=2;//跳到第三步
          }else 
          printf("%c",ensure);  
        }else 
        printf("%c",ensure);    
        break;
      case 2:
        printf("comparing two fingerprints\\n");   //對(duì)比兩次指紋
        ensure=PS_Match();//精確比對(duì)兩枚指紋特征返回字
        if(ensure==0x00) 
        {
          printf("Two fingerprints is the same\\n");//兩次指紋是一樣的
          processnum=3;//跳到第四步
        }
        else 
        {
          printf("Comeparative failure,please press fingers again\\n");//對(duì)比失敗,請(qǐng)重新按手指
          printf("%c",ensure);
          i=0;
          processnum=0;//跳回第一步    
        }
        delay_ms(1000);
        break;
      case 3:
        printf("generate a fingerprint template\\n");//產(chǎn)生一個(gè)指紋模板
        ensure=PS_RegModel();
        if(ensure==0x00) 
        {
          printf("generate a fingerprint template is successful\\n");//生成指紋模板成功
          processnum=4;//跳到第五步
        }else {processnum=0;printf("%c",ensure);}
        delay_ms(1000);
        break;

      case 4:  
        printf("input the ID and press Enter to save\\n");//輸入ID并按“Enter”保存
        printf("0=< ID <=299\\n");  
        do

        {
          ID++;
        }
        while(!(ID< 300));//輸入DI必須小于300
        ensure=PS_StoreChar(CharBuffer2,ID);//儲(chǔ)存模板
        if(ensure==0x00) 
        {      
          printf("Add the fingerprint successfully\\n");//添加指紋成功
          PS_ValidTempleteNum(&ValidN);//讀庫(kù)指紋個(gè)數(shù)

          printf("%d\\n",AS608Para.PS_max-ValidN);//顯示剩余指紋個(gè)數(shù)
          delay_ms(1500);//延時(shí)后清除顯示  
          printf ("\\n");
          return ;
        }else {processnum=0; printf("%c\\n",ensure);}          
        break;        
    }
    delay_ms(800);
    if(i==5)//超過(guò)5次沒(méi)有按手指則退出
    {
      printf("\\n");
      break;  
    }        
  }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2707

    瀏覽量

    47472
  • 控制電路
    +關(guān)注

    關(guān)注

    82

    文章

    1713

    瀏覽量

    135903
  • 指紋識(shí)別
    +關(guān)注

    關(guān)注

    43

    文章

    1742

    瀏覽量

    102249
  • 引腳
    +關(guān)注

    關(guān)注

    16

    文章

    1196

    瀏覽量

    50481
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AS608指紋識(shí)別模塊

    請(qǐng)問(wèn)AS608指紋識(shí)別模塊,在斷電之后還保持著之前錄入的指紋嗎?下一次通電是不是不需要再次錄入指紋了?
    發(fā)表于 04-13 17:01

    AS608指紋考勤系統(tǒng)上位機(jī)工作統(tǒng)計(jì)

    `1、特性參數(shù)ATK-AS608 指紋識(shí)別模塊是 ALIENTEK 推出的一款高性能的光學(xué)指紋識(shí)別模塊。ATK-AS
    發(fā)表于 03-06 12:21

    怎樣去開(kāi)發(fā)一種AS608指紋模塊

    AS608指紋模塊于51單片機(jī)的二次開(kāi)發(fā)前言提要一、初識(shí)AS608:二、設(shè)計(jì)1.思路2.上原理圖:3.程序設(shè)計(jì)中需要注意的幾個(gè)點(diǎn):串口:總結(jié)前言提要記得好久之前聽(tīng)老師說(shuō):你們有一個(gè)學(xué)姐
    發(fā)表于 07-13 07:32

    求一種指紋識(shí)別方案

    簡(jiǎn)單了解下指紋識(shí)別吧。1、51單片機(jī)AS608指紋識(shí)別解決方案本設(shè)計(jì)是基于STC89C52單片機(jī)的指紋識(shí)別設(shè)計(jì),采用AS608
    發(fā)表于 07-21 09:08

    基于STC89C52單片機(jī)的指紋識(shí)別設(shè)計(jì)資料分享

    本設(shè)計(jì)是基于STC89C52單片機(jī)的指紋識(shí)別設(shè)計(jì),采用AS608指紋模塊做為傳感器,LCD1602顯示屏顯示信息。具有指紋添加,
    發(fā)表于 11-10 06:51

    怎樣去設(shè)計(jì)一種基于stm32VE的AS608指紋解鎖模塊

    基于stm32VE的AS608指紋解鎖模塊是怎樣工作的?怎樣去設(shè)計(jì)一種基于stm32VE的AS608指紋解鎖
    發(fā)表于 02-14 07:58

    如何去實(shí)現(xiàn)基于AS608指紋+STM32串口通信的指紋錄入設(shè)計(jì)呢

    AS608指紋識(shí)別模塊是什么?如何去實(shí)現(xiàn)基于AS608指紋+STM32串口通信的指紋錄入設(shè)計(jì)呢?
    發(fā)表于 02-18 06:37

    請(qǐng)問(wèn)怎樣將as608指紋采集模塊指紋圖像傳到電腦里面?

    請(qǐng)問(wèn)怎樣將as608指紋采集模塊指紋圖像傳到電腦里面?
    發(fā)表于 06-05 15:08

    ATK-AS608指紋識(shí)別模塊用戶手冊(cè)資料免費(fèi)下載

    ) 的 AS608 指紋識(shí)別芯片。芯片內(nèi)置 DSP 運(yùn)算單元,集成了指紋識(shí)別算法,能高效快速采集圖像并識(shí)別指紋特征。
    發(fā)表于 06-10 08:00 ?78次下載
    ATK-AS<b class='flag-5'>608</b><b class='flag-5'>指紋識(shí)別</b><b class='flag-5'>模塊</b>用戶手冊(cè)資料免費(fèi)下載

    ATK-AS608指紋識(shí)別模塊測(cè)試實(shí)驗(yàn)的程序和工程文件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是ATK-AS608指紋識(shí)別模塊測(cè)試實(shí)驗(yàn)的程序和工程文件免費(fèi)下載。
    發(fā)表于 01-19 17:26 ?57次下載

    基于51單片機(jī)AS608指紋自動(dòng)識(shí)別電路設(shè)計(jì)(畢業(yè)設(shè)計(jì))

    本設(shè)計(jì)是基于STC89C52單片機(jī)的指紋識(shí)別設(shè)計(jì),采用AS608指紋模塊做為傳感器,LCD1602顯示屏顯示信息。具有指紋添加,
    發(fā)表于 11-05 09:21 ?46次下載
    基于51單片機(jī)<b class='flag-5'>AS608</b><b class='flag-5'>指紋</b>自動(dòng)<b class='flag-5'>識(shí)別</b>電路設(shè)計(jì)(畢業(yè)設(shè)計(jì))

    ATK-AS608 指紋識(shí)別模塊常見(jiàn)問(wèn)題和疑問(wèn)

    最近在做一個(gè)項(xiàng)目,要用到AS608指紋識(shí)別模塊,當(dāng)軟硬件聯(lián)調(diào)的時(shí)候,直接就是一個(gè)Docking failure,也查了一些資料和例子。這種情況就是單片機(jī)和指紋識(shí)別
    發(fā)表于 01-12 20:19 ?27次下載
    ATK-AS<b class='flag-5'>608</b> <b class='flag-5'>指紋識(shí)別</b><b class='flag-5'>模塊</b>常見(jiàn)問(wèn)題和疑問(wèn)

    一文詳解AS608指紋識(shí)別模塊

    AS608 指紋識(shí)別模塊主要是采用了杭州晟元芯片技術(shù)有限公司(Synochip)的 AS608 指紋識(shí)
    的頭像 發(fā)表于 04-14 14:53 ?2.8w次閱讀
    一文詳解<b class='flag-5'>AS608</b><b class='flag-5'>指紋識(shí)別</b><b class='flag-5'>模塊</b>

    AS608指紋模塊使用說(shuō)明

    AS608是一款集成了指紋圖像采集和指紋比對(duì)算法的指紋識(shí)別模塊。它采用了高質(zhì)量的光學(xué)傳感器,能夠?qū)崟r(shí)采集人體
    的頭像 發(fā)表于 08-24 12:21 ?4154次閱讀
    <b class='flag-5'>AS608</b><b class='flag-5'>指紋</b><b class='flag-5'>模塊</b>使用說(shuō)明

    基于CW32的AS608指紋模塊的應(yīng)用

    AS608是一款集成了指紋圖像采集和指紋比對(duì)算法的指紋識(shí)別模塊。
    的頭像 發(fā)表于 08-28 11:30 ?1558次閱讀
    基于CW32的<b class='flag-5'>AS608</b><b class='flag-5'>指紋</b><b class='flag-5'>模塊</b>的應(yīng)用