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

一、前言

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

该电子柜锁系统通过电磁锁作为柜锁的开关,通过继电器控制电磁锁的开关状态。用户可以通过矩阵键盘输入密码进行开锁,并且密码数据会通过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();    // 输入'#'进入修改密码模式}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【强化学习】14 —— A3C(Asynchronous Advantage Actor Critic)

A3C算法&#xff08; Asynchronous Methods for Deep Reinforcement Learning&#xff09;于2016年被谷歌DeepMind团队提出。A3C是一种非常有效的深度强化学习算法&#xff0c;在围棋、星际争霸等复杂任务上已经取得了很好的效果。接下来&#xff0c;我们先从A3C的名称入手&…

电脑如何录制小视频

如果你想在你的电脑上录制视频分享给你的朋友或者亲人&#xff0c;无论你的电脑是win还是mac&#xff0c;都可以在本篇文章中找到电脑录制视频的详细教程。小编为你们整理了2种不同系统电脑的录制详细流程&#xff0c;继续阅读查看吧&#xff01; 第一部分&#xff1a;windows…

计算样本方差和总体方差

例如&#xff0c;给出了三个数据&#xff0c;194、183、175&#xff0c;现在计算样本方差和总体方差。 手工计算 它们的平均值 样本方差 总体方差 用excel计算 样本方差 总体方差

ChatGPT对未来发展的影响?一般什么时候用到GPT

ChatGPT以其强大的自然语言处理能力对未来的发展具有重要影响。以下是ChatGPT的潜在影响和一般使用情况&#xff1a; 改善自然语言理解和生成&#xff1a;ChatGPT和类似的模型可以改善机器对人类语言的理解和生成。这将有助于改进各种应用领域&#xff0c;包括智能助手、聊天机…

恒驰服务 | 华为云数据使能专家服务offering之大数据建设

恒驰大数据服务主要针对客户在进行智能数据迁移的过程中&#xff0c;存在业务停机、数据丢失、迁移周期紧张、运维成本高等问题&#xff0c;通过为客户提供迁移调研、方案设计、迁移实施、迁移验收等服务内容&#xff0c;支撑客户实现快速稳定上云&#xff0c;有效降低时间成本…

基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类 计算机竞赛

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层&#xff1a;2.4 池化层&#xff1a;2.5 全连接softmax层&#xff1a;2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…

【TES720D】青翼科技基于复旦微的FMQL20S400全国产化ARM核心模

板卡概述 TES720D是一款基于上海复旦微电子FMQL20S400的全国产化核心模块。该核心模块将复旦微的FMQL20S400&#xff08;兼容FMQL10S400&#xff09;的最小系统集成在了一个50*70mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;特别是用…

chat gpt 在开发当中的应用

chatgpt 出来已经有一段时间了&#xff0c;本人在开发的过程中也是有去使用。 经常使用的是讯飞大模型和通义千问&#xff0c;在使用的过程中&#xff0c;个人感觉讯飞大模型在写代码方面会比较智能。 比如问一个 sqlser 单表 数据量 几个亿如何处理的问题&#xff0c;讯飞会给…

CH09_重新组织数据

拆分变量&#xff08;Split Variable&#xff09; 曾用名&#xff1a;移除对参数的赋值&#xff08;Remove Assignments to Parameters&#xff09; 曾用名&#xff1a;分解临时变量&#xff08;Split Temp&#xff09; let temp 2 * (height width); console.log(temp); t…

浅析Redis大Key | 京东云技术团队

一、背景 在京东到家购物车系统中&#xff0c;用户基于门店能够对商品进行加车操作。用户与门店商品使用Redis的Hash类型存储&#xff0c;如下代码块所示。不知细心的你有没有发现&#xff0c;如果单门店加车商品过多&#xff0c;或者门店过多时&#xff0c;此Key就会越来越大…

SpringMVC Day 08 : 文件上传下载

前言 文件上传和下载是 Web 开发中的重要环节&#xff0c;但它们往往不那么容易实现。幸运的是&#xff0c;Spring MVC 提供了一套简单而又强大的解决方案&#xff0c;让我们可以专注于业务逻辑&#xff0c;而不必过多关注底层的文件处理细节。 在本篇博客中&#xff0c;我们…

UE5——网络——RPC

RPC&#xff08;这个是官方文档的资料&#xff09; 要将一个函数声明为 RPC&#xff0c;您只需将 Server、Client 或 NetMulticast 关键字添加到 UFUNCTION 声明。 例如&#xff0c;若要将某个函数声明为一个要在服务器上调用、但需要在客户端上执行的 RPC&#xff0c;您可以…

在Maven中发布项目到Nexus私有服务器

一、测试环境 Sonatype Nexus 3.61.0-02 Maven 3.9.2 二、环境配置 2.1找到maven的配置文件 2.2添加私有仓库账户密码 <servers><server><id>nexus</id><username>admin</username><password>admin</password></server&…

【Linux】Linux+Nginx部署项目(负载均衡动静分离)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Nginx负载均衡 1.什么是负载均衡 2.实…

网站如何改成HTTPS访问

在今天的互联网环境中&#xff0c;将网站更改成HTTPS访问已经成为了一种标准做法。HTTPS不仅有助于提高网站的安全性&#xff0c;还可以提高搜索引擎排名&#xff0c;并增强用户信任。因此&#xff0c;转换为HTTPS是一个重要的举措&#xff0c;无论您拥有个人博客、电子商务网站…

年度评选开启,边缘力量驱动科技未来!

随着人工智能技术的快速发展&#xff0c;边缘计算作为一种新兴技术&#xff0c;正逐渐成为实现智能制造、智慧城市、自动驾驶等领域的关键技术之一。边缘计算能够在靠近数据源的地方进行数据处理和分析&#xff0c;从而提高数据的实时性和可靠性&#xff0c;同时降低网络带宽和…

【Linux】jdk Tomcat MySql的安装及Linux后端接口部署

一&#xff0c;jdk安装 1.1 上传安装包到服务器 打开MobaXterm通过Linux地址连接到Linux并登入Linux&#xff0c;再将主机中的配置文件复制到MobaXterm 使用命令查看&#xff1a;ll 1.2 解压对应的安装包 解压jdk 解压命令&#xff1a;tar -xvf jdk 加键盘中Tab键即可…

【LVS实战】02 搭建一个LVS-NAT模式实验

一、网络结构 用虚拟机搭建如下的几台机器&#xff0c;并配置如下的ip 关于虚拟机网卡和网络的配置&#xff0c;可以参考 iptables章节&#xff0c;05节&#xff1a;网络转发实验 主机A模拟外网的机器 B为负载均衡的机器 C和D为 RealServer 二、C和D主机的网关设置 C和D机…

ROS学习笔记(4):ROS架构和通讯机制

前提 前4篇文章以及帮助大家快速入门ROS了&#xff0c;而从第5篇开始我们会更加注重知识积累。同时我强烈建议配合B站大学的视频一起服用。 1.ROS架构三层次&#xff1a; 1.基于Linux系统的OS层&#xff1b; 2.实现ROS核心通信机制以及众多机器人开发库的中间层&#xff1b…

Redis的四种部署方案

这篇文章介绍Reids最为常见的四种部署模式&#xff0c;其实Reids和数据库的集群模式差不多&#xff0c;可以分为 Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署&#xff0c;其他的部署方式基本都是围绕以下几种方式在进行调整到适应的生产环境…