stm32毕业设计 智能门禁系统
文章目录
- 1 简介
- 2 课题背景
- 3 详细设计
- 3.1 整体设计方案
- 3.2 功能模块
- 3.3 软件设计
- 4 实现效果
- 5 部分实现代码
- 6 最后
1 简介
Hi,大家好,今天向大家介绍一个学长做的单片机项目
基于单片机的门禁系统
大家可用于 课程设计 或 毕业设计
2 课题背景
门禁系统的基本组成主要包括身份识别、传感与报警、处理与控制、电锁与执行、管理与设置。
本系统从应用角度出发,针对家庭或小型办公场所的使用需求,主要从两个方面着手优化设计:一是硬件搭建上坚持低功耗设计,加入电源管理模块供电;二是在软件实现上,尝试多种策略来提高系统的响应速度,并考虑多种情况下的报警处理,提高系统的安全性。
3 详细设计
3.1 整体设计方案
学长设计的禁系统主控制芯片采用 STM32 单片机 STM32F103, 指纹识别模块采用 ATK-AS608 模块, 并用 LCD12864 显示处理的结果信息。 尝试多种策略来提高系统识别和响应速度。
3.2 功能模块
实现的主要功能有:
通过usb转串口,进行指纹的录入。
通过编程软件keil4将程序烧录到主控板STM32F103,LCD12864液晶屏幕显示“请输入您的指纹”,若指纹模块初始化失败,则显示“录入指纹失败”。用录入指纹开锁,若指纹识别成功,电磁锁开锁;
若指纹识别不成功,则语音提示“叮铃叮铃”,液晶显示“识别指纹失败”,在这种情况下,还剩两次录入机会,若三次指纹识别均失败,则系统会报警。
通过密码也可以开锁,同样有三次机会。预先用矩阵键盘登记保存密码,登记密码时,需要6-13位字符,按“#”号键结束。
听到“请再输入同一密码”,再次在按键板上输入同一密码;听到“密码登记成功”,液晶屏上会显示添加成功。
用密码开锁时,若三次匹配失败,则系统会报警,液晶屏会显示“开门失败”。
该系统的结构主要包括6个模块:
- 门锁控制模块
- 主控制芯片
- 矩阵键盘模块
- 指纹识别模块
- 液晶显示
- 电源管理模块.
3.3 软件设计
设计一个童锁功能,软件实现流程如下:
主程序流程:
主程序主要包括上电初始化、指纹设置、密码设置、指纹识别模块、继电器驱动模块、密码处理模块、语音报警模块等子程序构成.
4 实现效果
5 部分实现代码
指纹模块代码:
#ifndef __TFS_M64_H
#define __TFS_M64_H#include "stm32f10x.h"#define TRUE 1
#define FALSE 0//基本应答信息定义
#define ACK_SUCCESS 0x00 //操作成功
#define ACK_FAIL 0x01 //操作失败
#define ACK_FULL 0x04 //指纹数据库已满
#define ACK_NOUSER 0x05 //无此用户
#define ACK_USER_EXIST 0x07 //用户已存在
#define ACK_TIMEOUT 0x08 //采集超时#define ACK_GO_OUT 0x0F
//用户信息定义
#define ACK_ALL_USER 0x00
#define ACK_GUEST_USER 0x01
#define ACK_NORMAL_USER 0x02
#define ACK_MASTER_USER 0x03#define USER_MAX_CNT 50//位置定义
#define HEAD 0
#define CMD 1
#define CHK 6
#define TAIL 7#define P1 2
#define P2 3
#define P3 4
#define Q1 2
#define Q2 3
#define Q3 4//命令定义
#define CMD_HEAD 0xF5
#define CMD_TAIL 0xF5
#define CMD_ADD_1 0x01
#define CMD_ADD_2 0x02
#define CMD_ADD_3 0x03
#define CMD_MATCH 0x0C
#define CMD_DEL 0x04
#define CMD_DEL_ALL 0x05
#define CMD_USER_CNT 0x09
#define CMD_SLEEP_MODE 0x2C
#define CMD_ADD_MODE 0x2D#define CMD_FINGER_DETECTED 0x14extern uint8_t gFpmTxBuf[9];
extern uint8_t gFpmRxBuf[9];
extern uint8_t gFpmRxCnt;uint8_t fpm_sendAndReceive(uint16_t delayMs);
uint8_t fpm_sleep(void);
uint8_t fpm_setAddMode(uint8_t mode);
uint8_t fpm_readAddMode(void);
uint16_t fpm_getUserNum(void);
uint8_t fpm_deleteAllUser(void);
uint8_t fpm_deleteUser(uint8_t userNum);
uint8_t fpm_addUser(uint8_t userNum, uint8_t userPermission);
uint8_t fpm_compareFinger(void);#include "tfs-m64.h"
#include "usart2.h"
#include "delay.h"
#include "usart.h"
///指纹模块 :Fingerprint moduleuint8_t gFpmTxBuf[9];
uint8_t gFpmRxBuf[9];
uint8_t gFpmRxCnt;/*** @brief 通过串口向指纹模块发送命令并接收响应指令* @param timeOut:超时时间(单位:ms),在此时间内如果仍未接收到响应指令按超时处理* @retval 应答信息*/
uint8_t fpm_sendAndReceive(uint16_t timeout)
{uint8_t i, j;uint8_t checkSum = 0; //校验码gFpmRxCnt = 0; //接收计数清零,相当于清空缓冲区gFpmTxBuf[5] = 0; //命令数据的第六位始终为零/*发送8位数据包*/usart2_sendByte(CMD_HEAD); //数据头for (i = 1; i < 6; i++) //中间数据段{usart2_sendByte(gFpmTxBuf[i]); checkSum ^= gFpmTxBuf[i];}usart2_sendByte(checkSum); //校验码usart2_sendByte(CMD_TAIL); //数据尾while (gFpmRxCnt < 8 && timeout > 0){delay_ms(1);timeout--; }if (gFpmRxCnt != 8) return ACK_TIMEOUT;if (gFpmRxBuf[HEAD] != CMD_HEAD) return ACK_FAIL;if (gFpmRxBuf[TAIL] != CMD_TAIL) return ACK_FAIL;if (gFpmRxBuf[CMD] != (gFpmTxBuf[CMD])) return ACK_FAIL;checkSum = 0;for (j = 1; j < CHK; j++) { checkSum ^= gFpmRxBuf[j];}if (checkSum != gFpmRxBuf[CHK]) {return ACK_FAIL;}return ACK_SUCCESS;
} /*** @brief 使指纹模块进入休眠模式* @param none* @retval 应答信息(ACK_SUCCESS ACK_FAIL)*/
uint8_t fpm_sleep(void)
{uint8_t res;gFpmTxBuf[CMD] = CMD_SLEEP_MODE;gFpmTxBuf[P1] = 0;gFpmTxBuf[P2] = 0;gFpmTxBuf[P3] = 0;res = fpm_sendAndReceive(500);if(res == ACK_SUCCESS) {return ACK_SUCCESS;}else {return ACK_FAIL;}}/*** @brief 设置指纹的添加模式* @param mode:指纹的添加模式(0:允许重复 1:禁止重复)* @retval 应答信息(ACK_SUCCESS ACK_FAIL)*/
uint8_t fpm_setAddMode(uint8_t mode)
{uint8_t res;gFpmTxBuf[CMD] = CMD_ADD_MODE;gFpmTxBuf[P1] = 0;gFpmTxBuf[P2] = mode;gFpmTxBuf[P3] = 0;res = fpm_sendAndReceive(200);if(res == ACK_SUCCESS && gFpmRxBuf[Q3] == ACK_SUCCESS) {return ACK_SUCCESS;}else {return ACK_FAIL;}
}/*** @brief 读取指纹的添加模式* @param none* @retval 应答信息(0:允许重复 1:禁止重复)*/
uint8_t fpm_readAddMode(void)
{ gFpmTxBuf[CMD] = CMD_ADD_MODE;gFpmTxBuf[P1] = 0;gFpmTxBuf[P2] = 0;gFpmTxBuf[P3] = 0X01;fpm_sendAndReceive(200);return gFpmRxBuf[Q2];
}/*** @brief 获取用户数(实际上应该是指纹数,这里用用户数表示是为了与通信协议表述一致)* @param none* @retval 应答信息(指纹的数目)*/
uint16_t fpm_getUserNum(void)
{uint8_t res;gFpmTxBuf[CMD] = CMD_USER_CNT;gFpmTxBuf[P1] = 0;gFpmTxBuf[P2] = 0;gFpmTxBuf[P3] = 0;res = fpm_sendAndReceive(200);if(res == ACK_SUCCESS && gFpmRxBuf[Q3] == ACK_SUCCESS) {return gFpmRxBuf[Q2];}else {return 0XFF;}}/*** @brief 删除所有的指纹* @param none* @retval 应答信息(ACK_SUCCESS ACK_FAIL)*/
uint8_t fpm_deleteAllUser(void)
{uint8_t res;gFpmTxBuf[CMD] = CMD_DEL_ALL;gFpmTxBuf[P1] = 0;gFpmTxBuf[P2] = 0;gFpmTxBuf[P3] = 0;res = fpm_sendAndReceive(200);if(res == ACK_SUCCESS && gFpmRxBuf[Q3] == ACK_SUCCESS) {return ACK_SUCCESS;}else {return ACK_FAIL;}
}/*** @brief 删除制定位置的指纹* @param userNum:指纹的位置(1-255)* @retval 应答信息(ACK_SUCCESS ACK_FAIL)*/
uint8_t fpm_deleteUser(uint8_t userNum)
{uint8_t res;gFpmTxBuf[CMD] = CMD_DEL;gFpmTxBuf[P1] = 0;gFpmTxBuf[P2] = userNum;gFpmTxBuf[P3] = 0;res = fpm_sendAndReceive(200);if(res == ACK_SUCCESS && gFpmRxBuf[Q3] == ACK_SUCCESS) {return ACK_SUCCESS;}else {return ACK_FAIL;}
}/*** @brief 录入指纹* @param userNum:指纹存入的位置(1-255)* @param userPermission:用户权限(1-3),具体含义自行定义。* @retval 应答信息(ACK_SUCCESS ACK_FAIL ACK_USER_EXIST ACK_TIMEOUT)*/
uint8_t fpm_addUser(uint8_t userNum, uint8_t userPermission)
{uint8_t res;gFpmTxBuf[CMD] = CMD_ADD_1;gFpmTxBuf[P1] = 0;gFpmTxBuf[P2] = userNum;gFpmTxBuf[P3] = userPermission;res = fpm_sendAndReceive(30000);if(res == ACK_SUCCESS) {if(gFpmRxBuf[Q3] == ACK_SUCCESS) {gFpmTxBuf[CMD] = CMD_ADD_2;res = fpm_sendAndReceive(30000);if(res == ACK_SUCCESS) {if(gFpmRxBuf[Q3] == ACK_SUCCESS) {gFpmTxBuf[CMD] = CMD_ADD_3;res = fpm_sendAndReceive(30000);if(res == ACK_SUCCESS) {return gFpmRxBuf[Q3];} }}}}return res;}/*** @brief 通过1:N的方式比较指纹* @param none* @retval 匹配指纹的信息*/
uint8_t fpm_compareFinger(void)
{uint8_t res;gFpmTxBuf[CMD] = CMD_MATCH;gFpmTxBuf[P1] = 0;gFpmTxBuf[P2] = 0;gFpmTxBuf[P3] = 0;res = fpm_sendAndReceive(30000);if(res == ACK_SUCCESS) {if(gFpmRxBuf[Q3] == ACK_NOUSER) {return ACK_NOUSER;}if(gFpmRxBuf[Q3] == ACK_TIMEOUT) {return ACK_TIMEOUT;}if((gFpmRxBuf[Q2] != 0) && (gFpmRxBuf[Q3] == 1 || gFpmRxBuf[Q3] == 2 || gFpmRxBuf[Q3] == 3)) {return ACK_SUCCESS;}}return res;
}
6 最后
stm32毕业设计 智能门禁系统相关推荐
- 单片机毕业设计 智能门禁系统
文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 1 简介 Hi,大家好,今天向大家介绍一个学长做的单片机项目 ...
- 物联网毕业设计 智能门禁系统
文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 1 简介 Hi,大家好,今天向大家介绍一个学长做的单片机项目 ...
- 基于STM32的智能门禁系统
stm32F407主控芯片 RFID模块 矩阵按键模块 AS608指纹模块 SG90舵机模块 OLED显示屏模块 一.系统设计框架图 二.模块设计 RFID 寻卡 //功能描述寻卡读取卡类型号 / ...
- 单片机毕业设计 基于stm32的病房呼叫系统
文章目录 1 简介 2 绪论 2.1 课题背景 3 系统设计 3.1 系统架构 3.2 主程序设计 3.3 语音模块程序设计 3.4 显示模块程序设计 3.5 键盘模块程序设计 3.6 无线传输模块程 ...
- stm32毕业设计 病房智能呼叫系统
文章目录 1 简介 2 绪论 2.1 课题背景 3 系统设计 3.1 系统架构 3.2 主程序设计 3.3 语音模块程序设计 3.4 显示模块程序设计 3.5 键盘模块程序设计 3.6 无线传输模块程 ...
- 基于stm32智能门禁系统,指纹锁(RFID+键盘+指纹+OLED)
基于stm32智能门禁系统,指纹锁(RFID+键盘+指纹+OLED) 主要功能: 1.同时支持指纹,密码,RFID开锁 2.支持删除.修改用户,断电保存(flash模拟EEPROM) 3.4×4矩阵键 ...
- 物联网毕业设计 STM32智能病房呼叫系统 - 嵌入式
文章目录 1 简介 2 绪论 2.1 课题背景 3 系统设计 3.1 系统架构 3.2 主程序设计 3.3 语音模块程序设计 3.4 显示模块程序设计 3.5 键盘模块程序设计 3.6 无线传输模块程 ...
- STM32项目分享---MQTT智能门禁系统(含APP控制)
前言 自己写了一个简单的MQTT协议的智能门禁系统,包含了一些基本功能,可供想学习MQTT或者RC522的同学进行一个学习,资源连接放到最后,需要的同学自取 资源囊括 智能门禁使用说明 连线图 1. ...
- 基于STM32的智能门禁卡片(开题报告)
备注:本文参考了稚晖君的智能门禁卡项目,当时开本项目是作为我毕设的备选方案之一,不过后面被指导老师否决后,只保留了开题报告,我没有更多的研究资料了. 基于STM32的智能门禁卡片(开题报告) 一.研究 ...
最新文章
- 《网站分析师实战指南》一1.4 进入实战之路
- Java Management extentsions(jmx)与tomcat
- SpringBoot异常处理的简单理解
- ITK:Watch注册Registration
- csv数据去重 python_python批量查询、汉字去重处理CSV文件
- TCP和IP协议的特点
- 【华为云技术分享】开发团队中的任务没人领取,你头疼吗?
- 苹果宣布取消AirPower 因技术难题无法攻克
- android 多行文字水印,android实现文字水印效果 支持多行水印
- 怎么看铜皮属性_阻抗匹配怎么做 及阻抗匹配的作用。
- silverlight 4常用的多线程技术
- mssql 获取2个时间之间相距的时分秒(取余数得秒)
- 重装机兵3 完美攻略修正版
- hive sql 添加字段以及修改字段
- vue3中使用tsx
- 如何将图片转换成字符画
- Java程序编写----个人所得税计算器编写
- MyBatis配置文件,节点顺序
- 在北京的互联网公司工作多少年可以买房?
- 鼠标点击控制div层展开收缩