26 基于STM32的智能门禁系统(指纹、蓝牙、刷卡、OLED、电机)

news2024/11/18 4:37:38

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于STM32单片机,六个按键,分别代表指纹、蓝牙、刷卡的正确进门与错误进门;
比如第一个按键按下,表示指纹正确,OLED显示指纹正确,开门,
第二个按键按下的话,则指纹错误,OLED显示指纹错误,请重试,
第二个按键连续按三次以上,则OLED显示开门失败,此时启动报警系统,
即蜂鸣器报警。同理,蓝牙与刷卡的操作同样如此。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

#include "main.h"#include "gpio.h"#include "./HAL/key/key.h"#include "./HAL/OLED/OLED\_NEW.H"void Key\_function(void);								//按键函数void Display\_function(void); //显示函数void Manage\_function(void);							//处理函数#define LED(a) (a?HAL\_GPIO\_WritePin(LED\_GPIO\_Port, LED\_Pin, GPIO\_PIN\_RESET):HAL\_GPIO\_WritePin(LED\_GPIO\_Port, LED\_Pin, GPIO\_PIN\_SET)) #define BEEP(a) (a?HAL\_GPIO\_WritePin(BEEP\_GPIO\_Port, BEEP\_Pin, GPIO\_PIN\_RESET):HAL\_GPIO\_WritePin(BEEP\_GPIO\_Port, BEEP\_Pin, GPIO\_PIN\_SET)) uint8\_t key\_num,flag\_display;         //按键与显示变量static int flag=0;uint8\_t flag\_led,flag\_beep;						//灯、报警标志位uint16\_t time\_num;static int flag1=0;void SystemClock_Config(void);/****
*******按键设置函数
*****/void Key_function(void){
	key\_num = Chiclet\_Keyboard_Scan();	//按键扫描
	if(key_num != 0)										//有按键按下
	{		switch(key_num)
		{			case 1:flag=1;break;			case 2:flag=3;break;			case 3:flag=5;break;			case 4:flag=2;flag1++;break;			case 5:flag=4;flag1++;break;			case 6:flag=6;flag1++;break;
		}
	
	}
}/****
*******显示函数
*****/void Display_function(void){	switch(flag)
	{		case 1:			Oled\_ShowCHinese(0,0,"指纹正确");			Oled\_ShowString(64,0,",");		  Oled\_ShowCHinese(80,0,"请开门");		break;			case 2:			Oled\_ShowCHinese(0,0,"指纹错误");			Oled\_ShowString(64,0,",");		  Oled\_ShowCHinese(80,0,"请重试");		break;			case 3:			Oled\_ShowCHinese(0,0,"蓝牙正确");			Oled\_ShowString(64,0,",");		  Oled\_ShowCHinese(80,0,"请开门");		break;			case 4:			Oled\_ShowCHinese(0,0,"蓝牙错误");			Oled\_ShowString(64,0,",");		  Oled\_ShowCHinese(80,0,"请重试");		break;			case 5:			Oled\_ShowCHinese(0,0,"刷卡正确");			Oled\_ShowString(64,0,",");		  Oled\_ShowCHinese(80,0,"请开门");		break;			case 6:			Oled\_ShowCHinese(0,0,"刷卡错误");			Oled\_ShowString(64,0,",");		  Oled\_ShowCHinese(80,0,"请重试");		break;
	}


}/****
*******处理函数
*****/void Manage_function(void){	if(flag1 == 3)
	{
		flag_beep=1;
		flag\_led=1;		Oled\_ShowCHinese(0,2,"开门失败");		Oled_ShowCHinese(0,4,"报警");
	}	else
		{
		flag_beep=0;
		flag_led=0;
	}  if(flag_beep==1)    BEEP(1);  else
    BEEP(0);  if(flag_led==1)    LED(1);  else
    LED(0);
}int main(void){  HAL\_Init();  SystemClock\_Config();  MX\_GPIO\_Init();  OLED_Init();									//OLED初始化
  OLED_Clear();									//OLED清屏
  while (1)
  {    Key_function();							//按键函数
		Display_function();					//显示函数
		Manage_function();					//处理函数
  }

}void SystemClock_Config(void){
  RCC\_OscInitTypeDef RCC\_OscInitStruct = {0};
  RCC\_ClkInitTypeDef RCC\_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};


  RCC\_OscInitStruct.OscillatorType = RCC\_OSCILLATORTYPE_HSI;
  RCC\_OscInitStruct.HSIState = RCC\_HSI_ON;
  RCC\_OscInitStruct.HSICalibrationValue = RCC\_HSICALIBRATION_DEFAULT;
  RCC\_OscInitStruct.PLL.PLLState = RCC\_PLL_ON;
  RCC\_OscInitStruct.PLL.PLLSource = RCC\_PLLSOURCE\_HSI\_DIV2;
  RCC\_OscInitStruct.PLL.PLLMUL = RCC\_PLL\_MUL4;  if (HAL\_RCC\_OscConfig(&RCC\_OscInitStruct) != HAL_OK)
  {    Error_Handler();
  }


  RCC\_ClkInitStruct.ClockType = RCC\_CLOCKTYPE\_HCLK|RCC\_CLOCKTYPE_SYSCLK
                              |RCC\_CLOCKTYPE\_PCLK1|RCC\_CLOCKTYPE\_PCLK2;
  RCC\_ClkInitStruct.SYSCLKSource = RCC\_SYSCLKSOURCE_PLLCLK;
  RCC\_ClkInitStruct.AHBCLKDivider = RCC\_SYSCLK_DIV1;
  RCC\_ClkInitStruct.APB1CLKDivider = RCC\_HCLK_DIV2;
  RCC\_ClkInitStruct.APB2CLKDivider = RCC\_HCLK\_DIV1;  if (HAL\_RCC\_ClockConfig(&RCC\_ClkInitStruct, FLASH\_LATENCY\_0) != HAL_OK)
  {    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC\_PERIPHCLK\_ADC;
  PeriphClkInit.AdcClockSelection = RCC\_ADCPCLK2\_DIV2;  if (HAL\_RCCEx\_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {    Error_Handler();
  }
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */void Error\_Handler(void){  /* USER CODE BEGIN Error\_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  \_\_disable\_irq();  while (1)
  {
  }  /* USER CODE END Error\_Handler\_Debug */}#ifdef  USE\_FULL\_ASSERT/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */void assert\_failed(uint8\_t \*file, uint32_t line){  /\* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\\r\\n", file, line) */
  /* USER CODE END 6 */}#endif /* USE\_FULL\_ASSERT */

四、实现现象

具体动态效果看B站演示视频:

6cb3109f552558fd21ffe8dc82eccbb4.jpeg

基于STM32的智能门禁系统(指纹、蓝牙、刷卡、OLED、电机)

全部资料(源程序、仿真文件、安装包、演示视频):

链接:https://pan.baidu.com/s/1B3YvL6RwC3TdHNIVC0yLSw?pwd=xl3o 
提取码:xl3o

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux服务器部署filebeat

# 下载filebeat curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.23-linux-x86_64.tar.gz # 解压 tar xzvf filebeat-7.17.23-linux-x86_64.tar.gz# 所在位置(自定义) /opt/filebeat-7.17.23-linux-x86_64/filebeat.ym…

FreeRTOS——任务调度、任务状态

任务调度 调度器就是使用相关的调度算法来决定当前需要执行哪个任务。 FreeRTOS一共支持三种任务调度方式: 抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。&#xff08…

word批量裁剪图片,并调整图片大小,不锁定纵横比

在word中有若干图片待处理,裁剪出指定内容,调整成指定大小。如下是待处理的图片: 这时,选择视图,选择宏,查看宏 选择创建宏 添加cut_picture代码如下,其中上、下、左、右裁剪的橡塑尺寸根据自己…

【2】图像视频的加载和显示

文章目录 【2】图像视频的加载和显示一、代码在哪写二、创建和显示窗口(一)导入OpenCV的包cv2(二)创建窗口(三)更改窗口大小 & 显示窗口(四)等待用户输入补充:ord()函…

24最新ComfyUI搭建使用教程

前言 ComfyUI 是一个基于节点流程式的stable diffusion AI 绘图工具WebUI, 通过将stable diffusion的流程拆分成节点,实现了更加精准的工作流定制和完善的可复现性。 ComfyUI因为内部生成流程做了优化,生成图片时的速度相较于WebUI有10%~25…

关于字节 c++

字节的介绍 字节是计算机中最小的存储单位,通常由8个二进制位组成,用来存储一个字符。在C中,字节也是基本数据类型之一,用关键字"byte"来表示。字节主要用于存储一些较小的数据,如整数、字符等。字节的大小…

音频转MP3格式困难?如何轻松实现wav转mp3?

格式多样化为我们带来了灵活性和创意的无限可能,但同时,不同格式间的转换也成为了不少用户面临的难题。尤其是当你手握珍贵的WAV音频文件,却希望它们能在更多设备上流畅播放或节省存储空间时,wav转mp3的需求便应运而生。WAV以其无…

网络安全中的 EDR 是什么:概述和功能

专业知识:EDR、XDR、NDR 和 MDR_xdr edr ndr-CSDN博客 端点检测和响应 (EDR) 是一种先进的安全系统,用于检测、调查和解决端点上的网络攻击。它可以检查事件、检查行为并将系统恢复到攻击前的状态。EDR 使用人工智能、机器学习和威胁情报来避免再次发生攻…

c语言实现:链表创建、插入、删除、翻转

#include <stdio.h> #include <stdlib.h>// 链表创建 typedef struct Node{int data;struct Node* next; } Node;// 创建一个节点 Node* createNode(int data){Node* newNode (Node* )malloc(sizeof(Node));newNode->data data;newNode->next NULL;return…

35岁java转大模型笔记,大模型智能体(LLM Agent)学习笔记

\1. 什么是大模型&#xff1f; 大模型对应的英文是Large Language Model&#xff08;LLM&#xff09;&#xff0c;即大语言模型&#xff0c;简称大模型。技术层面讲&#xff0c;大模型是一种基于深度学习技术的机器学习模型。 为什么叫大模型呢&#xff1f;它是相对于小模型而…

万界星空科技铜拉丝行业MES系统,实现智能化转型

一、铜拉丝行业生产管理的难点主要体现在以下几个方面&#xff1a; 1、标准严格&#xff1a;铜线产品对质量的要求极高&#xff0c;特别是在电气性能、导电性、耐腐蚀性等方面&#xff0c;任何微小的瑕疵都可能影响产品的使用效果和安全性。 2、过程监控&#xff1a;生产过程…

点赞10万+,1分钟教会你,用AI生成的宠物带娃视频

今天刷到了这样的宠物带娃视频&#xff0c;最近这种视频爆火&#xff0c;出现了很多爆款&#xff0c;今天就拆解一下&#xff0c;教大家学会这种视频用AI如何生成。 我们先看一下这类视频的数据&#xff0c;很多账号都在做&#xff0c;对于不了解AI的人来说&#xff0c;会觉得…

轻松构建便民平台小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 轻松构建便民平台小程序源码系统是一款集成了多项实用功能的模块化小程序开发框架。它基于当前最流行的小程序开发技术栈&#xff0c;如微信小程序、支付宝小程序等&#xff0c;通过预制的组件和模块&#xff0c;极大地简化了开发流程&#xff0c;降低了技术门槛。无…

Google BigTable架构详解

文章目录 什么是BigTable?架构图一、整体架构二、数据存储与索引存储模型 三、数据拆分与存储四、元数据管理五、读写流程 其他内容概览负载平衡其他存储和数据库选项 什么是BigTable? Bigtable是Google开发的一个高性能、可扩展的分布式存储系统&#xff0c;用于管理大规模…

Error running Application.Command line is too long

问题解析 本质上就是执行启动类Application的时候&#xff0c;执行的指令太长了&#xff0c;所以运行失败。 解决方案 1.打开Edit Configuration。 2.点击Modify options 3.勾选 Shorten command line 4.选择classpath file。 最终解决问题。

深入理解包管理工具

目录 引入npm配置文件常见属性版本理解package-lock.jsonnpm install其他命令发布自己的包 yarncnpmnpxpnpm安装和使用硬链接和软链接非扁平node\_modules存储store 引入 随着前端技术的发展&#xff0c;项目依赖的第三方库和工具越来越多&#xff08;例如&#xff1a;React、V…

信用卡验证-卢恩算法

卢恩算法 什么是 Luhn 算法&#xff1f; Luhn算法&#xff0c;也称为“模10算法”&#xff0c;是一种用于确定用户提供的标识号是否准确的公式。它广泛应用于验证信用卡号码以及其他数字序列&#xff0c;例如政府的社会安全号码 (SSN)。如今&#xff0c;Luhn算法是电子支付系…

详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 HandlerInter…

OJ在线评测系统 前端创建题目(增) 更新题目(改) 题目列表(查) 以及做题页面的开发 基于VUECLI脚手架画界面

目录 前端创建页面的开发一 创建一个路由 用acro design写 前端创建页面的开发二 题目管理页面 搜索 最終效果 题目更新页面的开发 携带参数的那种 修改路由 页码更新细节 我们先处理菜单项的权限控制和权限隐藏 在这里改 属性绑定一个函数 可以参考聚合搜索项目…