• 【毕业设计】基于单片机的门禁系统 - 嵌入式 物联网



    1 简介

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

    基于单片机的门禁系统

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


    单片机-嵌入式毕设选题大全及项目分享:

    https://blog.csdn.net/m0_71572576/article/details/125409052


    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 0x14
     
    extern 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 module
     
    uint8_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;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336

    单片机-嵌入式毕设选题大全及项目分享:

    https://blog.csdn.net/m0_71572576/article/details/125409052


    6 最后

  • 相关阅读:
    jquery.cookie.min.js 1.4.1版本
    《Linux运维总结:内网服务器通过代理访问外网服务器(方法一)》
    docker for windonws--Windows 10 家庭中文版 21H2 安装Docker Desktop初体验
    机器学习复习(8)——逻辑回归
    基于ssm的图书管理系统的设计与实现
    Python3无法调用Sqlalchemy解决(mysqldb)
    python实现udp通信代码
    分布式系统大势所趋,银行运维如何与时俱进?
    设计模式:适配器模式(论如何把鼠头适配加工成鸭脖)
    学习css 伪类:has
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/125421168