本文轉(zhuǎn)載,其來(lái)源在參考中:1,稍加修改,因?yàn)榻谑褂玫竭@個(gè)模塊,故而加以整理!
1.平臺(tái)
首先我使用的是 奮斗 STM32 開(kāi)發(fā)板 MINI板
基于STM32單片機(jī)光學(xué)指紋識(shí)別模塊(FPM10A)全教程
2.購(gòu)買指紋模塊,可以獲得三份資料
1.簡(jiǎn)要使用說(shuō)明
2.使用指紋模塊的功能函數(shù)
3.FPM10A用戶手冊(cè).
3.硬件搭建
根據(jù)使用說(shuō)明:FPM 10A使用標(biāo)準(zhǔn)的串口與外界通信,默認(rèn)的波特率為57600,可以與任何單片機(jī),ARM,DSP等帶串口的設(shè)備進(jìn)行連接,請(qǐng)注意電平轉(zhuǎn)換,連接電腦需要進(jìn)行電平轉(zhuǎn)換,比如MAX232電路。
FPM10A光學(xué)指紋模塊共有5個(gè)管腳
1 為 VCC 電源的正極接 3.6V – 5.5V的電壓均可。
2 為 GND 電源的負(fù)極 接地。
3 為 TXD 串口的發(fā)送。
4 為 RXD 串口的接收。
5 為 NC 懸空不需要使用。
奮斗板上已經(jīng)有5V的管腳,可以直接供給指紋模塊,
這里需要注意的是,指紋模塊主要通過(guò)串口進(jìn)行控制,模塊和STM32單片機(jī)連接的時(shí)候,需要進(jìn)行電平轉(zhuǎn)換,
基于STM32單片機(jī)光學(xué)指紋識(shí)別模塊(FPM10A)全教程
這樣只要把這個(gè)轉(zhuǎn)接板插入STM32,接上5V的電,就可以工作了,將模塊的發(fā)送端接轉(zhuǎn)接板的接收端,接收端接轉(zhuǎn)接板的發(fā)送端。
這樣,我們的硬件平臺(tái)就搭建好了!
4.模塊的測(cè)試工作
>模塊成功上電后,指紋采集窗口會(huì)閃一下,表示自檢正常,如果不閃,請(qǐng)仔細(xì)檢查電源,是否接反,接錯(cuò)等。指紋模塊使用120MHZ的DSP全速工作,工作時(shí)芯片有一些熱,經(jīng)過(guò)嚴(yán)格的測(cè)試,這是沒(méi)有問(wèn)題的可以放心使用,在不使用的時(shí)候可以關(guān)閉電源,以降低功耗。
5.現(xiàn)在我們要進(jìn)入編程環(huán)節(jié)了
>指紋模塊主要是通過(guò)串口進(jìn)行控制,所以這里我們需要用到單片機(jī)的串口模塊。
我們需要用到兩個(gè)關(guān)鍵函數(shù)
1.使用串口發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
2.使用串口接收一個(gè)字節(jié)的數(shù)據(jù)
這里我使用的STM32單片,所以這兩個(gè)程序如下:
void USART1_SendByte(
unsigned char temp)
{USART_SendData(USART1, temp);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
unsigned char USART1_ReceivByte()
{
unsigned char recev;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);recev = USART_ReceiveData(USART1);
return recev;
}
6.查看FPM10A用戶手冊(cè) 我們來(lái)實(shí)現(xiàn)比對(duì)一個(gè)指紋(我們這里假設(shè)指紋模塊中已經(jīng)存在指紋模板)
首先我們需要讓指紋模塊檢測(cè)是否有指紋輸入(也就是是否有手指放在指紋模塊上檢測(cè))
我們來(lái)看手冊(cè)上給的操作說(shuō)明:
基于STM32單片機(jī)光學(xué)指紋識(shí)別模塊(FPM10A)全教程
我們需要發(fā)送給定的數(shù)據(jù)包給模塊,發(fā)送的數(shù)據(jù)已經(jīng)給我們了,現(xiàn)在我們參看給我們的C例程
unsigned char dat[
18];
unsigned char FP_Get_Img[
6] ={
0x01,
0x00,
0x03,
0x01,
0x0,
0x05};
unsigned char FP_Pack_Head[
6] = {
0xEF,
0x01,
0xFF,
0xFF,
0xFF,
0xFF};
void FINGERPRINT_Cmd_Get_Img(
void){
unsigned char i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++) USART1_SendByte(FP_Get_Img[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();}
unsigned char test_fig()
{
unsigned char fig_dat;FINGERPRINT_Cmd_Get_Img();Delay_ms1(
20);fig_dat=dat[
9];
return(fig_dat);
}
因此,我們?cè)谥骱瘮?shù)中可以這樣調(diào)用:
void main
{
if(test_fig()==
0){}
}
7.如何錄入一個(gè)新的指紋信息呢?
步驟如下
1.獲得指紋圖像
2.檢測(cè)是否成功的按了指紋
3.將圖像轉(zhuǎn)換成特征碼存放在Buffer1中
4.再次獲得指紋圖像
5.將圖像轉(zhuǎn)換成特征碼存放在Buffer2中
6.轉(zhuǎn)換成特征碼
7.存儲(chǔ)到指定地址上
同樣的,根據(jù)用戶手冊(cè),我們可以得到以下這樣的模塊:
當(dāng)調(diào)用的時(shí)候,你只要給這個(gè)函數(shù)附上兩個(gè)值就可以了,例如:
unsigned char FP_add_new_user(00,01);
如果你下次再次寫入這個(gè)地址,以前存儲(chǔ)的指紋模板信息將被覆蓋
unsigned char FP_add_new_user(
unsigned char ucH_user,
unsigned char ucL_user)
{
do{ FINGERPRINT_Cmd_Get_Img(); }
while ( dat[
9]!=
0x0 ); FINGERPRINT_Cmd_Img_To_Buffer1();
do{FINGERPRINT_Cmd_Get_Img(); }
while( dat[
9]!=
0x0 );FINGERPRINT_Cmd_Img_To_Buffer2(); FINGERPRINT_Cmd_Reg_Model(); FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);
return 0;
}
void FINGERPRINT_Cmd_Save_Finger(
unsigned char ucH_Char,
unsigned char ucL_Char)
{
unsigned long temp =
0;
unsigned char i;FP_Save_Finger[
5] = ucH_Char;FP_Save_Finger[
6] = ucL_Char;
for(i=
0;i<
7;i++) temp = temp + FP_Save_Finger[i];FP_Save_Finger[
7]=(temp &
0x00FF00) >>
8; FP_Save_Finger[
8]= temp &
0x0000FF;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
9;i++) USART1_SendByte(FP_Save_Finger[i]) ;
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
8.如何刪除一個(gè)模板?
void FINGERPRINT_Cmd_Delete_All_Model(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++) USART1_SendByte(FP_Delet_All_Model[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
9.如何獲取已經(jīng)存取的指紋模板信息?
這個(gè)模塊一共可以存儲(chǔ)0~999枚指紋信息
void FINGERPRINT_Cmd_Search_Finger(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
11;i++){USART1_SendByte(FP_Search[i]); }
for(i=
0;i<
16;i++){dat[i]=USART1_ReceivByte();}
}
根據(jù)用戶手冊(cè),我們可以從應(yīng)答包中得出模塊中已經(jīng)存在指紋數(shù)量的大小
這樣,我們就輕松把指紋模塊搞定!
下面我附上基于STM32單片機(jī)光學(xué)指紋識(shí)別模塊(FPM10A)打包好的函數(shù)庫(kù)
第一個(gè)是 FPM10A.c
\
#include "stm32f10x.h"
\
#include "stm32f10x_usart.h"
\
#include "misc.h"
unsigned char dat[
18];
unsigned char FP_Pack_Head[
6] = {
0xEF,
0x01,
0xFF,
0xFF,
0xFF,
0xFF};
unsigned char FP_Get_Img[
6] = {
0x01,
0x00,
0x03,
0x01,
0x0,
0x05};
unsigned char FP_Templete_Num[
6] ={
0x01,
0x00,
0x03,
0x1D,
0x00,
0x21 };
unsigned char FP_Search[
11]={
0x01,
0x0,
0x08,
0x04,
0x01,
0x0,
0x0,
0x03,
0xA1,
0x0,
0xB2};
unsigned char FP_Search_0_9[
11]={
0x01,
0x0,
0x08,
0x04,
0x01,
0x0,
0x0,
0x0,
0x13,
0x0,
0x21};
unsigned char FP_Img_To_Buffer1[
7]={
0x01,
0x0,
0x04,
0x02,
0x01,
0x0,
0x08};
unsigned char FP_Img_To_Buffer2[
7]={
0x01,
0x0,
0x04,
0x02,
0x02,
0x0,
0x09};
unsigned char FP_Reg_Model[
6]={
0x01,
0x0,
0x03,
0x05,
0x0,
0x09};
unsigned char FP_Delet_All_Model[
6]={
0x01,
0x0,
0x03,
0x0d,
0x00,
0x11};
unsigned char FP_Save_Finger[
9]={
0x01,
0x00,
0x06,
0x06,
0x01,
0x00,
0x0B,
0x00,
0x19};
unsigned char FP_Delete_Model[
10]={
0x01,
0x00,
0x07,
0x0C,
0x0,
0x0,
0x0,
0x1,
0x0,
0x0};
void USART1_SendByte(
unsigned char temp)
{USART_SendData(USART1, temp);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
unsigned char USART1_ReceivByte()
{
unsigned char recev;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);recev = USART_ReceiveData(USART1);
return recev;
}
void FINGERPRINT_Cmd_Get_Img(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++) USART1_SendByte(FP_Get_Img[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
void FINGERPRINT_Cmd_Delete_All_Model(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++) USART1_SendByte(FP_Delet_All_Model[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
void FINGERPRINT_Cmd_Img_To_Buffer1(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
7;i++) {USART1_SendByte(FP_Img_To_Buffer1[i]);}
for(i=
0;i<
12;i++){dat[i]=USART1_ReceivByte();}
}
void FINGERPRINT_Cmd_Img_To_Buffer2(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
7;i++) {USART1_SendByte(FP_Img_To_Buffer2[i]);}
for(i=
0;i<
12;i++){dat[i]=USART1_ReceivByte();}
}
void FINGERPRINT_Cmd_Reg_Model(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Reg_Model[i]); }
for(i=
0;i<
12;i++){dat[i]=USART1_ReceivByte();}
}
void FINGERPRINT_Cmd_Save_Finger(
unsigned char ucH_Char,
unsigned char ucL_Char)
{
unsigned long temp =
0;
unsigned char i;FP_Save_Finger[
5] = ucH_Char;FP_Save_Finger[
6] = ucL_Char;
for(i=
0;i<
7;i++) temp = temp + FP_Save_Finger[i];FP_Save_Finger[
7]=(temp &
0x00FF00) >>
8; FP_Save_Finger[
8]= temp &
0x0000FF;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
9;i++) USART1_SendByte(FP_Save_Finger[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
void FINGERPRINT_Cmd_Get_Templete_Num(
void)
{
unsigned int i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++)USART1_SendByte(FP_Templete_Num[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
void FINGERPRINT_Cmd_Search_Finger(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
11;i++){USART1_SendByte(FP_Search[i]); }
for(i=
0;i<
16;i++){dat[i]=USART1_ReceivByte();}
}
void FINGERPRINT_Cmd_Search_Finger_Admin(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
11;i++){USART1_SendByte(FP_Search_0_9[i]); }
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
unsigned char FP_add_new_user(
unsigned char ucH_user,
unsigned char ucL_user)
{
do{ FINGERPRINT_Cmd_Get_Img(); }
while ( dat[
9]!=
0x0 ); FINGERPRINT_Cmd_Img_To_Buffer1();
do{FINGERPRINT_Cmd_Get_Img(); }
while( dat[
9]!=
0x0 );FINGERPRINT_Cmd_Img_To_Buffer2(); FINGERPRINT_Cmd_Reg_Model(); FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);
return 0;
}
第2個(gè) FPM10A.h
\
#ifndef _FPM10A_H
\
#define _FPM10A_H
\
#include <stdint.h>
extern unsigned char dat[
18];
extern void FINGERPRINT_Cmd_Get_Img();
extern void FINGERPRINT_Cmd_Img_To_Buffer1();
extern void FINGERPRINT_Cmd_Img_To_Buffer2();
extern void FINGERPRINT_Cmd_Reg_Model();
extern void FINGERPRINT_Cmd_Delete_All_Model(
void);
extern void FINGERPRINT_Cmd_Search_Finger(
void);
extern void FINGERPRINT_Cmd_Get_Templete_Num(
void);
extern void FINGERPRINT_Cmd_Search_Finger_Admin(
void);
extern void FINGERPRINT_Cmd_Save_Finger(
unsigned char ucH_Char,
unsigned char ucL_Char);
extern unsigned char FP_add_new_user(
unsigned char ucH_user,
unsigned char ucL_user);
extern void USART1_SendByte(
unsigned char temp);
extern unsigned char USART1_ReceivByte();
extern void Delay_ms1(uint32_t nCount);
void Delay_nus1(uint32_t nCount)
{uint32_t j;
while(nCount--){j=
8;
while(j--);}
}
void Delay_ms1(uint32_t nCount)
{
while(nCount--)Delay_nus1(
1100);
}
unsigned char test_fig()
{
unsigned char fig_dat;FINGERPRINT_Cmd_Get_Img();Delay_ms1(
20);fig_dat=dat[
9];
return(fig_dat);
}
\
#endif 有了這兩個(gè)東西,加入到你的工程中,就可以直接調(diào)用啦!
http://blog.sina.com.cn/s/blog_804665db01015nnd.html ?
轉(zhuǎn)載于:https://www.cnblogs.com/ysmintor/p/5180653.html
總結(jié)
以上是生活随笔為你收集整理的基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。