【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…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
