STM32项目分享:智能门禁锁系统

news2024/11/16 9:18:56

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板及元器件图

五、程序设计 

六、实验效果 

七、资料内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1Sg4y1X7Ex/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末) 

二、项目简介

1.功能详解

基于STM32智能门禁锁系统。

功能如下:

  1. 按键解锁:系统通过4×4矩阵键盘模块输入密码进入主菜单
  2. 门禁刷卡:通过RFID模块刷卡进入主菜单,卡片可以添加或者覆盖删除
  3. 指纹识别:通过AS608指纹识别模块识别指纹开锁
  4. 蓝牙APP解锁:通过蓝牙APP输入密码解锁
  5. 实时时间显示:OLED屏幕显示当前时间,可通过按键修改
  6. 步进电机:步进电机模拟门锁开关
  7. OLED显示:显示用户解锁界面,主菜单以及各项功能界面
  8. 蜂鸣器报警:密码输入错误蜂鸣器报警

2.主要器件

  • STM32F103C8T6最小系统板
  • OLED显示屏(7针SPI协议)
  • 4×4矩阵键盘
  • RFID门禁模块(加卡片)
  • AS608指纹模块
  • 蓝牙模块(BT04-A)
  • 蜂鸣器

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板及元器件图

五、程序设计 

 int main(void)
 {			
	u16 set=0;
	u8 err=0;
	int key_num;
	int time1;
	int time2;		//锁屏时间
	char arrow=0;  //箭头位子
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(9600);	 //串口初始化为9600
	printf("串口功能正常\r\n");
	Button4_4_Init();          //初始化与按键连接的硬件接口
	OLED_Init();    			//显示初始化
    Walkmotor_Init();
	BEEP_Init();			//蜂鸣器初始化
	usart2_init(usart2_baund);           //初始化指纹模块
	PS_StaGPIO_Init();
	OLED_Clear(); 
	starting();//开机信息  logo
	err = RTC_Init();	  			//RTC初始化
	if(err)
	{
		OLED_Clear(); 
		Show_Str(12,13,128,20,"RTC CRY ERR!",12,0); 
		OLED_Refresh_Gram();//更新显示
		delay_ms(3000);
	}
	SysPartInit();   //系统参数初始化 
 	while(1)
	{
//锁屏界面
    MAIN:
		OLED_Clear(); 
		OLED_Show_Font(56,48,0);//显示锁图标
		while(1)
		{
			time1++;  Display_Data();//时间显示:每1000ms更新一次显示数据
			if(DisFlag == 1)
			{
				DisFlag = 0;
				OLED_Fill(0,24,16,63,0);
				OLED_Refresh_Gram();//更新显示
			}
			if((time1%100)==1)
		 	{
				//MFRC522解锁
				time1=0;
				MFRC522_Initializtion();			
				Error=MFRC522_lock();
				if(Error==0)
				{
					goto MENU;	
				}
				else 
				{
					OLED_Show_Font(56,48,0);//锁
				}
				//手机蓝牙解锁密码1
				Error=usart1_cherk((char*)sys.passwd1);         
				if(Error==0)
                { 
			    	OLED_Clear_NOupdate();
				    Show_Str(12,13,128,20,"蓝牙密码1:正确",12,0); 
					OLED_Refresh_Gram();//更新显示
					delay_ms(800);
					DisUnLock();
					goto MENU;	
				}
				else {}
				//手机蓝牙解锁密码2
				Error=usart1_cherk((char*)sys.passwd2);         
				if(Error==0)
                {
				    sys.errCnt = 0;
				    OLED_Clear_NOupdate();
					Show_Str(12,13,128,12,"蓝牙密码2:正确",12,0); 
					OLED_Refresh_Gram();//更新显示
					delay_ms(800);
					DisUnLock();
					goto MENU;	
				}
				else {}
			}
			//指纹解锁
			if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下
			{
			    while(PS_Sta)
                {
			    	Error=press_FR();//刷指纹
					if(Error==0)
					{
						goto MENU;   //跳到解锁界面
					}								
					else 
					{
						OLED_Show_Font(56,48,0);//锁
					}
				}
			}
			//密码锁
			key_num=Button4_4_Scan();	//按键扫描
			if(key_num!=-1)
			{
				Error=password();//密码解锁函数
				if(Error==0)
				{
					goto MENU;	//跳到解锁界面
				}
				else 
				{
					OLED_Show_Font(56,48,0);//锁
				}
			}
			delay_ms(1);				
		}
/********************主界面**************************/
    MENU:
		OLED_Clear();
    MENUNOCLR:
		OLED_Fill(0,0,20,48,0);
		//主页菜单显示
		if(arrow<3)
        {
		    Show_Str(5,arrow*16,128,16,"->",16,0);//显示箭头
		    set=0;
        }
		else 
        {
			Show_Str(5,(arrow-3)*16,128,16,"->",16,0);
			set=3;
        }
		Show_Str(25,0,128,16,setup[set],16,0);
		Show_Str(25,16,128,16,setup[set+1],16,0);
		Show_Str(25,32,128,16,setup[set+2],16,0);
		Show_Str(0,52,128,12,"上    下     确定",12,0);
		OLED_Refresh_Gram();//更新显示
		time2=0;
		while(1)
		{
			//超时锁屏
			time2++;
			if(time2>100 | key_num==4){  
		    OLED_Clear();
			DisLock();
			if(time2>100) beep_on_mode2();
			time2 =0;
            OLED_Clear();
			goto MAIN;
		}
		//手机蓝牙锁定
		if(memcmp(USART_RX_BUF,"lock",4)==0)	
        {
		    DisLock();
		    goto MAIN;
	    }			
		//功能选项选择
		key_num=Button4_4_Scan();	
		if(key_num)
		{
		    if(key_num==13)
            {
				if(arrow>0)arrow--;
				goto MENUNOCLR;
			}
			if(key_num==15)
            {
				if(arrow<5)arrow++;
				goto MENUNOCLR;
			}
			if(key_num==16)
            {
			    switch(arrow)
			    	{
					case 0:Add_FR();		break;//录指
					case 1:Del_FR();		break;//删指纹
					case 2:SetPassworld();break;//修改密码
					case 3:Set_Time(); break;  //设置时间
					case 4:Add_Rfid(); break;  //录入卡片
					case 5:Massige(); break;  //显示信息			
		    		}
				goto MENU;
	    		}		
	    	}
        delay_ms(1);
		}	
	}
 }

六、实验效果 

七、资料内容

项目分享

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

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

相关文章

使用 stress 命令进行Linux CPU 压力测试

大家好&#xff0c;在现代计算机系统中&#xff0c;对系统性能和稳定性的评估是至关重要的。特别是在服务器环境中&#xff0c;我们需要确保系统能够在高负载情况下稳定运行&#xff0c;以满足用户的需求。而 CPU 是系统中最关键的组件之一&#xff0c;其性能直接影响着整个系统…

探索加密货币:打造Web3项目与企业的新篇章

本文来源香港Web3媒体&#xff1a;Techub News 在数字化浪潮席卷全球的今天&#xff0c;加密货币及Web3项目和企业正成为引领创新的重要力量。作为这一领域的观察者&#xff0c;Mark Beylin深入剖析了如何通过打造人们真正需要的代币&#xff0c;来推动Web3项目的成功与企业的蓬…

电脑开机出现英文字母,如何解决这个常见问题?

电脑开机时出现英文字母的情况通常意味着系统在启动过程中遇到了问题。这些英文字母可能是错误信息、系统提示或BIOS设置问题。通过理解这些信息并采取适当的措施&#xff0c;您可以解决大多数启动问题。本文将介绍三种解决电脑开机出现英文字母问题的方法&#xff0c;帮助您恢…

VSCode搭建开发环境--从PyCharm到拥抱vscode

VSCode搭建开发环境 前言安装扩展全局配置文件单个项目的配置快捷键 前言 最近自己的PyCharm Professional的License过期了&#xff0c;导致没有一个好的开发IDE&#xff0c;于是开始拥抱免费的Visual Studio Code啦。 当然&#xff0c;不可否认的是PyCharm对于开发Python来说…

学习笔记——路由网络基础——路由概述

一、路由概述 1、路由定义与作用 路由(routing)是指导报文转发路径信息&#xff0c;通过路由可以确认转发IP报文的路径。 路由&#xff1a;是指路由器从一个接口上收到数据包&#xff0c;根据数据包的目的地址进行定向并转发到另一个接口的过程。 路由(routing)的定义是指分…

超详解——Python模块文档——小白篇

目录 1. Unix起始行 示例&#xff1a; 2. 对象和类型 示例&#xff1a; 3. 一切都是对象 示例&#xff1a; 4. 理解对象和引用 示例&#xff1a; 5. 理解对象和类型 示例&#xff1a; 6. 标准类型 示例&#xff1a; 7. 其他内建类型 示例&#xff1a; 8. 类型的类…

本地运行ChatTTS

TTS 是将文字转为语音的模型&#xff0c;最近很火的开源 TTS 项目&#xff0c;本地可以运行&#xff0c;运行环境 M2 Max&#xff0c;差不多每秒钟 4&#xff5e;&#xff5e;5 个字。本文将介绍如何在本地运行 ChatTTS。 下载源码 首先下载源代码 git clone https://github…

【Mac】Media Encoder 2022 for Mac(媒体编码器)V22.6.1软件介绍

软件介绍 Media Encoder 2022 for Mac是一款有着十分丰富硬件设备的编码格式设置和专门设计的预设设置功能的媒体编码器软件&#xff0c;Media Encoder Mac版能够帮助用户导出与特定交付媒体兼容的文件&#xff0c;可以很容易地将项目导出到任何屏幕上的可播放内容中。软件同时…

PVE管理虚拟机节点

今天使用PVE命令安装虚拟机。 ‍ 查看所有虚拟机 qm list 查看所有虚拟机 ​​ 创建虚拟机 qm create 创建虚拟机 qm create 106 --name vm-test --memory 2048 --net0 virtio,bridgevmbr0基础配置 这条命令会创建一个 VM&#xff0c;ID 为 106​&#xff0c;名称为 myvm​…

数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法

频繁项集、闭项集和关联规则 频繁项集&#xff1a;出现的次数超过最小支持度计数阈值 闭频繁项集&#xff1a;一个集合他的超集(包含这个集合的集合)在数据库里面的数量和这个集合在这个数据库里面的数量不一样,这个集合就是闭项集 如果这个集合还是频繁的,那么他就是极大频…

Leetcode3171. 找到按位与最接近 K 的子数组

Every day a Leetcode 题目来源&#xff1a;3171. 找到按位与最接近 K 的子数组 解法1&#xff1a;位运算 优化&#xff1a; 代码&#xff1a; /** lc appleetcode.cn id3171 langcpp** [3171] 找到按位与最接近 K 的子数组*/// lc codestart class Solution { public:int m…

【应用浅谈】Odoo的库存计价与产品成本(三)

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo的库存&#xff08;Stock&#xff09;模块拥有众多功能&#xff0c;其中库存计价是一项非常重要的功能&#xff0c;原生的成本方法分三种&#xff1a;【标准成本】&#xff0c;【平均成本】&#xff0c;【先进先出】&#…

Fastgpt接入Whisper本地模型实现语音输入

前言 FastGPT 默认使用了 OpenAI 的 LLM 模型和语音识别模型,如果想要私有化部署的话,可以使用openai 开源模型Whisper。参考文章 《openai 开源模型Whisper语音转文本模型下载使用》 开源项目地址 : 兼容openai接口api服务 https://gitee.com/taisan/whisper-api 设置安…

一次改SQLMAP的操作

前言 sqlmap这个工具&#xff0c;相信各位大佬们都不陌生&#xff0c;但sqlmap虽好&#xff0c;也时常会有些实际存在但无法注入的地方&#xff0c;这时候就需要我们改它的配置了&#xff0c;今天就以本人遇到的事件进行阐述。 正文 确认注入点 通过一系列测试最终确定这里…

【Java笔记】第10章:接口

前言1. 接口的概念与定义2. 接口的声明与语法3. 接口的实现4. 接口的继承5. 接口的默认方法6. 接口的静态方法7. 接口的私有方法8. 接口的作用9. 接口与抽象类的区别10. 接口在Java集合中的应用结语 上期回顾:【Java笔记】第9章&#xff1a;三个修饰符 个人主页&#xff1a;C_G…

在 Windows 7 中安装 .NET Framework 时遇到错误:无法建立到信任根颁发机构的证书链

当全新安装 Windows 7 SP1 后&#xff0c;在未安装任何补丁&#xff0c;也未进行联网的状态下&#xff0c;安装 .NET Framework 4.6/4.7 或更高的版本时&#xff0c; 应该会遇到错误提示&#xff1a;无法建立到信任根颁发机构的证书链。 解决方法 1.下载证书 地址&#xff1…

机器视觉——硬件常用基础知识

光源 机器视觉中光源的作用 1&#xff09;强化特征&#xff0c;弱化背景 2&#xff09;光源打得好&#xff0c;图好了&#xff0c;后期算法更简化 3&#xff09;图好了&#xff0c;测试速度更高 各种光源的综合性能对比及为啥使用LED灯 光的颜色的选择 白色光&#xff1a;通常用…

递归(全排列andN皇后)

全排列 分治与递归 递归是实现分治的一种方法 思想思路 题目&#xff1a; 全排列i 我这样直接输出会多输出一个空行&#xff08;最后一个\n&#xff09; #include<stdio.h>using namespace std; const int maxn10; int an[maxn]; int n; bool hash[maxn]{0}; int c0…

第十一届蓝桥杯C++青少年组中/高级组国赛2020年10月真题解析

一、单选题 第1题 在数组中&#xff0c;数组名表示&#xff08; &#xff09;. A:数组第1个元素的首地址 B:数组第2个元素的首地址 C:数组所有元素的首地址&#xff0c; D:数组最后1个元素的首地址 答案&#xff1a;A 数组名是一个地址&#xff0c;指向第一个元素 第2题 …

mqtt-emqx:设置遗嘱消息

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>org.eclipse…