当前位置: 首页 > news >正文

基于单片机设计的电子柜锁

一、前言

随着现代社会的不断发展,电子柜锁的应用越来越广泛。传统的机械柜锁存在一些不便之处,例如钥匙容易丢失、密码容易泄露等问题。设计一款基于单片机的电子柜锁系统成为了一个有趣而有意义的项目。

该电子柜锁系统通过电磁锁作为柜锁的开关,通过继电器控制电磁锁的开关状态。用户可以通过矩阵键盘输入密码进行开锁,并且密码数据会通过LCD1602液晶显示屏进行显示。同时,系统还支持输入密码验证开锁和修改密码的功能。当用户成功输入正确的密码并开锁时,系统会通过蜂鸣器发出提示音。

这款电子柜锁系统的设计为了提高柜锁的安全性和便利性。相比传统的机械柜锁,电子柜锁具有以下优势:

【1】密码安全性:电子柜锁采用密码作为开锁方式,相比传统钥匙更加安全可靠,用户可以根据需要设置较复杂的密码,有效防止密码泄露和非法开锁。

【2】方便易用:用户只需要通过矩阵键盘输入密码即可开锁,无需携带钥匙或记忆复杂的机械操作步骤,操作简单方便。

【3】修改密码功能:用户可以根据需要随时修改密码,提高了柜锁的灵活性和可维护性。

【4】提示音提示:系统通过蜂鸣器发出提示音,让用户在输入密码和开锁成功时得到明确的反馈,提升了用户体验。

电子柜锁系统的设计不仅具有实用性,而且可以为学习嵌入式系统设计和单片机编程的初学者提供一个非常好的实践项目。通过这个项目,可以学习和掌握单片机的输入输出控制、按键扫描、LCD显示、蜂鸣器控制等相关知识和技术。还涉及到密码输入和验证的算法设计和实现,锻炼了逻辑思维和程序设计能力。

通过这个电子柜锁系统项目,可以体验到现代电子技术的魅力,提高柜锁的安全性和便利性,为用户提供更好的使用体验。image-20230823171105869

image-20230823170732930

image-20230823170655846

二、硬件选型介绍

硬件选型方面,根据需求,下面是电子柜锁的最终硬件选型:

【1】主控芯片:STC89C52单片机是一款常用的8位单片机,具有丰富的外设资源和较大的存储容量,适合作为电子柜锁的主控芯片。

【2】电磁锁:选择适合的电磁锁作为柜锁的开关,确保其能提供足够的安全性和可靠性。考虑使用12V电磁锁,满足电源和控制信号要求。

【3】继电器:使用继电器来控制电磁锁的通断,确保信号隔离和电流放大。

【4】矩阵键盘:选择适用的矩阵键盘用于输入密码。选择4x4矩阵键盘,具有16个按键,支持数字和功能键。

【5】LCD1602液晶显示屏:作为密码输入和状态显示的界面,LCD1602具有两行16列的字符显示,能够清晰显示输入的密码和相关提示信息。

【6】蜂鸣器:用于发出开锁成功、密码输入错误等提示音。

【7】电源模块:有稳定可靠的电源供应非常重要,选择使用AC/DC 5/12V适配器供电。

三、整体设计思路

软件设计逻辑和思路如下:

【1】初始化:在程序开始时,进行系统初始化设置,包括配置IO口、定时器和外设等。同时,需要初始化密码存储区、LCD1602显示屏和蜂鸣器等。

【2】密码输入和验证:通过矩阵键盘读取用户输入的密码。可以采用一个固定长度的密码,例如4位。用户每按下一个数字键,将其添加到密码缓冲区中,并在LCD1602上显示相应的“*”字符表示已输入。当输入的密码长度达到预设长度时,即可触发密码验证操作。

【3】密码验证:将密码缓冲区中的数字转换为字符串形式,与预先设置好的正确密码进行比较。如果密码输入正确,则进行开锁操作;否则,进行密码错误提示处理。

【4】开锁操作:当密码验证成功后,控制继电器通断,打开或关闭电磁锁。同时,通过蜂鸣器发出开锁成功的提示音,并在LCD1602上显示开锁成功信息。

【5】修改密码:提供修改密码的功能。在成功验证密码后,用户可以输入新密码进行修改。修改完成后,将新密码存储起来,供下次验证使用。

【6】状态显示:将相关的状态信息实时显示在LCD1602上,例如输入密码错误提示、修改密码成功提示等。

【7】系统保护:为了保护系统安全,可以设置安全策略,例如密码输入错误次数限制、锁定时间等。当达到错误次数上限或锁定时间到达时,系统会自动进行相应的保护处理。

【8】中断服务:使用定时器中断等方式进行按键检测和LCD1602刷新等操作,提高系统的实时性。

【9】循环检测:设计一个主循环函数,不断检测矩阵键盘的按键输入、执行开锁、密码验证、密码修改以及状态显示等功能。

四、项目代码

#include <reg51.h>
#include <intrins.h>#define PASSWORD_LENGTH 4    // 密码长度
#define MAX_ATTEMPTS 3    // 最大尝试次数sbit Buzzer = P1^0;    // 蜂鸣器控制引脚
sbit ElectromagneticLock = P1^1;    // 电磁锁控制引脚unsigned char password[PASSWORD_LENGTH] = {1, 2, 3, 4};    // 初始密码
unsigned char enteredPassword[PASSWORD_LENGTH];    // 输入的密码
unsigned char attempts = 0;    // 尝试次数// 延时函数
void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 110; j++);
}// 初始化LCD1602
void LCD_Init() {LCD_WriteCommand(0x38);    // 设置8位数据总线,2行显示,5x8点阵字符LCD_WriteCommand(0x0c);    // 显示器开,光标关闭LCD_WriteCommand(0x06);    // 光标右移,字符不移动LCD_WriteCommand(0x01);    // 清屏
}// 写入命令到LCD1602
void LCD_WriteCommand(unsigned char cmd) {LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;P0 = cmd;_nop_();_nop_();LCD_EN = 0;
}// 写入数据到LCD1602
void LCD_WriteData(unsigned char dat) {LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;P0 = dat;_nop_();_nop_();LCD_EN = 0;
}// 在LCD1602上显示字符串
void LCD_ShowString(unsigned char x, unsigned char y, unsigned char *str) {unsigned char i = 0;if (x < 16) {if (y == 0)LCD_WriteCommand(0x80 + x);else if (y == 1)LCD_WriteCommand(0xc0 + x);while (str[i] != '\0') {LCD_WriteData(str[i]);i++;}}
}// 初始化矩阵键盘
void Keypad_Init() {Keypad_Row1 = 1;Keypad_Row2 = 1;Keypad_Row3 = 1;Keypad_Row4 = 1;
}// 读取矩阵键盘按键值
unsigned char Keypad_Read() {unsigned char row, col;unsigned char keyVal;for (col = 0; col < 4; col++) {Keypad_Col1 = 1;Keypad_Col2 = 1;Keypad_Col3 = 1;Keypad_Col4 = 1;switch (col) {case 0:Keypad_Col1 = 0;break;case 1:Keypad_Col2 = 0;break;case 2:Keypad_Col3 = 0;break;case 3:Keypad_Col4 = 0;break;}for (row = 0; row < 4; row++) {if (Keypad_Row1 == 0) {delay(5);if (Keypad_Row1 == 0) {while (Keypad_Row1 == 0);keyVal = row * 4 + col + 1;return keyVal;}}if (Keypad_Row2 == 0) {delay(5);if (Keypad_Row2 == 0) {while (Keypad_Row2 == 0);keyVal = row * 4 + col + 5;return keyVal;}}if (Keypad_Row3 == 0) {delay(5);if (Keypad_Row3 == 0) {while (Keypad_Row3 == 0);keyVal= row * 4 + col + 9;return keyVal;}}if (Keypad_Row4 == 0) {delay(5);if (Keypad_Row4 == 0) {while (Keypad_Row4 == 0);keyVal = row * 4 + col + 13;return keyVal;}}}}return 0xFF;    // 返回0xFF表示没有按键按下
}// 检查输入的密码是否与设定密码一致
bit CheckPassword() {unsigned char i;for (i = 0; i < PASSWORD_LENGTH; i++) {if (enteredPassword[i] != password[i])return 0;    // 密码不一致}return 1;    // 密码一致
}// 输入密码
bit EnterPassword() {unsigned char i;unsigned char key;for (i = 0; i < PASSWORD_LENGTH; i++) {while ((key = Keypad_Read()) == 0xFF);enteredPassword[i] = key;LCD_WriteData('*');delay(300);}return CheckPassword();
}// 修改密码
void ChangePassword() {unsigned char i;LCD_ShowString(0, 1, "Enter New Password");for (i = 0; i < PASSWORD_LENGTH; i++) {while ((enteredPassword[i] = Keypad_Read()) == 0xFF);LCD_WriteData('*');delay(300);}for (i = 0; i < PASSWORD_LENGTH; i++)password[i] = enteredPassword[i];LCD_ShowString(0, 1, "Password Changed ");delay(1000);LCD_ShowString(0, 1, "Enter Password: ");
}// 开锁
void Unlock() {LCD_ShowString(0, 1, "Unlocking...");Buzzer = 1;    // 发出提示音ElectromagneticLock = 0;    // 解锁状态delay(2000);Buzzer = 0;    // 关闭提示音ElectromagneticLock = 1;    // 上锁状态LCD_ShowString(0, 1, "Enter Password: ");
}// 主函数
void main() {LCD_Init();    // 初始化LCD1602Keypad_Init();    // 初始化矩阵键盘LCD_ShowString(0, 0, "Electronic Lock");LCD_ShowString(0, 1, "Enter Password: ");while (1) {if (EnterPassword()) {Unlock();    // 密码正确,开锁attempts = 0;    // 尝试次数清零} else {attempts++;    // 尝试次数加一if (attempts >= MAX_ATTEMPTS) {LCD_ShowString(0, 1, "Max Attempts Exceeded");Buzzer = 1;    // 发出警报音delay(2000);Buzzer = 0;    // 关闭警报音attempts = 0;    // 尝试次数清零} else {LCD_ShowString(0, 1, "Wrong Password     ");delay(1000);LCD_ShowString(0, 1, "Enter Password: ");}}while ((Keypad_Read()) != 0xFF);    // 等待按键释放if (Keypad_Read() == '#') {ChangePassword();    // 输入'#'进入修改密码模式}}
}

相关文章:

基于单片机设计的电子柜锁

一、前言 随着现代社会的不断发展&#xff0c;电子柜锁的应用越来越广泛。传统的机械柜锁存在一些不便之处&#xff0c;例如钥匙容易丢失、密码容易泄露等问题。设计一款基于单片机的电子柜锁系统成为了一个有趣而有意义的项目。 该电子柜锁系统通过电磁锁作为柜锁的开关&…...

Windows安装tensorflow-gpu=1.14.0CUDA=10.0cuDNN=7.4 (多版本CUDA共存)

文章目录 0. 前置说明1. 查看版本对应关系2. 安装 cuda3. 安装 cudnn4. 添加环境变量5. 安装 tensorflow 0. 前置说明 本机&#xff08;Windows 11&#xff09;已安装CUDA 11.7 使用命令查看显卡驱动&#xff1a; nvidia-smi这里显示的CUDA Version: 11.7说明支持安装11.7版本…...

CodeWhisperer 初体验

文章作者&#xff1a;1颗 orange 最近用了一个叫 CodeWhisperer 的插件&#xff0c;这个软件对于来说开发人员&#xff0c;插件有好多实用的功能&#xff0c;编码更高效&#xff0c;代码质量也提升了很多。 CodeWhisperer 简介 CodeWhisperer 是亚⻢逊出品的一款基于机器学习…...

HNU-算法设计与分析-讨论课1

第一次小班讨论 &#xff08;以组为单位&#xff0c;每组一题&#xff0c;每组人人参与、合理分工&#xff0c;ppt中标记分工&#xff0c;尽量都有代码演示&#xff09; 1.算法分析题 2-10、2-15(要求&#xff1a;有ppt&#xff08;可代码演示&#xff09;) 2.算法实现题 2-4、…...

java连接zookeeper

API ZooKeeper官方提供了Java API&#xff0c;可以通过Java代码来连接zookeeper服务进行操作。可以连接、创建节点、获取节点数据、监听节点变化等操作&#xff0c;具体有以下几个重要的类&#xff1a; ZooKeeper&#xff1a;ZooKeeper类是Java API的核心类&#xff0c;用于与…...

2023-11-01 node.js-electron-环境配置-记录

摘要: 2023-11-01 node.js-electron-环境配置-记录 相关文档: Node.js Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron node.js的国内源 - Python技术站 node.js 下载地址: https://nodejs.org/dist/v20.9.0/ 说明: 最好使用最新版本当前我使…...

使用 ElementUI 组件构建 Window 桌面应用探索与实践(WinForm)

零、实现原理与应用案例设计 1、原理 基础实例 Demo 可以参照以下这篇博文&#xff0c; 基于.Net CEF 实现 Vue 等前端技术栈构建 Windows 窗体应用-CSDN博客文章浏览阅读291次。基于 .Net CEF 库&#xff0c;能够使用 Vue 等前端技术栈构建 Windows 窗体应用https://blog.c…...

使用C++构建安全队列

1 背景 STL的容器不是线程安全的&#xff0c;我们经常会有需求要求数据结构线程安全&#xff0c;比如写生产者消费者模型的时候&#xff0c;就要求队列线程安全。利用std::queue和C线程标准库的一些组件&#xff08;mutex&#xff0c;condition_variable&#xff09;&#xff…...

EasyFlash移植使用- 关于单片机 BootLoader和APP均使用的情况

目前&#xff0c;我的STM32单片机&#xff0c;需要在BootLoader和APP均移植使用EasyFlash&#xff0c;用于参数管理和IAP升级使用。 但是由于Flash和RAM限制&#xff0c;减少Flash占用&#xff0c;我规划如下&#xff1a; BootLoader中移植EasyFlash使用旧版本&#xff0c;因为…...

python捕获异常和scapy模块的利用

Python捕获异常 ​ 当程序运行时&#xff0c;因为遇到未知的错误而导致中止运行&#xff0c;便会出现Traceback 消息&#xff0c;打印异常。异常即是一个事件&#xff0c;该事件会在程序执行过程中发生&#xff0c;影响程序的正常执行。一般情况下&#xff0c;在Python 无法正…...

CSS+Javascript+Html日历控件

最近&#xff0c;因需要用HTMLJAVASCRIPTCSS实现了一个日历控件&#xff0c;效果如下&#xff1a; 单击上月、下月进行日历切换。当前日期在日历中变颜色标注显示。还是老老套路、老方法&#xff0c;分HMLCSSJAVASCRIPT三部分代码。 一、html代码 <h1>学习计划</h1…...

让企业的数据用起来,数据中台=数据治理?

加gzh“大数据食铁兽”&#xff0c;了解更多数据治理信息。 先说结论&#xff1a;数据中台是数据管理/治理的工具之一&#xff0c;数据治理是3分技术7分管理及运营。 数据中台的定义&#xff1a; 狭义的数据中台指在企业内部通过对数据半成品、算法、模型、工具等能力的积累&a…...

【人工智能Ⅰ】5-粒子群算法

【人工智能Ⅰ】5-粒子群算法 文章目录 【人工智能Ⅰ】5-粒子群算法5.1 粒子群算法PSO基本思想5.2 PSO介绍5.3 PSO求最优解5.4 算法流程5.5 PSO构成要素群体大小m权重因子最大速度Vm停止准则粒子空间的初始化领域的拓扑结构 5.6 PSO应用5.7 PSO改进动态调整惯性权重收缩因子法 5…...

软考高项-49个项目管理过程输入、输出和工具技术表

知识领域数量五大过程组启动规划执行监控收尾整体7制订项目章程制订项目管理计划指导与管理项目工作 管理项目知识 监控项目工作 实施整体变更控制 结束项目或阶段范围6规划范围管理 收集需求 定义范围 创建WBS 确认范围 控制范围 进度6规划进度管理 定义活动...

《C和指针》(7)函数

问题 具有空函数体的函数可以作为存根使用。你如何对这类函数进行修改&#xff0c;使其更加有用&#xff1f; 答&#xff1a;当存根函数被调用时&#xff0c;打印一条消息&#xff0c;显示它已被调用&#xff0c;或者也可以打印作为参数传递给它的值。 .如果在一个函数的声明中…...

vue3中的Props

Props声明 一个组件需要显示声明它所接受的props&#xff0c;这样vue才能知道外部传入的哪些是props&#xff0c;哪些是透传attribute 在使script setup的单文件中&#xff0c;props可以使用 defineProps()宏来声明&#xff1a; <script setup> const props definePro…...

ElasticSearch搜索技术深入与聚合查询实战

ES分词器详解 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 分词发生时…...

vue+element ui中的el-button自定义icon图标

实现 button的icon属性自定义一个图标名称&#xff0c;这个自定义的图标名称会默认添加到button下i标签的class上&#xff0c;我们只需要设置i标签的样式就可以了 ##3. 按钮上使用自定义的icon 完整代码 <div class"lookBtn"><el-button icon"el-icon-…...

PyQt5:构建目标检测算法GUI界面 (附python代码)

文章目录 1.界面2.代码3.Analyze 1.界面 目标检测算法一般就是检测个图片&#xff0c;然后显示图片结果。 最简单的情况&#xff0c;我们需要一个按钮读取图片&#xff0c;然后后有一个地方显示图片。 2.代码 import sys import numpy as np from PIL import Imagefrom PyQt…...

SV-10A-4G IP网络报警非可视终端 (4G版)

SV-10A-4G IP网络报警非可视终端 &#xff08;4G版&#xff09; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.621e3d0dpv5knb&ftt&id745728046948 产品简介&#xff1a; 通过局域网/广域网网组网的网络报警系统&#xff0c;改变传统局域网组网…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

[特殊字符] Spring Boot底层原理深度解析与高级面试题精析

一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配&#xff0c;通过简化传统Spring应用的初始化和配置流程&#xff0c;显著提升开发效率。其底层原理可拆解为以下核心机制&#xff1a; 自动装配&#xff08;Auto-Configuration&#xff09; 核…...