【51单片机】数码管的静态与动态显示(含消影)

news2024/11/23 5:03:30

数码管在现实生活里是非常常见的设备,例如在这里插入图片描述
这些数字的显示都是数码管的应用。

目录

  • 静态数码管:
    • 器件介绍:
      • 数码管的使用:
      • 译码器的使用:
      • 缓冲器:
    • 实现原理:
    • 完整代码:
  • 动态数码管:
    • 消影:
    • 完整代码:

静态数码管:

器件介绍:

在这里插入图片描述
注意:数码管有共阴共阳的区分。
在这里插入图片描述
在自己设计电路时,应当选用一种数码管时需要选用相应的译码器(共阴配共阴,共阳同理)


数码管的使用:

数码管其实就是一段一段LED构成的,51单片机使用的是共阴数码管,即图中的上侧表示,其中的标号怎样理解呢?
在这里插入图片描述
3和8为一个端子引出去的两个引脚,都是接地,
其余引脚的虽然右图看似杂乱无章,实则有点就近原则的意思,一个引脚控制一段LED,从上侧左图就可以看出。


但是这是一个数码管,51单片基中的数码管是下图这样的
看着复杂,无非就是多了7个共阴端,这时我们就需要译码器来进行选择哪个管子亮,这个过程叫做位选
在这里插入图片描述
在学习数电时,会接触到译码器,其中最经典的就是138译码器

译码器的使用:

大概说一下它的功能,
使能端让译码器正常工作情况下(51单片机的译码器可以看到三个使能端已经达到此效果),我们通过输入端A B C来进行控制Y端子的输出,每次输出一位有效,有效的会输出0
正好符合我们共阴的配置,一次可以选择一个数码管的亮灭1在这里插入图片描述


缓冲器:

选择完管子,就轮到每个管子应该输出什么数字了,
这个过程叫做段选
回到这张图片,我们发现每个管子的数字是通过P0端来实现显示数字
74HC245的作用主要是缓冲,增加电流,让灯更亮,
电阻的作用是限流,防止烧坏
在这里插入图片描述

实现原理:

元器件的使用知道了,现在就可以操作了
现在梳理一下流程

  1. 通过译码器控制指定的管子亮灭
  2. 控制P0寄存器控制显示的数字

技巧:

在需要一个实现固定功能的代码情况下,可以将其封装成一个函数,使用时更方便,便捷

我们这里就选择将控制第几个灯亮,显示什么数字的功能封装成一个函数

注意:

赋值时应当注意译码器的高低位等器件的高低位,防止最后的结果不符合预期

#include <REGX52.H>
//延时函数
void Delay(unsigned char xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };

//loc代表选择灯亮的位置,num代表你要显示的数字
void NixieTube(unsigned char loc, num)
{
	switch(loc)
	{
		case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
		case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
		case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
		case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
		case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
		case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
		case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
		case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}
	//数字的显示通过数组,我们再控制LED灯时普遍喜欢用数组实现
	P0 = arr[num];
}

完整代码:

#include <REGX52.H>

void Delay(unsigned char xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };

void NixieTube(unsigned char loc, num)
{
	switch(loc)
	{
		case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
		case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
		case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
		case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
		case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
		case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
		case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
		case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}
	P0 = arr[num];
}

void main()
{
	NixieTube(1, 1);
	
	while(1)
	{	
	}
}

动态数码管:

先来科普一下:

动态数码管不是动态的显示数字(表面理解),而是一次显示多个数字

有了以上的基础,动态数码管可谓是信手拈来
我们将封装好的函数放在while(1)循环中,在循环中放入你想控制的位置与数字

消影:

运行后发现会有重影的现象在这里插入图片描述
产生原因:
我们静态显示一个数码管时是位选–>段选,最后死循环完成的,
但是动态的显示的顺序是 位选 -->段选–>位选–>段选–>位选 这样循环,而问题就出现在段选–>位选这里,因单片机的速度非常快,导致上一次的段选与下一次的位选相结合,造成了重影

消影方法:
对封装好的函数进行一点改进,
现状态稳定1ms,在次状态开始前进行清0的操作

void NixieTube(unsigned char loc, num)
{
	switch(loc)
	{
		case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
		case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
		case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
		case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
		case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
		case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
		case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
		case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}
	P0 = arr[num];
	Delay(1);
	P0 = 0x00;
}

完整代码:

#include <REGX52.H>

void Delay(unsigned char xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };

void NixieTube(unsigned char loc, num)
{
	switch(loc)
	{
		case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
		case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
		case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
		case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
		case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
		case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
		case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
		case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}
	P0 = arr[num];
	Delay(1);
	P0 = 0x00;
}

void main()
{
	while(1)
	{	
		NixieTube(1, 1);
		NixieTube(2, 2);
		NixieTube(3, 3);
	}
}

有不好的地方尽情留言

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

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

相关文章

Linux Shell脚本入门

目录 介绍 编写格式与执行方式 Shell脚本文件编写规范 脚本文件后缀名规范 首行格式规范 注释格式 shell脚本HelloWord入门案例 需求 效果 实现步骤 脚本文件的常用执行三种方式 介绍 3种方式的区别 小结 多命令处理 Shell变量 环境变量 目标 Shell变量的介绍 变量类型 系统环境…

Java 方法中参数类型后写了三个点?什么意思?

1、...代表什么意思&#xff1f; 2、如何使用 3、注意事项 4、两个list&#xff0c;一个新的&#xff0c;一个旧的&#xff0c;旧列表中可能有新列表中存在的数据&#xff0c;也可能存在新列表中不存在的数据&#xff08;注&#xff1a;新旧列表中都不存在重复元素&#xff09;…

【数据结构】堆:堆的构建,堆的向上调整算法,堆的向下调整算法、堆排序

目录 一、堆的定义 1、堆的定义&#xff1a; 2、根节点与其左、右孩子间的联系 二、堆的创建 1、堆的向下调整算法 2、堆的向上调整算法 三、堆排序 一、堆的定义 1、堆的定义&#xff1a; 堆可以被看作是一棵完全二叉树的数组对象。即在存储结构上是数组&#xff0c…

2024 年 10 款最佳 Windows 免费分区管理器软件

买了一台现成的全新电脑&#xff0c;出于多种原因希望对硬盘进行分区&#xff0c;例如&#xff0c;为了更好地组织文件。我们整理了一份最佳分区软件列表&#xff0c;可以帮助您轻松完成这项任务。 适用于 Windows 11/10/8.1/8/7 的最佳 10 个磁盘分区工具 1.奇客分区大师 兼容…

vue3自定义按钮点击变颜色(切换)

实现效果图&#xff1a; 默认选中第一个按钮&#xff0c;未选中按钮为粉色&#xff0c;点击时颜色变为红色 利用动态类名&#xff0c;当定义isChange数值和下标index相同时&#xff0c;赋予act类名&#xff0c;实现变色效果 <template><view class"page"&g…

FPGA 多路分频器实验

1 概述 在 FPGA 中&#xff0c;时钟分频是经常用到的。本节课讲解 2 分频、3 分频、4 分频和 8 分频的 Verilog 实现并且学习 generate 语法功能的应。 2 程序设计思路 1&#xff09;整数倍分频&#xff0c;为 2、4、8&#xff0c;这种 2^n 次方倍数倍数关系的…

Spring Security 中 Authentication和Authorization的区别

Authentication Spring Security提供了全面的认证支持。认证是用来验证试图访问特定资源的用户身份的方式。验证用户的常见方式是要求用户输入用户名和密码。一旦认证完成&#xff0c;我们就知道了用户的身份并且可以进行授权。 Spring Security内置支持对用户进行认证。 简…

el-date-picker如果超过限制跨度则提示

需求&#xff1a;实现日期时间选择组件跨度如果超过限制天数&#xff0c;点击查询则提示超过限制时间 封装一个方法&#xff0c;传入开始和结束时间以及限制天数&#xff0c;如果超过则返回false //计算时间跨度是否超过限制天数isTimeSpanWithinLimit(startTime, endTime, li…

Android Text View 去掉默认的padding的实现方法

先看下最终实现效果&#xff0c;满意您在往下看&#xff1a; TextView 绘制的时候自带一定的Padding值&#xff0c;要想实现去掉默认的padding值&#xff0c;xml文件可以设置一个属性值 &#xff1a; android:includeFontPadding"false" 然后运行起来就会发现&…

【C++干货铺】红黑树 (Red Black Tree)

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 红黑树的插入操作 插入新的结点 检查规则进行改色 情况一 情况二 情况三 插入完整代码 红黑树的验…

ArcGIS Pro 如何新建布局

你是否已经习惯了在ArcGIS中数据视图和布局视图之间来回切换&#xff0c;到了ArcGIS Pro中却找不到二者之间切换的按钮&#xff0c;即使新建布局后却发现地图怎么却是一片空白。 这一切的一切都是因为ArcGIS Pro的功能框架完全不同&#xff0c;这里为大家介绍一下在ArcGIS Pro…

纸黄金实战投资技巧:避免亏损的有效策略

在纸黄金交易的实战中&#xff0c;避免亏损是每位投资者都追求的目标。虽然任何投资都存在一定的风险&#xff0c;但采取一些有效的策略可以帮助投资者最大限度地减少亏损的可能性。以下是一些在纸黄金交易中避免亏损的实战技巧&#xff1a; 一、设定止损点是避免亏损的关键 止…

【Android】自定义View onDraw()方法会调用两次

问题 自定义了View后&#xff0c;在构造函数中设置画笔颜色&#xff0c;发现它没起效&#xff0c;但是在onDraw()里设置颜色就会起效&#xff0c;出问题的代码如下&#xff1a; public RoundSeekbarView(Context context, Nullable AttributeSet attrs) {super(context, attrs…

dubbo入门案例!!!

入门案例之前我们先介绍一下&#xff1a;zookeeper。 Zookeeper是Apacahe Hadoop的子项目&#xff0c;可以为分布式应用程序协调服务&#xff0c;适合作为Dubbo服务的注册中心&#xff0c;负责服务地址的注册与查找&#xff0c;相当于目录服务&#xff0c;服务提供者和消费者只…

考下初级会计证书,好处竟有这么多!柯桥学会计去哪里?零基础入门手把手教学

初级会计证书有什么用&#xff1f; 初级会计证书有什么用&#xff1f;往下看&#xff0c;看完还没报名的建议大家赶紧报名&#xff0c;今年拿下&#xff01;因为初级会计证书真的很有用&#xff01; 01 求职刚需 初级会计是会计职业的起点&#xff0c;很多会计基础岗位&#x…

rust跟我学六:虚拟机检测

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎么检测是否在虚拟机里运行的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:…

关于Jenkins安装后,插件管理中插件版本依赖报错问题的解决方法

我们在初次安装完Jenkins后&#xff0c;通常会去下载要使用的插件&#xff0c;但是在插件管理中通常会出现插件版本问题的提示&#xff0c;例如&#xff1a; 此类问题一般可通过升级Jenkins到最新版本来解决问题。但是Jenkins从旧版本升级到最新版本&#xff0c;望望可能会连…

redis安装-Linux为例

可以下载一个Shell或者MobaXterm工具&#xff0c;便于操作 在redis官网下载压缩包 开始安装 安装依赖 yum install -y gcc tcl切换目录 切换目录后直接把redis安装包拖到/user/local/src/下 cd /user/local/src/解压然后安装 #解压 tar -zxvf redis-7.2.4.tar.gz #安装 …

并发编程之MESI缓存一致性协议

目录 CPU缓存架构 CPU多核缓存架构 CPU缓存架构缓存一致性的解决方案 缓存一致性协议实现原理 总线窥探 工作原理 窥探协议类型 缓存一致性协议 MESI协议 伪共享问题 CPU缓存架构 CPU缓存即高速缓冲存储器&#xff0c;是位于CPU与主内存间的一种容量较小但速度很高的…

如何在MinIO存储服务中通过Buckets实现远程访问管理界面上传文件

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…