文章目录
1 简介2 绪论2.1 课题背景2.2 项目内容
3 系统设计3.1 系统架构3.2 硬件设计3.3 指纹识别模块的程序设计3.3.1 指纹录入3.3.2 指纹识别代码流程
3.4 显示屏程序设计3.5 整体业务逻辑代码流程3.6 实现效果3.7 部分相关代码
4 最后
1 简介
Hi,大家好,今天向大家介绍一个学长做的单片机项目
基于单片机的指纹识别门禁系统设计
大家可用于 课程设计 或 毕业设计
2 绪论
2.1 课题背景
人们在生活中需要安全的门禁设施,来保证自己的财产安全,各种各样的门禁系统随之而生。但随着数字化和网络化的不断发展,以前的门禁方式在鉴别方式、速度和性能方面越来越不能满足人们的需要,比如射频卡、数字密码等方式,其安全性不够高。在新的方式开发的过程中,由于人的身体特点具有不可复制性,所以人们把目光转移到这上面来,开始了生物识别的门禁系统的开发。指纹识别作为生物特征识别,它是独特的,它的特点是不易伪造,以为它的这些特点目前已被广泛应用于安全访问。
2.2 项目内容
本项目基于对指纹识别技术和指纹识别系统的发展研究的意义的分析,给出指纹识别门禁系统总体框架,阐述了各子模块的硬件和软件资源。
首先简要介绍了指纹识别算法,重点介绍了指纹识别模块(FM-180)的使用方法,包括它的硬件连接和软件指令的使用方法。
在此基础上,设计了以STC89C52单片机为核心的指纹识别门禁系统,指纹识别模块负责识别指纹,并传输给单片机结果,单片机根据结果来控制液晶显示和蜂鸣器的声音提示,再控制继电器的开闭,单片机还能通过网络模块与上位机实现远程通讯。
之后,介绍了软件部分的设计,包括单片机、液晶屏、指纹识别模块和上位机的软件设计。
通过对系统的模型样机的测试表明,系统能够完成基本功能并具有较好的稳定性,初步达到了预期的设计目标。
3 系统设计
3.1 系统架构
以系统主要分为上位机和下位机两部分,上位机作为主要的控制部分,通过网络对多个下位机进行控制,并且实现用户等级的设定。指纹录入端位于大楼的入口处,对进入者进行指纹录入工作。下位机则是门禁的实际控制端,通过指纹识别模块,对用户进行识别,进而控制门锁的开闭。整体框架可以为如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/c13a6d73f7cb47f683cca0f09ef57e3d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAREMtU1RESU8=,size_20,color_FFFFFF,t_70,g_se,x_16)
上位机与下位机各自分工,上位机与下位机通过网络模块进行通讯。下位机是与门直接相连的部分,通过指纹识别模块对用户的指纹进行识别,并将结果传输给单片机,单片机再进一步控制液晶显示结果,并通过蜂鸣器发出声音提示,用户还能够进行按键调节。下位机的框架如下所示
![在这里插入图片描述](https://img-blog.csdnimg.cn/6f4ef0b1a99744e39e053d465576edac.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAREMtU1RESU8=,size_20,color_FFFFFF,t_70,g_se,x_16)
本系统的主要功能特点:
(1) 拥有高效的指纹识别模块, 可以十分快捷的利用指纹开锁, 高效方便,且安全性高。(2) 上位机部分由科学的管理软件, 能够实现门禁的科学化管理。(3) 上位机与下位机的通信采用以太网模块, 可以实现远距离的控制。(4) 门禁系统的用户采用权限分割, 不同的用户拥有的权限不同, 能够进入的门也不同, 从而实现用户的逐级权限管理。
3.2 硬件设计
指纹识别门禁系统的硬件部分需要完成一系列复杂的任务,包括图像采集、图像处理、图像对比等,还需要在与上位机通信时上传指纹模板,以及控制外围器件等工作。所以要实现这样一个复杂的任务,需要处理器具有比较强的计算能力和控制能力,并且储存器资源要大。
![在这里插入图片描述](https://img-blog.csdnimg.cn/468728951d954e63a10ac3826c872528.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAREMtU1RESU8=,size_20,color_FFFFFF,t_70,g_se,x_16)
3.3 指纹识别模块的程序设计
指纹识别模块需要完成的工作有:获取指纹图像,生成指纹特征模板,储存指纹特征模板和匹配指纹等工作,单片机根据模块的指令系统,给模块发送指令信息,来控制模块完成相应的工作。
3.3.1 指纹录入
指纹录入过程, 用于新用户的注册, 当有新用户需要注册时, 就先在指纹头处获取用户的指纹图像, 在将之生成指纹特征模板, 在储存起来, 这样就完成了新用户的注册。
![在这里插入图片描述](https://img-blog.csdnimg.cn/995e46a01b3346f79777b46fad36219c.png)
3.3.2 指纹识别代码流程
![在这里插入图片描述](https://img-blog.csdnimg.cn/a795cf11d7734c1494d0cba619cfa6a6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAREMtU1RESU8=,size_16,color_FFFFFF,t_70,g_se,x_16)
3.4 显示屏程序设计
![在这里插入图片描述](https://img-blog.csdnimg.cn/1c8715d671ad4488b5d1d1c370872c7d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAREMtU1RESU8=,size_14,color_FFFFFF,t_70,g_se,x_16)
3.5 整体业务逻辑代码流程
软件使用 Keil C51 版本, 主程序采用 c 语言编写。 单片机对指纹识别模块发送命令, 得到识别结果, 在根据这个结果来控制显示模块、 语音模块和电子锁模块。 程序的主流程图如下所示: ![在这里插入图片描述](https://img-blog.csdnimg.cn/3a875bfa1ce0402b94b05e3f98dcd092.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAREMtU1RESU8=,size_20,color_FFFFFF,t_70,g_se,x_16)
3.6 实现效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/8f9a5da26525496eb896b1b11d0af750.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAREMtU1RESU8=,size_70,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/c090a5b7e509409497c372cd63351ea4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAREMtU1RESU8=,size_48,color_FFFFFF,t_70,g_se,x_16)
3.7 部分相关代码
#include "stm32f10x.h"
#include "sys.h"
#include "FPM10A.h"
//#include "usart.h"
#include "usart1.h"
#include "usart4.h"
#include "usart5.h"
#include "sys.h"
#include "stdio.h"
#include "string.h"
#include "delay.h"
#include "deal_fg.h"
#include "pwm_config.h"
#include "Run.h"
#include "led.h"
#include "bsp_i2c_ee.h"
#include "Computer.h"
#include "bsp_rtc.h"
#include "key.h"
#include "finger.h"
extern unsigned char si[11];
unsigned char yanz[6]={0x01,0x00,0x03,0x11,0x00,0x15};
unsigned char id_table[4];
int Dump_flag = 0;
struct rtc_time systmtime;
extern unsigned char FG_Key[10];
extern unsigned char FP_Pack_Head[6]; //协议包头
extern unsigned char test_fig(void);
extern unsigned char dat[18];
extern void uart_init(u32 bound);
extern void My_USART2_Init(void);
extern void My_USART3_Init(void);
extern void USART_SendStr(USART_TypeDef* USARTx,unsigned char *data1);
extern void USART_SendByte(USART_TypeDef* USARTx,unsigned char temp);
extern unsigned char USART_ReceivByte(USART_TypeDef* USARTx);
extern void USART_ReceiveStr(USART_TypeDef* USARTx,unsigned char ucLength);
extern void Delete_FG(void);
unsigned char yi[12];
extern volatile unsigned char USART_ReceStr[24];
extern unsigned char san[11];
extern unsigned char er[10];
unsigned char deal_dd[11] = {0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char cal_p[16]="abcdeadffasdfdas";
unsigned char cal_test[16]={0};
unsigned int Times11[8];
int Flag =0;
//void cleck_FG(void);
unsigned char sss[11];
struct rtc_time systmtime;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
My_USART2_Init(); //串口2初始化
My_USART3_Init(); //串口3初始化
usart4_Configuration(9600); //串口4使能
pwm_config(); //pwm使能
delay_init(); //延时初始化
uart_init(9600); //串口初始化使能
KEY_Init(); //按键初始化
LED_Init(); //led灯初始化
RTC_NVIC_Config(); //时钟使能
RTC_CheckAndConfig(&systmtime); //全局时钟使能
delay_ms(1000);
if (ee_CheckOk() == 0) //没有检测到EEPROM
{
printf("没有检测到串行EEPROM!\r\n");
while (1); /* 停机 */
}
do //通讯
{
unsigned char i;
for(i=0;i |