【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁
文章目录
- 基于ATmega16的数码管独立按键密码锁设计实验报告
- 实验背景
- 硬件介绍
- 主要元器件
- 电路连接
- 设计原理
- 硬件设计
- 软件设计
- 程序原理
- 延时函数
- 独立按键检测
- 密码显示
- 主函数
- 资源代码
基于ATmega16的数码管独立按键密码锁设计实验报告
实验背景
本实验旨在设计并实现一个基于ATmega16单片机的数码管独立按键密码锁系统。该系统能够接受用户输入的密码,并与预设的系统密码进行比对,若匹配成功则点亮绿色LED灯,否则点亮红色LED灯。此设计广泛应用于电子门锁等安全系统中。
硬件介绍
主要元器件
- ATmega16单片机:核心控制器,负责按键扫描、密码存储及比较、LED灯和数码管显示控制等。
- 独立按键:用于用户输入密码。
- 共阴极数码管:用于显示用户输入的密码。
- LED灯:绿色和红色LED分别用于指示密码输入正确与否。
- 电阻、电容:用于限流和滤波。
电路连接
- 独立按键:连接至单片机的PINA和PINB引脚,用于检测按键输入。
- 数码管:连接至单片机的PORTC和PORTD引脚,通过动态扫描方式显示用户输入的密码。
- LED灯:分别连接至单片机的PORTA引脚,通过控制高低电平实现亮灭。
- 电源:为整个系统提供稳定的电源供给。
设计原理
硬件设计
- 独立按键检测:采用独立按键,通过PINA和PINB端口检测按键状态。每个按键对应一个独立的引脚,当按键按下时,检测到低电平,从而获取按键值。
- 数码管显示:采用动态扫描方式,逐个显示数码管的内容。通过控制PORTD和PORTC实现数码管的选择和段码显示。
- LED指示:通过控制PORTA的高低电平来实现绿色和红色LED灯的亮灭,指示密码输入的正确与否。
软件设计
程序采用C语言编写,主要包括以下几个模块:
- 延时函数:通过简单的循环实现延时,以配合数码管动态扫描的刷新。
- 按键检测:扫描独立按键,获取用户按键输入的值。
- 密码显示:将用户输入的密码通过数码管显示出来。
- 密码比较:将用户输入的密码与预设密码进行比对,控制LED灯的显示状态。
程序原理
延时函数
void delay_nms(int time) {int i;for (; time > 0; time--) {for (i = 0; i < 1000; i++);}
}
延时函数通过简单的循环实现,以配合数码管的动态扫描。
独立按键检测
int getKeyBoardValue(void) {if ((PINB & 0x01) == 0) return 0;else if ((PINB & 0x02) == 0) return 1;else if ((PINB & 0x04) == 0) return 2;else if ((PINB & 0x08) == 0) return 3;else if ((PINB & 0x10) == 0) return 4;else if ((PINB & 0x20) == 0) return 5;else if ((PINB & 0x40) == 0) return 6;else if ((PINB & 0x80) == 0) return 7;else if ((PINA & 0x08) == 0) return 8;else if ((PINA & 0x10) == 0) return 9;else if ((PINA & 0x20) == 0) return 10;else if ((PINA & 0x40) == 0) return 11;else if ((PINA & 0x80) == 0) return 12;return 20;
}
通过检测PINA和PINB引脚的电平状态,判断哪个键被按下。
密码显示
void display_pwd(char *pwdptr, unsigned char length) {int i = 0;for (i = 0; i < length; i++) {LedOut[i] = Disp_Tab[pwdptr[i] - '0'];}for (i = length; i < 6; i++) {LedOut[i] = Disp_Tab[11];}
}
将用户输入的密码通过数码管显示出来,未输入的位显示为空白。
主函数
void main(void) {char cnt_seg = 0;int keyTemp = 0;char SYSTEM_PASSWORD[7] = "123456";char in_buffer[7] = {0, 0, 0, 0, 0, 0, 0};char input_nuber = 0;char key_press_flag = 0;while (1) {keyTemp = getKeyBoardValue();if ((keyTemp != 20) && (key_press_flag == 0)) {key_press_flag = 1;if (keyTemp <= 9) keyTemp += '0';if ((keyTemp >= '0') && (keyTemp <= '9') && (input_nuber < 6)) {in_buffer[input_nuber++] = keyTemp;}if ((keyTemp == 11) && input_nuber) {input_nuber--;in_buffer[input_nuber] = 0;}if (keyTemp == 12) {input_nuber = 0;memset(in_buffer, 0, sizeof(in_buffer));PORTA |= 0x01;PORTA |= 0x02;}if ((keyTemp == 10) && (input_nuber == 6)) {if (memcmp(in_buffer, SYSTEM_PASSWORD, 6) == 0) {PORTA &= ~0x02;PORTA |= 0x01;} else {PORTA &= ~0x01;PORTA |= 0x02;}memset(LedOut, Disp_Tab[11], sizeof(LedOut));input_nuber = 0;memset(in_buffer, 0, sizeof(in_buffer));}display_pwd(in_buffer, input_nuber);}if (getKeyBoardValue() == 20) {key_press_flag = 0;}cnt_seg++;if (cnt_seg > 5) {cnt_seg = 0;}delay_nms(2);}
}
主函数负责初始化各端口,循环检测按键输入,处理用户输入的密码,并通过数码管显示和LED指示密码验证结果。
资源代码
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
相关文章:

【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁
文章目录 基于ATmega16的数码管独立按键密码锁设计实验报告实验背景硬件介绍主要元器件电路连接 设计原理硬件设计软件设计 程序原理延时函数独立按键检测密码显示主函数 资源代码 基于ATmega16的数码管独立按键密码锁设计实验报告 实验背景 本实验旨在设计并实现一个基于ATm…...

数据库主从复制
目录 一.主从复制架构 二.主从复制原理 三.实现主从复制配置 1.新建主从复制 2.实战遇到问题 3.复制错误解决方法 4.级联 主从复制 5.半同步复制 MySQL数据库的主从复制(Master-Slave Replication)是一种常见的数据库复制架构,用于提…...

昇思25天学习打卡营第13天|BERT
一、简介: BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers),它是Google于2018年末开发并发布的一种新型语言模型。与BERT模型相似的预训练语言模型例如问答、命名实体识别、自…...

跨平台书签管理器 - Raindrop
传统的浏览器书签功能虽然方便,但在管理和分类上存在诸多局限。今天,我要向大家推荐一款功能强大的跨平台书签管理-Raindrop https://raindrop.io/ 📢 主要功能: 智能分类和标签管理 强大的搜索功能 跨平台支持 分享与协作 卡片式…...

均匀采样信号的鲁棒Savistky-Golay滤波(MATLAB)
S-G滤波器又称S-G卷积平滑器,它是一种特殊的低通滤波器,用来平滑噪声数据。该滤波器被广泛地运用于信号去噪,采用在时域内基于多项式最小二乘法及窗口移动实现最佳拟合的方法。与通常的滤波器要经过时域-频域-时域变换…...

c++ 可以再头文件种直接给成员变量赋值吗
在C中,你通常不能在头文件中直接给类的成员变量赋值,因为这会导致每个包含该头文件的源文件中都尝试进行赋值,从而引发多重定义错误。然而,你可以在类的构造函数中初始化成员变量,或者在类声明中使用初始化列表或默认成…...

47.HOOK引擎优化支持CALL与JMP位置做HOOK
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 上一个内容:46.修复HOOK对代码造成的破坏 以 46.修复HOOK对代码造成的破坏 它的代码为基础进行修改 优化的是让引擎支持从短跳JMP(E9&…...

liunx上修改Firefox版本号
在Linux上修改Firefox的版本号并不直接推荐也不鼓励,因为这可能会影响到浏览器的安全性、兼容性和自动更新功能。但如果你因为某些特殊测试场景确实需要修改其显示的版本号(请注意,这样做可能会引发不可预料的问题),可…...

bug——多重定义
bug——多重定义 你的问题是在C代码中遇到了"reference to data is ambiguous"的错误。这个错误通常发生在你尝试引用一个具有多重定义的变量时。 在你的代码中,你定义了一个全局变量data,同时,C标准库中也有一个名为data的函数模板…...

将堆内存的最小值(Xms)与最大值(Xmx)设置为相同的配置,可以防止JVM在运行过程中根据需要动态调整堆内存大小
将堆内存的最小值(Xms)与最大值(Xmx)设置为相同的配置,可以防止JVM在运行过程中根据需要动态调整堆内存大小,从而避免因内存分配策略变化引起的性能波动,也就是所谓的"内存震荡"&…...

安装 tesseract
安装 tesseract 1. Ubuntu-24.04 安装 tesseract2. Ubuntu-24.04 安装支持语言3. Windows 安装 tesseract4. Oracle Linux 8 安装 tesseract 1. Ubuntu-24.04 安装 tesseract sudo apt install tesseract-ocr sudo apt install libtesseract-devreference: https://tesseract-…...

为适配kubelet:v0.4 安装指定版本的docker
系统版本信息 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) iso 文件下载地址 https://vault.centos.org/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso0.4 版本的kubelet 报错信息记录 E0603 19:00:38.273720 44142 kubelet.go:734] Error synci…...

vivado CLOCK_REGION、CLOCK_ROOT
时钟区域 CLOCK_REGION属性用于将时钟缓冲区分配给 UltraScale设备,同时让Vivado放置程序将时钟缓冲区分配给最佳站点 在该区域内。 重要提示:对于UltraScale设备,不建议将时钟缓冲区固定到特定站点,因为 你可以在时钟上规划一个7…...

alphazero学习
AlphaGoZero是AlphaGo算法的升级版本。不需要像训练AlphaGo那样,不需要用人类棋局这些先验知识训练,用MCTS自我博弈产生实时动态产生训练样本。用MCTS来创建训练集,然后训练nnet建模的策略网络和价值网络。就是用MCTSPlayer产生的数据来训练和…...

剖析DeFi交易产品之UniswapV3:交易路由合约
本文首发于公众号:Keegan小钢 SwapRouter 合约封装了面向用户的交易接口,但不再像 UniswapV2Router 一样根据不同交易场景拆分为了那么多函数,UniswapV3 的 SwapRouter 核心就只有 4 个交易函数: exactInputSingle:指…...

Agent下载安装步骤
目录 一. 环境准备 二. 部署安装 三. Server端Web页面添加agent客户端 一. 环境准备 准备一台虚拟机,关闭防火墙和selinux,进行时间同步。 版本主机名IP系统zabbix6.4-agentweb1192.168.226.29Rocky_linux9.4 修改主机名 [rootlocalhost ~]# hostna…...

2024年AI技术深入研究
2024年AI技术持续快速发展,应用领域广泛,产业发展迅速,市场趋势积极,学术研究深入。 AI技术进展大模型发展 2024年,智谱AI正在研发对标OpenAI Sora的高质量文生视频模型,预计最快年内发布。智谱AI的进展显示了国内AI大模型领域的快速发展,以及与国际领先技术的竞争态势…...

Apache Seata分布式事务启用Nacos做配置中心
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Seata分布式事务启用Nacos做配置中心 Seata分布式事务启用Nacos做配置中心 项目地址 本文作…...

Emacs之解决:java-mode占用C-c C-c问题(一百四十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...

go语言day10 接口interface 类型断言 type关键字
接口: 空接口类型: 要实现一个接口,就要实现该接口中的所有方法。因为空接口中没有方法,所以自然所有类型都实现了空接口。那么就可以使用空接口类型变量去接受所有类型对象。 类比java,有点像Object类型的概念&#x…...

Java实现登录验证 -- JWT令牌实现
目录 1.实现登录验证的引出原因 2.JWT令牌2.1 使用JWT令牌时2.2 令牌的组成 3. JWT令牌(token)生成和校验3.1 引入JWT令牌的依赖3.2 使用Jar包中提供的API来实现JWT令牌的生成和校验3.3 使用JWT令牌验证登录3.4 令牌的优缺点 1.实现登录验证的引出 传统…...

liunx文件系统,日志分析
文章目录 1.inode与block1.1 inode与block概述1.2 inode的内容1.3 文件存储1.4 inode的大小1.5 inode的特殊作用 2.硬链接与软链接2.1链接文件分类 3.恢复误删除的文件3.1 案例:恢复EXT类型的文件3.2 案例:恢复XFS类型的文件3.2.1 xfsdump使用限制 4.分析日志文件4.1日志文件4.…...

Apipost接口测试工具的原理及应用详解(二)
本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为软件开发过程中不可或缺的一环。在众多API测试工具中,Apipost凭…...

「AIGC」大数据开发语言Scala入门
Scala 是一种多范式编程语言,设计初衷是集成面向对象编程和函数式编程的特点。它运行在 Java 虚拟机(JVM)上,因此可以与 Java 库无缝集成。Scala 也因其在大数据处理领域的应用而受到欢迎,特别是与 Apache Spark 这类框架结合使用。 1. 环境搭建 安装 Scala:可以从 Scala…...

2.1 tmux和vim
文章目录 前言概述tmuxvim总结 前言 开始学习的时间是 2024.7.6 ,13:47 概述 最好多使用,练成条件反射式的 直接使用终端的工具,可以连接到服务器,不需要使用本地的软件 tmux 这个主要有两个功能,第一个功能是分…...

运行vue : 无法加载文件 C:\Program Files\nodejs\node_global\vue.ps1,因为在此系统上禁止运行脚本。
报错背景: 重装了win10系统,然后准备安装Vue,这个时候我已经安装好了node.js和npm,输入node -v和npm -v都有正确输出,但是每次输入npm install -g vue/cli 安装的时候,就会报错. 大家安装node.js的时候最好就是默认路径(C:\Program Files\nodejs),别去修改不然很多报错.(个人…...

Lambda架构
1.Lambda架构对大数据处理系统的理解 Lambda架构由Storm的作者Nathan Marz提出,其设计目的在于提供一个能满足大数据系统关键特性的架构,包括高容错、低延迟、可扩展等。其整合离线计算与实时计算,融合不可变性、读写分离和复杂性隔离等原则&…...

数据库作业day3
创建一个student表用于存储学生信息 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT ); 向student表中添加一条新记录 记录中id字段的值为1,name字段的值为"monkey",grade字段的值为98.5 insert into …...

计算机网络——数据链路层(以太网扩展、虚拟局域网、高速以太网)
在许多情况下,我们希望把以太网的覆盖范围扩展。本节先讨论在物理层把以太网扩展,然后讨论在数据链路层把以太网扩展。这种扩展的以太网在网络层看来仍然是一个网络。 在物理层扩展以太网 现在,扩展主机和集线器之间的距离的一种简单方法就是…...

Nuxt 项目集成第三方UI组件库(九)
Nuxt.js 本身并不提供内置的 UI 组件库,它是一个用于构建服务端渲染(SSR)和静态生成(SSG)Vue.js应用的框架。Nuxt.js 的设计目的是提供基础的架构和配置,以便开发者可以根据自己的需求选择和集成第三方 UI …...