基于STM32的指纹门禁系统
系统简介
- 指纹系统,可以存指纹;
- 指纹对了之后开门;
材料
- STM32F103C8T6芯片
- OLED液晶显示屏
- 杜邦线
- AS608模块
- 用keil5进行开发
开始制作
制作过程
AS608模块调试
模块原理
模块是通过串口通信,采用回复式通信。
这是我整理的常用模块命令
序号 | 指令 | 作用 | 返回 | 意义 |
---|---|---|---|---|
1 | EF 01 FF FF FF FF 01 00 03 01 00 05 | 录入指纹 | EF 01 FF FF FF FF 07 00 03 00 00 0A | 录入成功 |
2 | EF 01 FF FF FF FF 07 00 03 02 00 0C | 传感器上无手指 | ||
3 | EF 01 FF FF FF FF 01 00 04 02 01 00 08 | 生成特征放到BUF1 | EF 01 FF FF FF FF 07 00 03 00 00 0A | 生成特征值成功 |
4 | EF 01 FF FF FF FF 01 00 04 02 02 00 09 | 生成特征放到BUF2 | EF 01 FF FF FF FF 07 00 03 02 00 0C | 传感器上无手指 |
5 | EF 01 FF FF FF FF 01 00 03 03 00 07 | 对比特征1和特征2 | EF 01 FF FF FF FF 07 00 05 08 00 00 00 14 | 不匹配 |
6 | EF 01 FF FF FF FF 07 00 05 00 05 42 00 53 | 两指纹匹配,得分1346分 | ||
7 | EF 01 FF FF FF FF 01 00 08 04 01 00 00 0C 12 00 2C | 以Buf1中的特征搜索整个指纹库 | EF 01 FF FF FF FF 07 00 07 09 00 00 00 00 00 17 | 没搜到 |
8 | EF 01 FF FF FF FF 07 00 07 00 00 00 00 00 00 17 | 搜到了 | ||
9 | EF 01 FF FF FF FF 01 00 03 05 00 09 | 合成BUF1和BUF2中的特征 | EF 01 FF FF FF FF 07 00 03 0A 00 14 | 合成失败,不是同一手指 |
10 | EF 01 FF FF FF FF 01 00 06 06 01 00 04 00 12 | 将BUF1存储到ID4 | EF 01 FF FF FF FF 07 00 03 00 00 0A | 存储成功 |
11 | EF 01 FF FF FF FF 01 00 06 07 02 00 04 00 14 | 将ID4读取到BUF2中 | EF 01 FF FF FF FF 07 00 03 00 00 0A | 读取成功 |
12 | EF 01 FF FF FF FF 07 00 03 0C 00 16 | 读出有错或者模板无效 | ||
13 | EF 01 FF FF FF FF 01 00 07 0C 00 04 00 01 00 19 | 删除从ID4开始的1个ID | EF 01 FF FF FF FF 07 00 03 00 00 0A | 删除成功 |
14 | EF 01 FF FF FF FF 01 00 03 0d 00 11 | 清空指纹库 | EF 01 FF FF FF FF 07 00 03 00 00 0A | 成功 |
15 | EF 01 FF FF FF FF 01 00 05 0e 04 06 00 1E | 设置波特率为9600*6 | EF 01 FF FF FF FF 07 00 03 00 00 0A | 成功 |
16 | EF 01 FF FF FF FF 01 00 03 0F 00 13 | 读取系统参数 | EF 01 FF FF FF FF 07 00 13 00 00 00 00 00 01 2C 00 01 FF FF FF FF 00 00 00 06 04 4A | 指纹容量为300,数据包大小为32Byte,波特率为9600*6 |
17 | EF 01 FF FF FF FF 01 00 03 10 00 14 | 自动采集一次指纹并存储 | EF 01 FF FF FF FF 07 00 05 00 00 00 00 0C | 成功,并且存在ID0处 |
18 | EF 01 FF FF FF FF 07 00 05 03 02 08 00 19 | 没有指纹 | ||
19 | EF 01 FF FF FF FF 01 00 03 11 00 15 | 自动采集指纹并对比 | EF 01 FF FF FF FF 07 00 07 17 02 08 40 00 00 6F | 没找到指纹 |
20 | EF 01 FF FF FF FF 07 00 07 00 00 01 00 1B 00 2A | 找到指纹,存在ID1,得分0x1B | ||
21 | EF 01 FF FF FF FF 07 00 07 03 F0 00 40 00 01 41 | 没有找到指纹 | ||
22 | EF 01 FF FF FF FF 07 00 07 00 00 02 00 82 00 92 | 找到指纹,存在ID2,得分0x82 | ||
23 | EF 01 FF FF FF FF 01 00 03 1d 00 21 | 读取模板个数 | EF 01 FF FF FF FF 07 00 05 00 00 03 00 0F | 有效模板3个 |
接下来就是就这些命令通过程序自动化。
AS608程序
//读记事PS_ReadNotepad
//功能: 读取FLASH用户区的128bytes数据
//参数: NotePageNum(0~15)
//说明: 模块返回确认字+用户信息
u8 PS_ReadNotepad(u8 NotePageNum,u8 *Byte32)
{
u16 temp;
u8 ensure,i;
u8 *data;
SendHead();
SendAddr();
SendFlag(0x01);//命令包标识
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中的特征文件高速搜索整个或部分指纹库。
// 若搜索到,则返回页码,该指令对于的确存在于指纹库中 ,且登录时质量
// 很好的指纹,会很快给出搜索结果。
//参数: BufferID, StartPage(起始页),PageNum(页数)
//说明: 模块返回确认字+页码(相配指纹模板)
u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)
{
u16 temp;
u8 ensure;
u8 *data;
SendHead();
SendAddr();
SendFlag(0x01);//命令包标识
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;
}
//读有效模板个数 PS_ValidTempleteNum
//功能:读有效模板个数
//参数: 无
//说明: 模块返回确认字+有效模板个数ValidN
u8 PS_ValidTempleteNum(u16 *ValidN)
{
u16 temp;
u8 ensure;
u8 *data;
SendHead();
SendAddr();
SendFlag(0x01);//命令包标识
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有效指纹个数=%d",(data[10]<<8)+data[11]);
}
else
printf("\r\n%s",EnsureMessage(ensure));
return ensure;
}
//与AS608握手 PS_HandShake
//参数: PS_Addr地址指针
//说明: 模块返新地址(正确地址)
u8 PS_HandShake(u32 *PS_Addr)
{
u16 temp;
SendHead();
SendAddr();
MYUSART_SendData(0X01);
MYUSART_SendData(0X00);
MYUSART_SendData(0X03);
MYUSART_SendData(0X0f);
temp = 0x01+0x03+0x0f;
SendCheck(temp);
delay_ms(200);
if(USART2_RX_STA&0X8000)//接收到数据
{
if(//判断是不是模块返回的应答包
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;
}
硬件
板子还预留的ESP8266可以接入网络。
实物演示
哎,我还没录!
源码地址:
v:shiboven