STM32项目设计:智能门禁系统核心板版本 4种解锁方式

2023-12-23 12:36

本文主要是介绍STM32项目设计:智能门禁系统核心板版本 4种解锁方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、项目简介
  • 二、原理图设计![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/809dd6c70b34425eb42f69187020c717.png)
  • 程序设计

在这里插入图片描述
哔哩哔哩视频链接: https://www.bilibili.com/video/BV1K64y1V7Y9?p=4&spm_id_from=pageDriver&vd_source=e5082ef80535e952b2a4301746491be0
实物购买链接: https://m.tb.cn/h.5NEporx?tk=LsaZWgPDsDb CZ3457

一、项目简介

指纹门禁密码锁是一种既可以通过密码输入,指纹识别也可以通过识别IC卡来实现门禁的开启关闭功能。在日常生活种它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的门禁密码锁是以芯片为核心,通过编程来实现的。
利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现门禁密码锁的基本功能,其主要具有如下功能:
●指纹识别
●手机蓝牙控制
●密码通过键盘输入,若密码正确,则将锁打开
●密码输入错误,蜂鸣器将报警提示
●用户可以自由设定密码
●RC522射频卡识别
●OLED显示
●步进电机控制电路
系统方案
采用一种是用以STM32F103C8T6为核心的单片机控制方案,其原理如图2.1所示:
在这里插入图片描述

二、原理图设计在这里插入图片描述

程序设计


#include "main.h"#include "config.h"
#include <string.h>int main(void)
{int Error;  //密码验证信息int key_num;int time1;int time2;		//锁屏时间char arrow = 0; //箭头位子P_USER p_user;P_RECV_MSG p_msg;//SysHSI_Init();delay_init();	    	 //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600);	 //串口初始化为9600printf("串口功能正常\r\n");Button4_4_Init();          //初始化与按键连接的硬件接口OLED_Init();    			//显示初始化Walkmotor_Init();        //步进电机初始化BEEP_Init();			//蜂鸣器初始化usart2_init(usart2_baund);           //初始化指纹模块PS_StaGPIO_Init();USART3_init(115200);   //人脸识别串口初始化OLED_Clear();starting();//开机信息  logoif(RTC_Init())	  			//RTC初始化{OLED_Clear_NOupdate();Show_Str(12, 13, 128, 20, (u8*)"RTC CRY ERR!", 12, 0);OLED_Refresh_Gram();//更新显示delay_ms(3000);}SysPartInit();   //系统参数初始化Cfg_FR1002_State(sysFlag.fr_state);//配置人脸识别模块工作状态while(1){
//锁屏界面
MAIN:OLED_Clear();while(1){time1++;Display_Data();//时间显示:每1000ms更新一次显示数据if(sysFlag.DisFlag == 1){sysFlag.DisFlag = 0;OLED_Refresh_Gram();//更新显示}//密码锁key_num = Button4_4_Scan();	//按键扫描if(key_num){Error = password(); //密码解锁函数if(Error == 0){goto MENU;	//跳到解锁界面}}if((time1 % 500) == 1){//MFRC522解锁MFRC522_Initializtion();Error = MFRC522_lock();if(Error == 0){goto MENU;}//手机蓝牙解锁密码1Error = usart1_cherk((char*)sys.passwd1);if(Error == 0) {OLED_Clear_NOupdate();Show_Str(12, 13, 128, 20, (u8*)"蓝牙密码1:正确", 12, 0);OLED_Refresh_Gram();//更新显示delay_ms(800);Set_UnLock();goto MENU;}//手机蓝牙解锁密码2Error = usart1_cherk((char*)sys.passwd2);if(Error == 0) {sys.errCnt = 0;OLED_Clear_NOupdate();Show_Str(12, 13, 128, 12, (u8*)"蓝牙密码2:正确", 12, 0);OLED_Refresh_Gram();//更新显示delay_ms(800);Set_UnLock();goto MENU;}delay_ms(1);} else {//指纹解锁if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下{while(PS_Sta) {Error = press_FR(); //刷指纹if(Error == 0){//Set_UnLock();goto MENU;   //跳到解锁界面}}}}/********************主界面**************************/MENU:OLED_Clear();Dis_SysSetup(arrow);while(1){//超时锁屏time2++;//功能选项选择key_num = Button4_4_Scan();if(time2 > 10000 | key_num == 4) {OLED_Clear_NOupdate();Set_Lock();if(time2 > 10000)beep_on_mode2();time2 = 0;
//								delay_ms(1000);OLED_Clear_NOupdate();goto MAIN;}//手机蓝牙锁定if(memcmp(USART_RX_BUF, "LOCK", 4) == 0)	{
//							USART_RX_STA=0;
//							memset(USART_RX_BUF,0,USART_REC_LEN);Set_Lock();goto MAIN;}if(key_num){time2 = 0;if(key_num == 13) {if(arrow > 0)arrow--;}if(key_num == 15) {if(arrow < MAX_SYS_PARA_NUM-1)arrow++;}Dis_SysSetup(arrow);if(key_num == 16) {switch(arrow){case ADD_FIG:Add_FR();break;//录指case DEL_FIG:Del_FR();break;//删指纹case MOD_PSWD:SetPassworld();break;//修改密码case MOD_TIMES:Set_Time();break;  //设置时间case ADD_RFID:Add_Rfid();break;  //录入卡片case DEL_RFID:Delt_Rfid();break;case ADD_FACE:Add_Face();break;case DEL_FACE:Delt_Face();break;}goto MENU;}}delay_ms(1);}}
}

这篇关于STM32项目设计:智能门禁系统核心板版本 4种解锁方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/528070

相关文章

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼