打印
[应用相关]

STM32单片机开发光学指纹识别模块(FPM10A)

[复制链接]
楼主: gaonaiweng
手机看帖
扫描二维码
随时随地手机跟帖
21
gaonaiweng|  楼主 | 2022-4-30 12:37 | 只看该作者 回帖奖励 |倒序浏览

下面我附上基于STM32单片机光学指纹识别模块(FPM10A)打包好的函数库

第一个是 FPM10A.c
view source
print?
001.
#include "stm32f10x.h"
002.
#include "stm32f10x_usart.h"
003.
#include "misc.h"
004.
unsigned
char
dat[18];
005.
006.
//FINGERPRINT通信协议定义
007.
unsigned
char
FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};
//协议包头
008.
unsigned
char
FP_Get_Img[6] = {0x01,0x00,0x03,0x01,0x0,0x05};
//获得指纹图像
009.
unsigned
char
FP_Templete_Num[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 };
//获得模版总数
010.
unsigned
char
FP_Search[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x03,0xA1,0x0,0xB2};
//搜索指纹搜索范围0 - 929
011.
unsigned
char
FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x0,0x13,0x0,0x21};
//搜索0-9号指纹
012.
unsigned
char
FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08};
//将图像放入到BUFFER1
013.
unsigned
char
FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09};
//将图像放入到BUFFER2
014.
unsigned
char
FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x09};
//将BUFFER1跟BUFFER2合成特征模版
015.
unsigned
char
FP_Delet_All_Model[6]={0x01,0x0,0x03,0x0d,0x00,0x11};
//删除指纹模块里所有的模版
016.
unsigned
char
FP_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};
//将BUFFER1中的特征码存放到指定的位置
017.
unsigned
char
FP_Delete_Model[10]={0x01,0x00,0x07,0x0C,0x0,0x0,0x0,0x1,0x0,0x0};
//删除指定的模版
018.
019.
020.
//从 USART1 发送一个字节
021.
void
USART1_SendByte(unsigned
char
temp)
022.
{
023.
USART_SendData(USART1, temp);
024.
while
(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
025.
}
026.
027.
//从 USART1 读取一个字节
028.
unsigned
char
USART1_ReceivByte()
029.
{
030.
unsigned
char
recev;
031.
while
(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
032.
recev = USART_ReceiveData(USART1);
033.
return
recev;
034.
}
035.
//FINGERPRINT命令字
036.
//FINGERPRINT_获得指纹图像命令
037.
void
FINGERPRINT_Cmd_Get_Img(
void
)
038.
{
039.
unsigned
char
i;
040.
041.
for
(i=0;i<6;i++)
//发送包头
042.
USART1_SendByte(FP_Pack_Head[i]);
043.
044.
for
(i=0;i<6;i++)
//发送命令 0x1d
045.
USART1_SendByte(FP_Get_Img[i]);
046.
047.
for
(i=0;i<12;i++)
//读回应答信息
048.
dat[i]=USART1_ReceivByte();
049.
}
050.
051.
//删除所有指纹模版
052.
void
FINGERPRINT_Cmd_Delete_All_Model(
void
)
053.
{
054.
unsigned
char
i;
055.
056.
for
(i=0;i<6;i++)
//发送包头
057.
USART1_SendByte(FP_Pack_Head[i]);
058.
059.
for
(i=0;i<6;i++)
//发送命令 0x1d
060.
USART1_SendByte(FP_Delet_All_Model[i]);
061.
062.
for
(i=0;i<12;i++)
//读回应答信息
063.
dat[i]=USART1_ReceivByte();
064.
}
065.
066.
//讲图像转换成特征码存放在Buffer1中
067.
void
FINGERPRINT_Cmd_Img_To_Buffer1(
void
)
068.
{
069.
unsigned
char
i;
070.
for
(i=0;i<6;i++)
//发送包头
071.
{
072.
USART1_SendByte(FP_Pack_Head[i]);
073.
}
074.
for
(i=0;i<7;i++)
//发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
075.
{
076.
USART1_SendByte(FP_Img_To_Buffer1[i]);
077.
}
078.
for
(i=0;i<12;i++)
//读应答信息
079.
{
080.
dat[i]=USART1_ReceivByte();
//把应答数据存放到缓冲区
081.
}
082.
}
083.
084.
//将图像转换成特征码存放在Buffer2中
085.
void
FINGERPRINT_Cmd_Img_To_Buffer2(
void
)
086.
{
087.
unsigned
char
i;
088.
for
(i=0;i<6;i++)
//发送包头
089.
{
090.
USART1_SendByte(FP_Pack_Head[i]);
091.
}
092.
093.
for
(i=0;i<7;i++)
//发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
094.
{
095.
USART1_SendByte(FP_Img_To_Buffer2[i]);
096.
}
097.
for
(i=0;i<12;i++)
098.
{
099.
dat[i]=USART1_ReceivByte();
//读回应答信息
100.
}
101.
}
102.
103.
//将BUFFER1 跟 BUFFER2 中的特征码合并成指纹模版
104.
void
FINGERPRINT_Cmd_Reg_Model(
void
)
105.
{
106.
unsigned
char
i;
107.
108.
for
(i=0;i<6;i++)
//包头
109.
{
110.
USART1_SendByte(FP_Pack_Head[i]);
111.
}
112.
113.
for
(i=0;i<6;i++)
//命令合并指纹模版
114.
{
115.
USART1_SendByte(FP_Reg_Model[i]);
116.
}
117.
118.
for
(i=0;i<12;i++)
119.
{
120.
dat[i]=USART1_ReceivByte();
121.
}
122.
}
123.
124.
//存储模版到特定地址
125.
void
FINGERPRINT_Cmd_Save_Finger( unsigned
char
ucH_Char, unsigned
char
ucL_Char)
126.
{
127.
unsigned
long
temp = 0;
128.
unsigned
char
i;
129.
130.
FP_Save_Finger[5] = ucH_Char;
131.
FP_Save_Finger[6] = ucL_Char;
132.
133.
134.
for
(i=0;i<7;i++)
//计算校验和
135.
temp = temp + FP_Save_Finger[i];
136.
137.
FP_Save_Finger[7]=(temp & 0x00FF00) >> 8;
//存放校验数据
138.
FP_Save_Finger[8]= temp & 0x0000FF;
139.
140.
141.
for
(i=0;i<6;i++)
142.
USART1_SendByte(FP_Pack_Head[i]);
//发送包头
143.
144.
for
(i=0;i<9;i++)
145.
USART1_SendByte(FP_Save_Finger[i]);
//发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
146.
147.
for
(i=0;i<12;i++)
148.
dat[i]=USART1_ReceivByte();
149.
}
150.
151.
//获得指纹模板数量
152.
void
FINGERPRINT_Cmd_Get_Templete_Num(
void
)
153.
{
154.
unsigned
int
i;
155.
156.
for
(i=0;i<6;i++)
//包头
157.
USART1_SendByte(FP_Pack_Head[i]);
158.
159.
//发送命令 0x1d
160.
for
(i=0;i<6;i++)
161.
USART1_SendByte(FP_Templete_Num[i]);
162.
163.
for
(i=0;i<12;i++)
164.
dat[i]=USART1_ReceivByte();
165.
}
166.
167.
//搜索全部用户999枚
168.
void
FINGERPRINT_Cmd_Search_Finger(
void
)
169.
{
170.
unsigned
char
i;
171.
//发送命令搜索指纹库
172.
for
(i=0;i<6;i++)
173.
{
174.
USART1_SendByte(FP_Pack_Head[i]);
175.
}
176.
177.
for
(i=0;i<11;i++)
178.
{
179.
USART1_SendByte(FP_Search[i]);
180.
}
181.
182.
for
(i=0;i<16;i++)
183.
{
184.
dat[i]=USART1_ReceivByte();
185.
}
186.
}
187.
188.
//搜索用户0~9枚
189.
void
FINGERPRINT_Cmd_Search_Finger_Admin(
void
)
190.
{
191.
unsigned
char
i;
192.
for
(i=0;i<6;i++)
//发送命令搜索指纹库
193.
{
194.
USART1_SendByte(FP_Pack_Head[i]);
195.
}
196.
197.
for
(i=0;i<11;i++)
198.
{
199.
USART1_SendByte(FP_Search_0_9[i]);
200.
}
201.
202.
for
(i=0;i<12;i++)
203.
dat[i]=USART1_ReceivByte();
204.
}
205.
206.
//添加一个新的指纹
207.
unsigned
char
FP_add_new_user(unsigned
char
ucH_user,unsigned
char
ucL_user)
208.
{
209.
do
210.
{
211.
FINGERPRINT_Cmd_Get_Img();
//获得指纹图像
212.
}
while
( dat[9]!=0x0 );
//检测是否成功的按了指纹
213.
214.
FINGERPRINT_Cmd_Img_To_Buffer1();
//将图像转换成特征码存放在Buffer1中
215.
216.
do
217.
{
218.
FINGERPRINT_Cmd_Get_Img();
//获得指纹图像
219.
}
while
( dat[9]!=0x0 );
220.
221.
FINGERPRINT_Cmd_Img_To_Buffer2();
//将图像转换成特征码存放在Buffer2中
222.
223.
FINGERPRINT_Cmd_Reg_Model();
//转换成特征码
224.
225.
FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);
226.
227.
return
0;
228.
}

使用特权

评论回复
22
gaonaiweng|  楼主 | 2022-4-30 12:37 | 只看该作者
第2个 FPM10A.h


view source
print?
01.
#ifndef _FPM10A_H
02.
#define _FPM10A_H
03.
#include <stdint.h>
04.
05.
extern
unsigned
char
dat[18];
06.
07.
extern
void
FINGERPRINT_Cmd_Get_Img();
08.
extern
void
FINGERPRINT_Cmd_Img_To_Buffer1();
09.
extern
void
FINGERPRINT_Cmd_Img_To_Buffer2();
10.
extern
void
FINGERPRINT_Cmd_Reg_Model();
11.
extern
void
FINGERPRINT_Cmd_Delete_All_Model(
void
);
12.
extern
void
FINGERPRINT_Cmd_Search_Finger(
void
);
13.
extern
void
FINGERPRINT_Cmd_Get_Templete_Num(
void
);
14.
extern
void
FINGERPRINT_Cmd_Search_Finger_Admin(
void
);
15.
extern
void
FINGERPRINT_Cmd_Save_Finger( unsigned
char
ucH_Char, unsigned
char
ucL_Char);
16.
extern
unsigned
char
FP_add_new_user(unsigned
char
ucH_user,unsigned
char
ucL_user);
17.
18.
19.
extern
void
USART1_SendByte(unsigned
char
temp);
20.
extern
unsigned
char
USART1_ReceivByte();
21.
22.
extern
void
Delay_ms1(uint32_t nCount);
23.
24.
void
Delay_nus1(uint32_t nCount)
25.
{
26.
uint32_t j;
27.
while
(nCount--)
28.
{
29.
j=8;
30.
while
(j--);
31.
}
32.
}
33.
34.
void
Delay_ms1(uint32_t nCount)
35.
{
36.
while
(nCount--)
37.
Delay_nus1(1100);
38.
}
39.
40.
unsigned
char
test_fig()
//检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败
41.
{
42.
unsigned
char
fig_dat;
43.
FINGERPRINT_Cmd_Get_Img();
44.
Delay_ms1(20);
45.
fig_dat=dat[9];
46.
return
(fig_dat);
47.
}
48.
49.
#endif

有了这两个东西,加入到你的工程中,就可以直接调用啦!

使用特权

评论回复
23
Uriah| | 2022-10-6 10:30 | 只看该作者

一般要进行内存优化,尽量提高内存的使用效率

使用特权

评论回复
24
Bblythe| | 2022-10-6 13:29 | 只看该作者

对于没有else的场景,使用ifPresent即可

使用特权

评论回复
25
Pulitzer| | 2022-10-6 16:28 | 只看该作者

需要在做项目的过程中经历磨难

使用特权

评论回复
26
Clyde011| | 2023-5-1 07:31 | 只看该作者

这是个再正常不过的coding习惯

使用特权

评论回复
27
万图| | 2023-5-1 09:27 | 只看该作者

你懂其原理才能让你在行业中走的更远

使用特权

评论回复
28
Uriah| | 2023-5-1 10:30 | 只看该作者

事实上很多做项目的工程师本身自己也会在用

使用特权

评论回复
29
帛灿灿| | 2023-5-1 12:26 | 只看该作者

脚本猛于老虎

使用特权

评论回复
30
Bblythe| | 2023-5-1 13:29 | 只看该作者

I2C1的时钟可以自行选择HSI或者SYSCLK

使用特权

评论回复
31
周半梅| | 2023-5-1 15:25 | 只看该作者

Git 是程序员学习和工作都离不开发工具

使用特权

评论回复
32
Pulitzer| | 2023-5-1 16:28 | 只看该作者

PCB的制造过程由玻璃环氧树脂(Glass Epoxy)或类似材质制成的PCB“基板”开始

使用特权

评论回复
33
周半梅| | 2023-5-1 17:31 | 只看该作者

超过变量128后必须使用compact模式编译

使用特权

评论回复
34
童雨竹| | 2023-5-1 18:24 | 只看该作者

If-Else 通常是一个糟糕的选择

使用特权

评论回复
35
Wordsworth| | 2023-5-1 19:27 | 只看该作者

通过OV7670摄像头进行图像采集

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则