【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁

news2024/11/16 7:26:35

在这里插入图片描述
在这里插入图片描述

文章目录

  • 基于ATmega16的数码管独立按键密码锁设计实验报告
    • 实验背景
    • 硬件介绍
      • 主要元器件
      • 电路连接
    • 设计原理
      • 硬件设计
      • 软件设计
    • 程序原理
      • 延时函数
      • 独立按键检测
      • 密码显示
      • 主函数
  • 资源代码

基于ATmega16的数码管独立按键密码锁设计实验报告

实验背景

本实验旨在设计并实现一个基于ATmega16单片机的数码管独立按键密码锁系统。该系统能够接受用户输入的密码,并与预设的系统密码进行比对,若匹配成功则点亮绿色LED灯,否则点亮红色LED灯。此设计广泛应用于电子门锁等安全系统中。

硬件介绍

主要元器件

  1. ATmega16单片机:核心控制器,负责按键扫描、密码存储及比较、LED灯和数码管显示控制等。
  2. 独立按键:用于用户输入密码。
  3. 共阴极数码管:用于显示用户输入的密码。
  4. LED灯:绿色和红色LED分别用于指示密码输入正确与否。
  5. 电阻、电容:用于限流和滤波。

电路连接

  1. 独立按键:连接至单片机的PINA和PINB引脚,用于检测按键输入。
  2. 数码管:连接至单片机的PORTC和PORTD引脚,通过动态扫描方式显示用户输入的密码。
  3. LED灯:分别连接至单片机的PORTA引脚,通过控制高低电平实现亮灭。
  4. 电源:为整个系统提供稳定的电源供给。

设计原理

硬件设计

  • 独立按键检测:采用独立按键,通过PINA和PINB端口检测按键状态。每个按键对应一个独立的引脚,当按键按下时,检测到低电平,从而获取按键值。
  • 数码管显示:采用动态扫描方式,逐个显示数码管的内容。通过控制PORTD和PORTC实现数码管的选择和段码显示。
  • LED指示:通过控制PORTA的高低电平来实现绿色和红色LED灯的亮灭,指示密码输入的正确与否。

软件设计

程序采用C语言编写,主要包括以下几个模块:

  1. 延时函数:通过简单的循环实现延时,以配合数码管动态扫描的刷新。
  2. 按键检测:扫描独立按键,获取用户按键输入的值。
  3. 密码显示:将用户输入的密码通过数码管显示出来。
  4. 密码比较:将用户输入的密码与预设密码进行比对,控制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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

固态,机械,移动(U盘),sd卡,哪个更适合长期储存数据 保存数据用什么硬盘可靠 硬盘数据丢失怎么找回 硬盘维护注意事项

有关硬盘数据丢失的恢复技巧&#xff0c;这篇文章一定要收藏好。在硬盘使用过程中&#xff0c;很多情况都会导致数据丢失&#xff0c;例如硬盘跌落、病毒感染、系统文件损坏等。这时候&#xff0c;一定要采用正确的方法&#xff0c;抢救硬盘中存储的珍贵数据和文档。 有关长期保…

解决C++编译时的产生的skipping incompatible xxx 错误

问题 我在编译项目时&#xff0c;产生了一个 /usr/bin/ld: skipping incompatible ../../xxx/ when searching for -lxxx 的编译错误&#xff0c;如下图所示&#xff1a; 解决方法 由图中的错误可知&#xff0c;在编译时&#xff0c;是能够在我们指定目录下的 *.so 动态库的…

三丰云评测:免费虚拟主机与免费云服务器的全面对比

三丰云是一家知名的互联网服务提供商&#xff0c;专注于虚拟主机和云服务器的服务。在互联网技术日新月异的今天&#xff0c;选择一个优质的云服务提供商至关重要。本次评测将重点对比三丰云的免费虚拟主机和免费云服务器&#xff0c;帮助用户更好地选择适合自己需求的服务。首…

Apache Seata分布式事务原理解析探秘

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 前言 fescar发布已有时日&#xff0c;分布式事务一直是业界备受关注的领域&#xff0c;fesca…

【代码随想录】【算法训练营】【第60天】 [卡码107]寻找存在的路径

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 60&#xff0c;周六&#xff0c;ding ding~ 题目详情 [卡码107] 寻找存在的路径 题目描述 卡码107 寻找存在的路径 LeetCode类似题目1971 寻找图中是否存在路径 解题思路 前提&#xff1a; 思…

TQ15EG开发板教程:MPSOC创建fmcomms8工程

链接&#xff1a;https://pan.baidu.com/s/1jbuYs9alP2SaqnV5fpNgyg 提取码&#xff1a;r00c 本例程需要实现在hdl加no-OS系统中&#xff0c;通过修改fmcomms8/zcu102项目&#xff0c;实现在MPSOC两个fmc口上运行fmcomms8项目。 目录 1 下载文件与切换版本 2 编译fmcomms8项…

从0到1制作单只鳌虾运动轨迹追踪软件

前言 需要准备windows10操作系统&#xff0c;python3.11.9&#xff0c;cuDNN8.9.2.26&#xff0c;CUDA11.8&#xff0c;paddleDetection2.7 流程&#xff1a; 准备数据集-澳洲鳌虾VOC数据集 基于RT-DETR目标检测模型训练导出onnx模型进行python部署平滑滤波处理视频帧保留的…

Linux Centos7部署Zookeeper

目录 一、下载zookeeper 二、单机部署 1、创建目录 2、解压 3、修改配置文件名 ​4、创建保存数据的文件夹 ​5、修改配置文件保存数据的地址 ​6、启动服务 7、api创建节点 一、下载zookeeper 地址&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.7 (apache.org…

在5G/6G应用中实现高性能放大器的建模挑战

来源&#xff1a;Modelling Challenges for Enabling High Performance Amplifiers in 5G/6G Applications {第28届“集成电路和系统的混合设计”(Mixed Design of Integrated Circuits and Systems)国际会议论文集&#xff0c;2021年6月24日至26日&#xff0c;波兰洛迪} 本文讨…

Stream 很好,Map 很酷,但答应我别用 toMap()

文章目录 Collectors.toMap() 的常见问题替代方案1. 使用 Collectors.groupingBy()2. 处理空值3. 自定义合并逻辑 总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博…

键盘异常的检测与解决方案

今天对象用Word写文档&#xff0c;按下Ctrl的时候&#xff0c;页面不停地上下滑动&#xff0c;导致无法正常编辑文本。 重启之后&#xff0c;仍然无法解决&#xff0c;推断是键盘坏了。 但是当按下Fn或其他功能键&#xff0c;焦点移除&#xff0c;页面就不会再抖动了。 现在…

2.2.2.1 如何在vscode 中设置ROS2的 用户代码片段

1. vscode中设置C版本的ROS2用户代码片段 1) 找到vscode 下的设置选项&#xff0c;选择用户代码片段 2) 选择用户代码片段后&#xff0c;会弹出选择框&#xff0c;如下图&#xff0c;输入C,选择 cpp.json 配置好的文件 进入如下文件&#xff0c;下图为本人配置的代码片段模版文…

E1.【C语言】练习:用函数求两个整数的较大值

有关创建函数见&#xff1a; 12.【C语言】创建函数 写法 1&#xff1a;if语句 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int max(int a, int b) {if (a > b)return a;elsereturn b; } int main() {int a 0;int b 0;scanf("%d%d", &a,…

数据可视化之智慧城市的脉动与洞察

在数字化转型的浪潮中,城市作为社会经济发展的核心单元,正经历着前所未有的变革。城市数据可视化大屏看板作为这一变革中的重要工具,不仅极大地提升了城市管理效率,还为公众提供了直观、全面的城市运行状态视图,成为智慧城市建设不可或缺的一部分。本文将深入探讨以“城市…

【MySQL04】【 redo 日志】

文章目录 一、前言二、redo 日志1. redo 日志格式2. Mini-Transaction2.1 以组的形式写入 redo 日志2.2 Mini-Transaction &#xff08;MTR&#xff09;概念 3. redo 日志写入过程3.1 redo 日志缓冲区3.3 redo 日志写入 log buffer 4. redo 日志文件4.1 redo 日志刷盘机制4.2 r…

实现桌面动态壁纸(二)

目录 前言 一、关于 WorkerW 工作区窗口 二、关于窗口关系 2.1 窗口以及窗口隶属关系 2.2 桌面管理层窗口组分简析 2.3 厘清两个概念的区别 2.4 关于设置父窗口 三、编写代码以供在 Vista 上实现 3.1 方法二&#xff1a;子类化并自绘窗口背景 四、初步分析桌面管理层…

qt 如何添加子项目

首先我们正常流程创建一个项目文件&#xff1a; 这是我已经创建好的&#xff0c;请无视红线 然后找到该项目的文件夹&#xff0c;在文件夹下创建一个文件夹&#xff0c;再到创建好的文件夹下面创建一个 .pri 文件&#xff1a; &#xff08;创建文件夹&#xff09; &#xff08…

自闭症在生活中的典型表现

自闭症&#xff0c;这个看似遥远却又悄然存在于我们周围的疾病&#xff0c;其影响深远且复杂。在日常生活中&#xff0c;自闭症患者的典型表现往往让人印象深刻&#xff0c;这些表现不仅揭示了他们内心的世界&#xff0c;也提醒我们要以更加包容和理解的心态去面对他们。 首先…

嵌入式C语言面试相关知识——关键字(不定期更新)

嵌入式C语言面试相关知识——关键字 一、博客声明二、C语言关键字1、sizeof关键字2、static关键字3、const关键字4、volatile关键字5、extern关键字 一、博客声明 又是一年一度的秋招&#xff0c;怎么能只刷笔试题目呢&#xff0c;面试题目也得看&#xff0c;想当好厂的牛马其实…

六、快速启动框架:SpringBoot3实战-个人版

六、快速启动框架&#xff1a;SpringBoot3实战 文章目录 六、快速启动框架&#xff1a;SpringBoot3实战一、SpringBoot3介绍1.1 SpringBoot3简介1.2 系统要求1.3 快速入门1.4 入门总结回顾复习 二、SpringBoot3配置文件2.1 统一配置管理概述2.2 属性配置文件使用2.3 YAML配置文…