基于STM32的智能门禁系统设计与实现
一、项目背景与功能概述
在物联网技术快速发展的今天,传统门锁正在向智能化方向演进。本系统基于STM32F103C8T6微控制器,整合多种外设模块,实现了一个具备以下核心功能的智能门禁系统:
- 密码输入与验证(4x3矩阵键盘)
- 用户信息存储管理(W25Q128 Flash)
- 实时状态显示(0.96寸OLED)
- 电磁锁控制(继电器+5V电磁锁)
- 声光提示反馈(无源蜂鸣器)
- 系统异常报警功能
二、硬件系统架构
1. 核心部件选型说明
| 模块名称 | 型号参数 | 功能说明 |
|---|---|---|
| 主控芯片 | STM32F103C8T6 | 系统控制核心 |
| 存储模块 | W25Q128 | 存储用户密码 |
| 显示模块 | SSD1306 0.96寸OLED | 显示系统状态与交互界面 |
| 输入模块 | 4x3矩阵键盘 | 密码输入与人机交互 |
| 执行机构 | 5V电磁锁+继电器 | 门锁驱动控制 |
| 提示模块 | 无源蜂鸣器 | 操作反馈与报警提示 |
2. 硬件连接示意图
[STM32F103C8T6]
|
├── OLED (I2C)
│ ├── SCL -> PB8
│ └── SDA -> PB9
|
├── 矩阵键盘
│ ├── Rows -> PB0-PB2
│ ├──Rows4 -> PB10
│ └── Columns -> PB11-PB13
|
├── W25Q128 (SPI)
│ ├── CS -> PA4
│ ├── CLK -> PA5
│ ├── DO-> PA6
│ └── DI-> PA7
|
├── 继电器 -> PB7
├── 蜂鸣器 -> PC13
三、软件设计框架
1. 系统工作流程图

2. 关键模块实现逻辑
(1)矩阵键盘扫描
可看上一篇文章代码。
// 部分代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{uint8_t row = 0, column = 0;if(key_value != 0) return;//确认行if(GPIO_Pin == GPIO_PIN_0)row = 0x10;else if(GPIO_Pin == GPIO_PIN_1)row = 0x20;else if(GPIO_Pin == GPIO_PIN_2)row = 0x30;else if(GPIO_Pin == GPIO_PIN_10)row = 0x40;//确定列if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11) == GPIO_PIN_SET){delay_ms(10);while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11))column = 0x01;}else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET){delay_ms(10);while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12))column = 0x02;}else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_SET){delay_ms(10);while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13))column = 0x03;}if(row != 0 && column != 0)key_value = row | column;
}uint8_t keyboard_get_value(void)
{uint8_t ch = 0;if(key_value != 0){if(key_value == 0x11) ch = '1';else if(key_value == 0x12) ch = '2';else if(key_value == 0x13) ch = '3';else if(key_value == 0x21) ch = '4';else if(key_value == 0x22) ch = '5';else if(key_value == 0x23) ch = '6';else if(key_value == 0x31) ch = '7';else if(key_value == 0x32) ch = '8';else if(key_value == 0x33) ch = '9';else if(key_value == 0x41) ch = '*';else if(key_value == 0x42) ch = '0';else if(key_value == 0x43) ch = '#';delay_ms(400);key_value = 0x00;}return ch;
}
(2)存储管理设计
部分代码
//密码比对
uint8_t password_compare(void)
{uint8_t i = 0;w25q128_read_data(0x000000, pwd_read, PASSWORD_SIZE);if(strlen((char *)pwd_input) != strlen((char *)pwd_read))return FALSE;for(i = 0; i < strlen((char *)pwd_read); i++){if(pwd_input[i] != pwd_read[i])return FALSE;}return TRUE;
}
(3)电磁锁控制逻辑
部分代码:
//密码输入正确的操作
void password_input_right_action(void)
{oled_show_right();lock_on();beep_on();delay_ms(300);beep_off();delay_ms(1000);lock_off();try_times = 0;
}//闭合继电器的函数
void lock_on(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); // 拉低LED1引脚,点亮LED1
}
四、系统特色功能实现
-
安全增强设计
- 密码输入错误3次触发报警
- 支持*键组合进入管理模式
- 断电数据保护(W25Q128存储)
-
可视化交互
- 动态输入显示
-
扩展功能预留
- RFID刷卡模块接口(SPI预留)
- 蓝牙通信模块(USART1)
- 指纹识别模块(USART2)
五、开发注意事项
-
软件优化建议
- 采用状态机实现键盘扫描
- 使用DMA加速SPI Flash读写
- 关键操作添加看门狗保护
-
常见问题排查
- OLED显示异常:检查I2C地址配置(通常0x78或0x7A)
- Flash写入失败:确保擦除操作在前
- 继电器无法吸合:检查驱动三极管基极电阻
六、应用场景与扩展方向
本系统可应用于:
- 智能家居门禁控制
- 实验室设备柜管理
- 共享储物柜控制系统
未来可扩展:
- 添加人脸识别模块
- 对接云平台实现远程管理
- 增加温度异常报警功能
七、总结
本文详细介绍了基于STM32F103C8T6的智能门禁系统设计方案。系统整合了多种常用外设模块,实现了完整的门禁控制功能。开发者可根据实际需求调整密码策略、存储容量等参数,具体实现代码可根据硬件连接关系进行适配开发。
相关文章:
基于STM32的智能门禁系统设计与实现
一、项目背景与功能概述 在物联网技术快速发展的今天,传统门锁正在向智能化方向演进。本系统基于STM32F103C8T6微控制器,整合多种外设模块,实现了一个具备以下核心功能的智能门禁系统: 密码输入与验证(4x3矩阵键盘&a…...
基于SpringBoot的河道水情大数据可视化分析平台设计与实现(源码+论文+部署讲解等)
需要资料,请文末联系 一、平台介绍 水情监测数据大屏 - 平台首页 日均水位 日均水速 二、论文内容 摘要(中文) 本文针对河道水情监测领域的数据管理和可视化分析需求,设计并实现了一套河道水情大数据可视化分析平台。该平台基…...
日志统计(双指针)
题目描述 小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有 NN 行。其中每一行的格式是: ts idts id 表示在 tsts 时刻编号 idid 的帖子收到一个"赞"。 现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖…...
广告推荐算法:COSMO算法与A9算法的对比
COSMO算法与A9算法的概念解析 1. A9算法 定义与背景: A9算法是亚马逊早期为电商平台研发的核心搜索算法,主要用于优化商品搜索结果的排序和推荐,其核心逻辑围绕产品属性与关键词匹配展开。自2003年推出以来,A9通过分析商品标题…...
Java进阶之旅-day05:网络编程
引言 在当今数字化的时代,网络编程在软件开发中扮演着至关重要的角色。Java 作为一门广泛应用的编程语言,提供了强大的网络编程能力。今天,我们深入学习了 Java 网络编程的基础知识,包括基本的通信架构、网络编程三要素、IP 地址、…...
Vue 3 的响应式原理
Vue 3 的响应式原理可以比喻为“智能监控系统”:当数据变化时,它能自动追踪依赖关系并触发更新。以下是通俗解释和核心机制: 一、核心原理:Proxy 代理 Vue 3 的响应式系统基于 JavaScript 的 Proxy 对象实现(Vue 2 使…...
Python解决“组成字符串ku的最大次数”问题
Python解决“组成字符串ku的最大次数”问题 问题描述测试样例解题思路代码 问题描述 给定一个字符串 s,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 “ku”。每次可以随机从字符串中选一个字符,并且选中的字符不能再使…...
【JS】使用滑动窗口得到无重复字符的最长子串
题目 思路 本题采用滑动窗口思想,定义左右指针作为滑动窗口的边界,使用Set数据结构处理重复字符,需要注意的是:每次遍历时采用Math.max方法实时更新最长子串的长度;当左指针移动时,set要删除对应字符。 步…...
libreoffice-help-common` 的版本(`24.8.5`)与官方源要求的版本(`24.2.7`)不一致
出现此错误的原因主要是软件包依赖冲突,具体分析如下: ### 主要原因 1. **软件源版本不匹配(国内和官方服务器版本有差距) 系统中可能启用了第三方软件源(如 PPA 或 backports 源),导致 lib…...
2025-04-05 吴恩达机器学习4——逻辑回归(1):基础入门
文章目录 1 分类问题1.1 介绍1.2 线性回归与分类1.2 逻辑回归 2 逻辑回归2.1 介绍2.2 Sigmoid 函数2.3 逻辑回归模型 3 决策边界3.1 概念3.2 线性决策边界3.3 非线性决策边界 4 代价函数4.1 不使用平方误差4.2 损失函数4.3 整体代价函数 5 梯度下降5.1 参数更新5.2 逻辑回归 vs…...
P1125 [NOIP 2008 提高组] 笨小猴
#include<bits/stdc.h> using namespace std; int a[300],ma,mi105;//数组用来记录每个字符出现的次数,将mi初始为一个比较大的值 bool is_prime(int x){if(x0||x1)return false;for(int i2;i*i<x;i){if(x%i0)return false;}return true; }//判断是否为质…...
Linux systemd 服务全面详解
一、systemd 是什么? systemd 是 Linux 系统的现代初始化系统(init)和服务管理器,替代传统的 SysVinit 和 Upstart。它不仅是系统启动的“总指挥”,还统一管理服务、日志、设备挂载、定时任务等。 核心作用 服务管理…...
SortedSet结构之用户积分实时榜单实战
Redis 中的SortedSet结构非常适合用于实现实时榜单的场景,它根据成员的分数自动进行排序,支持高效的添加、更新和查询操作。 SortedSet实时榜单的一些典型应用场景: 游戏中的玩家排行榜:在多人在线游戏中,使用 Sorte…...
C++_类和对象(中)
【本节目标】 类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const成员函数取地址及const取地址操作符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什…...
#SVA语法滴水穿石# (007)关于 $past 的用法
今天,我们要学习比较重要的一个关键字。$past 的用法,今天系统学习。 1. $past 函数的核心作用 $past 用于 获取某个信号在过去指定时钟周期前的值,通常用于检查历史状态是否符合预期。 其语法如下: $past(signal, [num_cycles], [gating_condition], [clock], [reset])…...
学习笔记—C++—入门基础()
目录 C介绍 参考文档 C第一个程序 命名空间namespace namespace的价值 namespace的定义 namespace使用 指定命名空间访问 using将命名空间中某个成员展开 展开命名空间中全部成员 输入和输出 缺省参数 函数重载 引用 引用的概念 应用 const引用 指针和引用的关…...
kotlin函数类型
一 函数类型定义 1 定义 函数类型就是 (Int, Int) -> Int 函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来 2 示例 : (Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型; (String) -> Unit 表示接收 Strin…...
大数据Spark(五十七):Spark运行架构与MapReduce区别
文章目录 Spark运行架构与MapReduce区别 一、Spark运行架构 二、Spark与MapReduce区别 Spark运行架构与MapReduce区别 一、Spark运行架构 Master:Spark集群中资源管理主节点,负责管理Worker节点。Worker:Spark集群中资源管理的从节点,负责任务的运行…...
虚拟Ashx页面,在WEB.CONFIG中不添加handlers如何运行
https://localhost:44311/webapi.ashx 虚拟ASHX页面,在WEB.CONFIG中添加handlers,如何不添加节点,直接运行?把页面直接保存ASHX名称?现在是.VB 如果你不想通过在 web.config 里添加 handlers 节点来配置处理程序,而是直接让 .as…...
道路裂缝数据集CrackForest-156-labelme
来源于开源的数据集 https://github.com/cuilimeng/CrackForest-dataset 进行整理修改而成。 文章目录 1. 介绍2. 应用场景3. 相关工具4. 下载地址 1. 介绍 在现代城市管理中,道路状况的监测与维护是确保交通安全和城市基础设施健康的重要环节。 CrackForest是一个…...
HTML 表单:构建交互式网页的关键元素
HTML 表单:构建交互式网页的关键元素 引言 HTML表单是构建交互式网页的核心组件之一,它允许用户与网站进行交互,提交信息、填写问卷或进行其他操作。本文将深入探讨HTML表单的基础知识、常用元素、表单验证以及如何优化表单设计,以提高用户体验和网站的可访问性。 HTML表…...
Java进阶-day06:反射、注解与动态代理深度解析
目录 一、反射机制:Java的自我认知能力 1.1 认识反射 1.2 获取Class对象 1.3 获取类的成分 二、注解:Java的元数据机制 2.1 注解概述 2.2 元注解 2.3 注解解析 2.4 注解的实际应用 三、动态代理:灵活的间接访问机制 3.1 为什么需要…...
Redis数据结构之Hash
目录 1.概述2.常见操作2.1 H(M)SET/H(M)GET2.2 HGETALL2.3 HDEL2.4 HLEN2.5 HEXISTS2.6 HKEYS/HVALS2.7 HINCRBY2.8 HSETNX 3.总结 1.概述 Hash是一个String类型的field(字段)和value(值)的映射表,而且value是一个键值对集合,类似Map<String, Map<…...
故障矩阵像素照片效果ps标题文本特效滤镜样机 Glitched Arcade Text Logo Effect
有时,视觉效果比文字本身更能讲述故事,因此请确保您已竭尽全力提供令人敬畏的展示。品牌标识或演示元素,该资产可以处理您的项目所涉及的任何内容。由于智能对象图层,此文本效果将为获得理想的结果铺平道路。这些允许您在指定的图…...
[创业之路-352]:从创业和公司经营的角度看:分析美国的三大财务报表
一、美国政府的财务报表 如果把美国政府看成一个公司,从三大财务报表上看,美国政府资产雄厚,但利润表年年亏损,现金流量表年年为负,现金流持续吃紧,面临现金流断裂导致公司倒闭的风险。 马斯克在降低公司各…...
【学Rust写CAD】27 双线性插值函数(bilinear_interpolation.rs)
源码 use super::constant::BILINEAR_INTERPOLATION_BITS; // Inspired by Filter_32_opaque from Skia. fn bilinear_interpolation(tl: u32,tr: u32,bl: u32,br: u32,mut distx: u32,mut disty: u32, ) -> u32 {let distxy;let distxiy;let distixy;let distixiy;let mut…...
vs环境中编译osg以及osgQt
1、下载 OpenSceneGraph 获取源代码 您可以通过以下方式获取 OSG 源代码: 官网下载:https://github.com/openscenegraph/OpenSceneGraph/releases 使用 git 克隆: git clone https://github.com/openscenegraph/OpenSceneGraph.git 2、下载必要的第三方依赖库 依赖库 ht…...
【教学类-102-02】自制剪纸图案(留白边、沿线剪)02——Python+PS自动化添加虚线边框
背景需求: 01版本实现了对透明背景png图案边界线的扩展,黑线实线描边 【教学类-102-01】自制剪纸图案(留白边、沿线剪)01-CSDN博客文章浏览阅读974次,点赞15次,收藏7次。【教学类-102-01】自制剪纸图案(留白边、沿线剪)01https://blog.csdn.net/reasonsummer/article…...
基于 Netty 框架的 Java TCP 服务器端实现,用于启动一个 TCP 服务器来处理客户端的连接和数据传输
代码: package com.example.tpson_tcp;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; imp…...
fbx bip互转 测试OK
目录 fbx bip互转 3dmax插件fbx转bip: 测试可以转: MotionBuilder fbx转bip fbx bip互转 3dmax插件fbx转bip: 测试可以转: 不用插件!!无脑把Mxiamo转bip骨骼动画 - CG软件插件脚本交流 - Powered by Discuz!...
