基于STM32的指纹门禁系统

基于STM32的指纹门禁系统


系统简介

  • 指纹系统,可以存指纹;
  • 指纹对了之后开门;

材料

  • STM32F103C8T6芯片
  • OLED液晶显示屏
  • 杜邦线
  • AS608模块
  • 用keil5进行开发

开始制作

制作过程

AS608模块调试
模块原理

模块是通过串口通信,采用回复式通信。

基于STM32的指纹门禁系统_第1张图片
这是我整理的常用模块命令

序号 指令 作用 返回 意义
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;		
}
硬件

基于STM32的指纹门禁系统_第2张图片
基于STM32的指纹门禁系统_第3张图片
基于STM32的指纹门禁系统_第4张图片
板子还预留的ESP8266可以接入网络。

实物演示

哎,我还没录!
源码地址:
v:shiboven

你可能感兴趣的:(stm32,嵌入式硬件,单片机)