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

目录

一、前言

二、项目简介

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

六、实验效果 

七、资料内容

项目分享

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三维点云拟合平面推导及源代码C++

1、背景介绍 实际中,很多人工构造物是由平面结构构造而成,如下图所示,为一典型的由多个平面组成的人工构筑物。因此,根据离散点拟合成平面,获取拟合平面方程,是点云数据处理中非常常见的数据处理操作。 2、平面拟合参数推导 基于若离散点,估算平面方程过程如下: 3、程序…

刷代码随想录有感(95):合并区间

题干&#xff1a; 代码&#xff1a; class Solution { public:static bool cmp(vector<int>& a, vector<int>& b){return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begi…

怎么将3d的模型同比例缩放?---模大狮模型网

在展览3d模型设计过程中&#xff0c;经常需要对3d模型进行缩放以满足不同的需求。然而&#xff0c;有时候缩放操作可能会导致模型失去比例&#xff0c;造成不必要的麻烦。模大狮将介绍如何将展览3D模型按比例缩放&#xff0c;帮助展览设计师们更好地掌握这一关键的模型设计技巧…

100V 15A TO-252 N沟道MOS管 HC070N10L 惠海

MOS管的工作原理是基于在P型半导体与N型半导体之间形成的PN结&#xff0c;通过改变栅极电压来调整沟道内载流子的数量&#xff0c;从而改变沟道电阻和源极与漏极之间的电流大小。由于MOS管具有输入电阻高、噪声小、功耗低等优点&#xff0c;它们在大规模和超大规模集成电路中得…

Linux进程间通信之管道

进程间通信介绍&#xff1a; 进程间通信的概念&#xff1a; 进程间通信简称IPC&#xff08;Interprocess communication&#xff09;&#xff0c;进程间通信就是在不同进程之间传播或交换信息。 进程间通信的目的&#xff1a; 数据传输&#xff1a; 一个进程需要将它的数据…

12、SpringBoot 源码分析 - 自动配置深度分析五

SpringBoot 源码分析 - 自动配置深度分析五 refresh和自动配置大致流程OnClassCondition的createOutcomesResolver创建结果解析器StandardOutcomesResolver的resolveOutcomes解析结果StandardOutcomesResolver的getOutcomeClassNameFilter的MISSING判断是否没有 ThreadedOutcom…

具有 MOSFET 的电压到电流 (V-I) 转换器电路

设计说明 该单电源、低侧、V-I 转换器向可以连接到比运算放大器电源电压更高的电压的负载提供经过良好调节的电流。该 电路接受介于 0V 和 2V 之间的输入电压&#xff0c;将其转换为介于 0mA 和 100mA 之间的电流。通过将低侧电流检测电 阻 R3 上的压降反馈到运算放大器的反相…

Perfectly Clear WorkBench v4 解锁版安装教程 (图像修复增强工具)

前言 Perfectly Clear WorkBench 是一款图像修复工具&#xff0c;可以帮助用户对自己的图片素材进行修复&#xff0c;很多的照片因为拍摄问题&#xff0c;或者设备限制&#xff0c;会导致拍摄效果不好&#xff0c;使用这款软件可以进行一定程度的修复&#xff0c;当拍摄时亮度…

我找到了全网最低价买服务器的 bug !!!

拍断大腿 周五&#xff0c;放松一下&#xff0c;给大家分享下我最近的事儿&#xff0c;以及带大家薅个&#xff08;可能会有&#xff09;的羊毛。 上个月&#xff0c;家里买了 Apple TV&#xff08;可理解为苹果的电视盒子&#xff09;装了 infuse&#xff08;一个在电视盒子上…

机器学习扩展包MLXtend绘制分类模型决策边界

公众号&#xff1a;尤而小屋编辑&#xff1a;Peter作者&#xff1a;Peter 大家好&#xff0c;我是Peter~ 继续更新机器学习扩展包MLxtend的文章。本文介绍如何使用MLxtend来绘制与分类模型相关的决策边界decision_regions。 导入库 导入相关用于数据处理和建模的库&#xff…

狠狠打脸!国产AI大模型远比你想象的更强

龙争虎斗的大模型竞技场&#xff0c;这几天又有大事更新&#xff1a;6月7日&#xff0c;阿里云通义千问发布全球性能最强的开源模型Qwen2-72B。 包括72B在内&#xff0c;这次共开源五款模型&#xff0c;涵盖各个规格的参数&#xff0c;它们在同尺寸模型的测评中&#xff0c;都…

2024年安全现状报告

2024 年安全现状报告有些矛盾。尽管安全专业人员的道路困难重重&#xff0c;比如说严格的合规要求、不断升级的地缘政治紧张局势和更复杂的威胁环境&#xff0c;但整个行业还是在取得进展。 许多组织表示&#xff0c;与前几年相比&#xff0c;网络安全变得更容易管理。组织之间…

​【JS重点知识04】JS执行机制(重点面试题)

学前案例&#xff1a; console.log(111); setTimeout(function () {console.log(222); }, 1000) console.log(333); //输出结果&#xff1a;1111 333 222 console.log(111); setTimeout(function () {console.log(222); }, 0) console.log(333); //输出结果&#xff1a;111 33…

释放视频潜力:Topaz Video AI for mac/win 一款全新的视频增强与修复利器

在数字时代&#xff0c;视频已经成为我们记录生活、分享经历的重要方式。然而&#xff0c;有时候我们所拍摄的视频可能并不完美&#xff0c;可能存在模糊、噪点、抖动等问题。这时候&#xff0c;就需要一款强大的视频增强和修复工具来帮助我们提升视频质量&#xff0c;让它们更…

区块链简要介绍及运用的技术

一、区块链的由来 区块链概念最早是从比特币衍生出来的。 比特币&#xff08;Bitcoin&#xff09;诞生于2008年&#xff0c;是由一个名叫中本聪&#xff08;Satoshi Nakamoto&#xff09;的人首次提出&#xff0c;这个人非常神秘&#xff0c;至今没有他的任何准确信息。在提出…

ChatGPT-4o提示词的九大酷炫用法,你知道几个?

ChatGPT-4o提示词的九大酷炫用法&#xff0c;你知道几个&#xff1f;&#x1f680; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典…

优思学院|精益生产学习过程中如何提高自己的能力水平?

精益生产是一项实践多过理论的课题。 优思学院认为实践并不限于实际的工作&#xff0c;日常的思考同样重要&#xff0c;例如我们会要求学员在学习时不断思考各种事物&#xff0c;不限于自己的企业。例如当你去到一家餐厅&#xff0c;你能夠观察到什么浪费&#xff1f;你可否把…

2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度

给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。 每个查询 queries[i] [li, ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内&#xff08;包含 这两个值&#xff09;并且以元音开头和结尾的字符串的数目。 返回一个整数数组&#xff0c;其中…

探秘Facebook:社交媒体的未来之路

Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;一直处于数字社交革命的前沿。然而&#xff0c;随着科技和社会的不断发展&#xff0c;Facebook正面临着新的挑战和机遇。本文将探索Facebook的未来之路&#xff0c;揭示社交媒体的新趋势和发展方向。 1. 深度社…

nginx c++模块编译

不论是c还是c&#xff0c;nginx的第三方模块编写没什么太区别&#xff0c;但是提供给nginx调用的&#xff0c;必须是纯c的接口。 先说下为什么不能使用c编译nginx&#xff0c;nginx是纯c写的&#xff0c;而且c是兼容c的&#xff0c;但是用c(g)编译nginx的框架&#xff0c;就会出…