一.簡介
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例程 請關注公衆號,首頁回覆“指紋模塊”獲取資料