文章目录

  • 1 简介
  • 2 课题背景
  • 3 详细设计
    • 3.1 整体设计方案
    • 3.2 功能模块
    • 3.3 软件设计
  • 4 实现效果
  • 5 部分实现代码

1 简介

Hi,大家好,今天向大家介绍一个学长做的单片机项目

基于单片机的门禁系统

大家可用于 课程设计 或 毕业设计

选题指导,项目分享:

https://gitee.com/yaa-dc/warehouse-1/blob/master/iot/README.md

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;
}

选题指导,项目分享:

https://gitee.com/yaa-dc/warehouse-1/blob/master/iot/README.md

单片机毕业设计 智能门禁系统相关推荐

  1. 毕业设计 基于单片机的智能门禁系统

    文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,学长今天向大家介绍一个学长做 ...

  2. stm32毕业设计 智能门禁系统

    文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,今天向大家介绍一个学长做的单 ...

  3. 物联网毕业设计 智能门禁系统

    文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 1 简介 Hi,大家好,今天向大家介绍一个学长做的单片机项目 ...

  4. 毕业设计 RFID智能门禁系统 - 单片机 物联网 嵌入式

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...

  5. 毕业设计 RFID 单片机智能门禁系统

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...

  6. 单片机毕业设计 RFID智能门禁系统

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...

  7. 基于51单片机的RFID智能门禁系统

    1.概述 (1)本设计采用STC89C52作为主控芯片,专用读卡器模块用来读射频卡的信息,当有卡进入到读卡器读卡的范围内时就会读取到相应的卡序列号,并根据得到的卡序列号做出相应的操作.若正确则开门,若 ...

  8. 单片机毕业设计 stm32指纹识别考勤系统

    文章目录 1 简介 2 指纹考勤的背景意义 3 课题目标 4 系统设计 4.1 硬件电路设计 4.1.1 单片机主控 4.1.2 LCD 显示屏 4.1.3 实时时钟 4.1.4 指纹识别模块 4.2 ...

  9. 毕业设计 嵌入式 RFID智能门禁系统

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...

最新文章

  1. 给windows装个Mac黑苹果虚拟机
  2. 秘籍:设计模式PDF学习笔记!
  3. pwn学习总结(五) —— 堆溢出经典题型整理
  4. Qt的MDI中多个子窗口响应一个菜单事件的优雅实现(动态slot)
  5. 「北京」京东 JD.COM 招聘中/高级前端工程师
  6. php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...
  7. java内存shell_Springboot 内存shell
  8. 智能家居系统--选配防盗锁新(转载)
  9. Gartner:市场对5G判断有三点误区,2022年前不会有大规模5G商用案例
  10. 第一节、网络安全术语解释
  11. python数据可视化:使用dash给博客制作一个dashboard
  12. Elasticsearch(三)使用 Kibana 操作 ES
  13. [清橙A1364]社交网络结构洞【暴力】
  14. Docker快速入门-腾讯云
  15. 关于升级短信源码开发接入SMPP通道
  16. Java 模拟鼠标、键盘--向可编辑窗口录入内容
  17. 业余草双因素认证(2FA)教程
  18. 云服务器不需要网站吗,网站不用云服务器可以吗
  19. # Windows下关于安装Geany编辑器过程中的一点小发现(可能对初次安装的人有用)
  20. Mac os 上最简便的企业微信和微信双开方法

热门文章

  1. java毕业设计郑财校园新闻管理系统Mybatis+系统+数据库+调试部署
  2. 微信小程序被判定诱导分享处理方案
  3. 股东诉苦,马斯克吐槽...特斯拉股东大会开成了脱口秀
  4. 美元汇率对A股市场影响
  5. (学习笔记)树莓派4B使用usb转串口通讯模块
  6. DualCor: Event Causality Extraction with Event Argument Correlations论文解读
  7. 计算机专业考研还是就业
  8. 手机连接wifi后,不能打开微信图片
  9. 今天差点回不了家了...
  10. 利用状态机实现简易包文类型识别器