AS608指紋模塊開發教程

一.簡介

AS608 指紋識別模塊主要是指採用了杭州晟元芯片技術有限公司(Synochip)的 AS608 指紋識別芯片 而做成的指紋模塊,模塊廠商只是基於該芯片設計外圍電路,集成一個可供2次開發的指紋模塊;所以,只要是基於AS608芯片的指紋模塊,其控制電路及控制協議幾乎是一樣的,只是廠家和性能不同而已。
在這裏插入圖片描述

二.硬件原理圖介紹

1.硬件接口
AS608模塊採用8pin的控制接口,供電電壓爲3.3V(不能使用5V供電),通信總線有兩種,分別爲串口通訊(TX、RX)和USB通訊(D+、D-);採用串口通訊,編程相對簡單,也是比較常用的一種,但是兼容性不好;採用USB通訊,編程相對較難,但USB作爲最常用的總線接口,有很好的兼容性。
在這裏插入圖片描述
2.控制電路圖
以51單片機爲例,AS608模塊touch引腳接到單片機的普通IO上,當有指紋按下,該引腳觸發一個高電平信號;TX、RX引腳分別接到單片機的P30、P31串口引腳上。
注:AS608只能用+3.3V供電,不可用+5V供電。
在這裏插入圖片描述

三.通訊協議格式

單片機要實現對AS608指紋模塊的控制,就需要根據AS608芯片規定的通訊協議格式來發送和處理串口數據,整個模塊各個功能的實現也是圍繞該協議格式進行的。
在這裏插入圖片描述
控制指令有三類,指令包、數據包、結束包;一般指令包是由單片機發送到模塊上,模塊接收到指令包後,返回對應的數據包;

  • 指令包主要包括:包頭、芯片地址、包標識、包長度、控制參數和校驗和;
  • 數據包主要包括:包頭、芯片地址、包標識、包長度、數據和校驗和 ;
  • 數據包與結束包的區別在於包標識,02H: 數據包,且有後續包。 08H: 最後一個數據包,即結束包。

四.控制程序

以指紋密碼鎖爲例,
1.常用控制指令
一般要實現一個指紋密碼鎖的功能,只需用到以下指令:
錄入圖像、生成特徵、搜索指紋、自動驗證指紋、自動註冊模板、刪除指紋。
2.錄入指紋
首先要是實現開鎖,需要在系統裏面錄入指紋信息,需要:
錄入圖像->生成特徵->快速查找圖像->自動註冊模板
(1)錄入圖像指令
在這裏插入圖片描述

void SFG_getimage()			      //錄入指紋圖像
{
   uchar i;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X03;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   summaf=0x05;
   SBUF=summaf;
   while(TI==0);
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
        
   while(RI==0);
   RI=0;
   querenma=SBUF;
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
}

(2)生成特徵指令
存入指紋圖像,存入單片機給定的緩衝區號BufferID中;
在這裏插入圖片描述

void SFG_genchar(uchar bufferID) //生成特徵並存於charbuffer1/2  調用後
{
   uchar i;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X04;
   while(TI==0);
   TI=0;
   SBUF=0X02;
   while(TI==0);
   TI=0; 
   SBUF=bufferID;
   while(TI==0);
   TI=0;   
   summaf=0x07+bufferID;
   sum[0]=summaf;
   sum[1]=summaf>>8;
   SBUF=sum[1];
   while(TI==0)
   TI=0;
   SBUF=sum[0];
   while(TI==0)
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
   while(RI==0);
   RI=0;
   querenma=SBUF;
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
}

(3)快速查找圖像
生成圖像後要驗證是否有在Buffer裏面;
在這裏插入圖片描述

void SFG_fastsearch(uchar bufferID)  //搜索指紋返回指紋ID號   sum、pagenum>255都會使程序卡@@@
{
   uchar i,ID1,ID2;
//	SBUF=0xef;
//   while(TI==0);
//   TI=0;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X08;
   while(TI==0);
   TI=0;
		
   SBUF=0X1b;
   while(TI==0);
   TI=0;
        
   SBUF=bufferID;
   while(TI==0);
   TI=0;   
	 
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
	 
   SBUF=180;
   while(TI==0);
   TI=0;
        
   summaf=9+0x1b+bufferID+180;
   sum[0]=summaf;
   sum[1]=summaf>>8;
   SBUF=sum[1];
   while(TI==0);
   TI=0;
   SBUF=sum[0];
   while(TI==0);
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
	        
   while(RI==0);
   RI=0;
   querenma=SBUF;
        
   while(RI==0);
   RI=0;
   ID1=SBUF;
   while(RI==0);
   RI=0;
   ID2=SBUF;				  //接收到的ID號
   while(RI==0);
   RI=0;
   while(RI==0);
   RI=0;
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
   //PageID=ID1;
   PageID=(ID1<<8)+ID2;
}

(4)自動註冊模板
最後將Buffer裏面的圖像存入Flash裏面
在這裏插入圖片描述
在這裏插入圖片描述

void SFG_enroll()				 //自動註冊模板返回存儲ID  =錄圖像+合併生成模板+儲存模板
{
   uchar i,ID1,ID2;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X03;
   while(TI==0);
   TI=0;
        
   SBUF=0X10;
   while(TI==0);
   TI=0;
           
   SBUF=0X00;
   while(TI==0);
   TI=0;
   summaf=0x14;
   SBUF=summaf;	   //校驗和
   while(TI==0);
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
   while(RI==0);
   RI=0;
   querenma=SBUF;
   while(RI==0);
   RI=0;
   ID1=SBUF;
   while(RI==0);
   RI=0;
   ID2=SBUF;
        
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
   //PageID=ID1;
   PageID=(ID1<<8)+ID2;
}

2.自動驗證指紋
錄入指紋後,就可以匹配本人的指紋實現開鎖,只需要發送自動驗證指紋指令,返回的確認碼爲0x00,即爲匹配成功,不爲0x00即匹配失敗;
在這裏插入圖片描述

void SFG_identify()				//自動驗證指紋     錄圖像+生成特徵+搜索
{
   uchar i,ID1,ID2,temp[10]; 
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X03;
   while(TI==0);
   TI=0;
        
   SBUF=0X11;
   while(TI==0);
   TI=0;
           
   SBUF=0X00;
   while(TI==0);
   TI=0;
   summaf=0x15;
   SBUF=summaf;	   //校驗和
   while(TI==0);
   TI=0;  
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;
//		querenma=SBUF;
	 }
   while(RI==0);
   RI=0;
   querenma=SBUF;
	 temp[0]= querenma;
   while(RI==0);
   RI=0;
   ID1=SBUF;
	 temp[1]= ID1;
   while(RI==0);
   RI=0;
   ID2=SBUF;
	 temp[3]= ID2;   
   while(RI==0);
   RI=0;
   while(RI==0);
   RI=0;			  //得分 
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]>>8)+sum[0];									 
   //PageID=ID1;
   PageID=(ID1>>8)+ID2;
	 
	 for(i=0;i<3;i++)
	{
		SBUF = temp[i];
		while(TI==0);
		TI=0;
	}

(3)刪除指紋
管理員如果需要刪除系統中錄入的指定指紋信息,需要寫入刪除所要刪除指紋的ID號,然後發送刪除指紋指令即可刪除相應的指紋。
在這裏插入圖片描述

void SFG_deletchar(uint pageID)   //刪除指紋		     校驗和在2字節的頁碼處應分高低字節相加
{
   uchar i,ID1,ID2;
   SBUF=0xef;
   while(TI==0);
   TI=0;
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
   SBUF=0XFF;
   while(TI==0);
   TI=0;
        
   SBUF=0X01;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=0X07;
   while(TI==0);
   TI=0;
        
   SBUF=0X0c;
   while(TI==0);
   TI=0;
        
   ID1=pageID;ID2=pageID>>8;
   SBUF=ID2;
   while(TI==0);
   TI=0;
   SBUF=ID1;
   while(TI==0);
   TI=0;
        
   SBUF=0X00;
   while(TI==0);
   TI=0;
   SBUF=1;
   while(TI==0);
   TI=0;
        
   summaf=0x15+ID1+ID2;
   sum[0]=summaf;
   sum[1]=summaf>>8;
   SBUF=sum[1];
   while(TI==0);
   TI=0;
   SBUF=sum[0];
   while(TI==0);
   TI=0;
        
   for(i=0;i<9;i++)
   {
    while(RI==0);
    RI=0;}
   while(RI==0);
   RI=0;
   querenma=SBUF;
   while(RI==0);
   RI=0;
   sum[1]=SBUF;
   while(RI==0);
   RI=0;
   sum[0]=SBUF;
   summas=(sum[1]<<8)+sum[0];									 
}
    

五.總結

只要實現以上幾個指令,就可以實現一個指紋密碼鎖的基本功能了。

更多指紋模塊AS608的51和stm32例程 請關注公衆號,首頁回覆“指紋模塊”獲取資料
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章