51单片机--动态数码管显示

news2024/9/21 8:27:41

文章目录

  • LED数码管
    • 一位晶体管
    • 多位一体数码管
    • 单片机上的数码管原理
  • 静态数码管显示
  • 动态数码管显示

LED数码管

简介:LED数码管是一种常用的数字显示设备。它由多个发光二极(LED)封装在一起,形成“8”字型的器件。数码管通常由7段LED组成,有的还会额外加一个小数点。LED数码管的引线已在内部连接好,只需要将其各个段引出来,并共用一个公共电极。
LED数码管具有高亮度、低功耗、显示灵活、易于操作等特点,广泛应用于各种计时器、仪表、电子钟、电子秤等场合,提供数字和字符的直观显示。

在这里插入图片描述
我们单片机上的是4位一体的数码管,在这里,我们先介绍单独一位的晶体管。

一位晶体管

在这里插入图片描述

在这里插入图片描述
对于一个数码管来说,是由8个LED组成的,我们要表示什么数字,就亮什么LED,表示数字。在这里,晶体管不同位置的LED是有一定的命名方式,从最上端开始命名‘a’,然后顺时针方向yici命名’b’‘c’‘d’‘e’‘f’,然后在中间命名为‘g’,右下角的一点命名为’dp’;
我们看一下右边的图,对于单个数码管的电路连接方式一般有两种,一种是共阴极连接方式,另一种是共阳极连接方式;在我们单片机上是共阴极的连接方式,图中对应的8个平行端口正好是连接着各个LED的,然后它们有一个公共端,直接接地。假设我们要点亮数字‘6’,那么我们就要在对应的LED上输入高电平(1),下图是LED对应的高低电平。
在这里插入图片描述
而对于共阳极来说,就需要反过来,因为LED是一个二极管,必须让其正极端是高电平的,但8个平行端口连接着二极管的负极,所以要亮的部分输入低电平;

多位一体数码管

在我们单片机上,正好就是一个四位一体的数码管;
在这里插入图片描述
对于这样的数码管,他总共有12个引脚:
在这里插入图片描述
其中上面的表示共阴极连接,下面是共阳极连接,这里我只以共阴极为例来讲解,我们发现,对于每个数码管来说它们的平行端口都是连接在一起的,也就是共同引用了8个引脚,对于每个数码管的公共端,是独立分开控制的,假设我们要在第二个打印上1,像这种选择在哪个位置上显示数字的,我们称之为‘位选’,我们只需要使要亮的赋予低电平,不亮的赋予高电平,就达到我们位选的条件,接下来就是跟单个晶体管同个原理,只需要选择对应的LED二极管亮起即可,高电平为亮,低电平为灭,这种选择我们称之为‘段选’;
在这里插入图片描述
那么当我们要位选多个显示时,如果我们要显示的是不同的数字,那么它可能会报出错误,无法达到我们想要的结果,这是因为由于段选是是个数码管共同引用的,无法同时达到显示不同数字的效果。 那么对于我们要显示这种对各数字的,我们就利用人眼视觉暂留和数码管显示的余晖的原理,通过对显示的数字进行延迟就能达到显示多个数字的效果,这也就是我们下面要讲的动态数码管显示。

单片机上的数码管原理

在这里插入图片描述
我们要段选什么数字,这里使用P0寄存器来控制,在连接电路中里面还包括了一个双向数据缓冲器和一个电阻;

双向数据缓冲器是一种用于在不同设备之间传输数据的电子元件。它可以在发送者和接收者之间提供临时存储,以平衡数据流速度不一致带来的问题。

由VCC直接供电,然后接地,里面的DIR表示方向(direction),在这里我们只需要由寄存器向数码管提供高低电平即可,也就是单项数据传输;
OE表示输出使能(Output Enable):

输出使能是一个控制信号,用于控制某个设备或模块的输出是否有效。当输出使能信号有效时,相应的输出电路或功能将被允许工作或产生输出;当输出使能信号无效时,相应的输出将被禁止或失效。

然后连接晶体管,我们单片机上有8个数码管,从左向右依次称之为LED1,LED2···,对于如此之多的数码管,我们这里用到一个译码器的元件来得以控制。
在这里插入图片描述
74HC138译码器,简称为38译码器,由电源直接控制,并接地;左下角是使能,由电源直接供电,并接地;左上角有ABC,并连接着P2寄存器,右边的Y正好连接着不同的数码管,这里,我们用到二进制表示十进制的方式,控制着不同的数码管;如:打开LED1,A为低位,C为高位,那么二进制就是000,对应着的就是Y0,就能打开LED1;下面依次类推,
在这里插入图片描述

这样就能控制八个数码管了,所以38译码器,就是利用三个寄存器,来对二进制数字进行转换,达到控制8个位置数码管的意思;

静态数码管显示

先给出代码:

#include <REGX52.H>
char Nixienumber[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char x,number)
{
	switch(x)
	{
		case 1:P2_2=0;P2_3=0;P2_4=0;break;
		case 2:P2_2=1;P2_3=0;P2_4=0;break;
		case 3:P2_2=0;P2_3=1;P2_4=0;break;
		case 4:P2_2=1;P2_3=1;P2_4=0;break;
		case 5:P2_2=0;P2_3=0;P2_4=1;break;
		case 6:P2_2=1;P2_3=0;P2_4=1;break;
		case 7:P2_2=0;P2_3=1;P2_4=1;break;
		case 8:P2_2=1;P2_3=1;P2_4=1;break;
	}
	P0=Nixienumber[number];
}
	
void main()
{
	Nixie(7,6);
}

这里对于位选的数码管,我们写了一个函数,用switch条件语句来进行选择,在对应的位选数码管通过38译码器来选择;而段选位置的数字,通过一个数组,将0~9对应的 数字依次用十六进制表示,通过利用数组下标的方式选出对应的数字。

在这里插入图片描述

动态数码管显示

上面我们说,对于数码管无法同时显示多个,那么解决方法就是一个一个亮起,通过延迟的效果让数码管暂留一会,利用我们人眼的视觉暂留,一般来说24ms内就能让肉眼无法察觉闪烁的效果,认为是静态的效果。
在这里先写一个延迟函数,以1ms为单位。
Delay.c

void Delayms(unsigned int x)		//@11.0592MHz
{
	unsigned char i, j;

	while(x--)
	{
	
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

头文件:Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delayms(unsigned int x);

#endif

然后再写一个数码管函数
Nixie.c

#include <REGX52.H>
#include "Delay.h"
char Nixienumber[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char x,number)
{
	switch(x)
	{
		case 1:P2_2=0;P2_3=0;P2_4=0;break;
		case 2:P2_2=1;P2_3=0;P2_4=0;break;
		case 3:P2_2=0;P2_3=1;P2_4=0;break;
		case 4:P2_2=1;P2_3=1;P2_4=0;break;
		case 5:P2_2=0;P2_3=0;P2_4=1;break;
		case 6:P2_2=1;P2_3=0;P2_4=1;break;
		case 7:P2_2=0;P2_3=1;P2_4=1;break;
		case 8:P2_2=1;P2_3=1;P2_4=1;break;
	}
	P0=Nixienumber[number];
	Delayms(2);//延时,使位选在一定闪烁在一定频率内,8个3ms内
	P0=0x00;//消隐,除去前一个段选
}

Nixie.h

#ifndef __NIXIE_H__
#define __NIXIE_H__
 
void Nixie(unsigned char x,number);

#endif

这里我打出的是八个晶体管同使亮起,那么要达到同时显示的效果,对于每个晶体管闪烁的频率就要保持在2ms内,然后每个晶体管显示后对需要清零,让下一个晶体管显示不会显示混乱;
最后,在主函数中调用各自的头文件,就能实现动态数码显示:

#include "Nixie.h"
void main()
{
	
	while(1)
	{
		Nixie(8,8);
		Nixie(7,7);
		Nixie(6,6);
		Nixie(5,5);
		Nixie(4,4);
		Nixie(3,3);
		Nixie(2,2);
		Nixie(1,1);
	}
}

在这里插入图片描述

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

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

相关文章

【从0开始离线数仓项目】——新能源汽车数仓项目介绍

目录 1、数据仓库概念 2、项目需求及架构设计 3、集群资源规划设计 4、车辆日志字段说明 1、数据仓库概念 数据仓库&#xff08;Data Warehouse&#xff09;是为企业提供数据支持&#xff0c;用以协助企业制定决策、改进业务流程和提高产品质量等方面的工具。它可以接收多种…

时间序列预测 | Matlab自回归差分移动平均模型ARIMA时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab自回归差分移动平均模型ARIMA时间序列预测,单列数据输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warnin…

Dart - dill文件序列化为可读文本(续)

文章目录 前言开发环境app.dill文件DEPS文件最后 前言 对前文Dart - dill文件序列化为可读文本做一些补充。 开发环境 macOS: 13.4Dart: 3.0.5Flutter: 3.10.5 app.dill文件 因为Flutter项目编译后会自动生成app.dill文件&#xff08;位于项目根目录下的.dart_tool/flutte…

基于PyQt5的桌面图像调试仿真平台开发(9)去噪

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

Detect-SLAM论文翻译

Detect-SLAM:实现目标检测与SLAM的互利共赢 摘要 - 尽管近年来在SLAM和目标检测方面取得了重大进展&#xff0c;但这两项任务仍然存在一系列挑战&#xff0c;例如动态环境中的SLAM和复杂环境中的目标检测。为了解决这些挑战&#xff0c;我们提出了一种新的机器人视觉系统&…

UE使用UnLua(一)

一、概述 Unlua是个功能丰富的插件&#xff0c;可以在UE中进行蓝图绑定&#xff0c;在Lua中进行逻辑开发&#xff0c;使用Lua热更新的特性&#xff0c;可以快速开发迭代表层逻辑 二、UnLua环境 首先下载UnLua的插件包&#xff0c;点击下载&#xff0c;不会吧不会吧还有人打不…

基于simulink使用前景检测跟踪汽车(附源码)

一、前言 此示例基于simulink演示如何使用高斯混合模型 &#xff08;GMM&#xff09; 检测和计数视频序列中的汽车。 二、模型 下图显示了使用前景检测跟踪汽车模型&#xff1a; 三、检测和跟踪结果 检测和计数汽车可用于分析交通模式。检测也是执行更复杂的任务&#xff0…

【Linux】C++项目实战-实际应用

目录 典型IO的两个阶段(网络IO)Linux上的五种IO模型1.阻塞 blocking2、非阻塞3、IO复用4、信号驱动5、异步 Web ServerHTTP协议&#xff08;应用层的协议&#xff09;简介概述工作原理HTTP请求格式HTTP响应报文格式HTTP请求方法&#xff08;仅作了解&#xff09;HTTP状态码 服务…

【Java|多线程与高并发】死锁以及哲学家吃饭问题

文章目录 1. 什么是死锁2. 哲学家吃饭问题3.如何解决死锁 1. 什么是死锁 死锁&#xff08;Deadlock&#xff09;是多线程编程中的一个常见问题&#xff0c;指的是两个或多个线程相互等待对方释放资源&#xff0c;导致程序无法继续执行的状态。 在一种典型的死锁情况中&#x…

建立点到多点的IPSec隧道(IKE安全策略方式)

目录 1. 组网需求1.1 网络拓扑1.2 配置思路1.3 版本 2. 配置USG5500 A2.1 基本配置2.2 配置域间包过滤规则2.3 配置到达分支的静态路由2.4 定义被保护的数据流2.5 配置名称为tran1的IPSec安全提议2.6 配置序号为10的IKE安全提议2.7 配置IKE Peer2.8 配置IPSec安全策略组map12.9…

哈工大计算机网络课程数据链路层协议详解之:多路访问控制(MAC)协议

哈工大计算机网络课程数据链路层协议详解之&#xff1a;多路访问控制&#xff08;MAC&#xff09;协议 在上一小节介绍完数据链路层功能和所提供的服务后&#xff0c;接下来我们介绍一个在数据链路层非常重要的一个协议&#xff1a;多路访问控制MAC协议。 多路访问控制主要是…

简易登录页面实现

导言 本文将介绍一个简单的登录页面的实现&#xff0c;使用HTML、CSS和JavaScript完成。该登录页面具有选项卡切换和表单提交功能。 HTML基础知识 首先&#xff0c;我们来了解一下HTML文档的基本结构&#xff1a; <!DOCTYPE html> <html> <head><titl…

python创建多个logging日志文件

为每一个计算过程创建一个单独的日志文件&#xff0c;并写入对应的结果&#xff0c;同时保留控制台输出的功能&#xff0c;控制台输出与日志文件记录可以分开单独控制。 import os import loggingdef creat_logger(log_path,logging_name,suf_name):if not os.path.exists(log…

NC65 输出打印模板设置流程

NC65 输出打印模板设置流程 一、添加打印模板 1、可以在单据模板初始化设置中生成打印模板&#xff08;这里以结算单为例&#xff09; 输入模板编码和名称&#xff0c;然后按确定即可。 此时&#xff0c;去输出模板初始化节点查看&#xff0c;就可以查看到刚才生成的打印模…

第五章 中央处理器 第六节指令流水线

5.6.1 指令流水线的概念 5.6.2 指令流水线的影响因素和分类

MySQL基础(五)视图、存储过程和存储函数、变量

目录 常见的数据库对象 ​编辑 视图 创建视图 改变视图 优缺点 存储过程与存储函数 创建存储过程 创建存储函数 存储过程和存储函数的区别 存储过程和函数的查看、修改、删除 查看 修改 删除 存储过程的优缺点 优点 缺点 变量 系统变量 查看系统变量 修改…

h5页面如何与原生交互

本文讲述h5页面跟原生通信&#xff0c;比如在app内&#xff0c;调用相机&#xff0c;获取相册内的图片&#xff0c;在app内拉起微信小程序等等&#xff0c;h5页面没有这么多权限能够直接调用移动端的原生能力&#xff0c;这个时候就需要与原生进行通讯&#xff0c;传递一个信号…

链表、列表、列表项

链表、列表、列表项 FreeRTOS 列表与列表项 List_t //List_t 列表typedef struct xLIST{listFIRST_LIST_INTEGRITY_CHECK_VALUE //校验值volatile UBaseType_t uxNumberOfItems; // 列表中的列表项数量:用于记录列表中列表项的个数&#xff08;不包含 xListEnd&#xff0…

AcWing 1497:树的遍历

【题目来源】https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805485033603072https://www.acwing.com/problem/content/description/1499/【题目描述】 一个二叉树&#xff0c;树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历&#xff0c;…

Verilog 基础知识(一) Verilog 基础语法与注意事项

基础知识 0.1 模块(Module) Verilog中的module可以看成一个具有输入输出端口的黑盒子&#xff0c;该黑盒子有输入和输出接口(信号)&#xff0c;通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数) 图1 模块示意图 0.1.1 模块描述 图1 所示的顶层模块(top…