当前位置: 首页 > news >正文

普中51单片机:数码管显示原理与实现详解(四)

在这里插入图片描述

文章目录

  • 引言
  • 数码管的结构
  • 数码管的工作原理
  • 静态数码管
    • 电路图
    • 开发板IO连接图
    • 代码演示
  • 动态数码管
    • 实现步骤
    • 数码管驱动方式
    • 电路图
    • 开发板IO连接图
    • 真值表
    • 代码演示1
    • 代码演示2
    • 代码演示3

引言

数码管(Seven-Segment Display)是一种常见的显示设备,广泛应用于电子时钟、计算器、家电和其他数字设备中。数码管由七个独立的LED段组成,排列成一个类似数字“8”的形状。通过控制这些LED段的开关状态,可以显示0到9的数字及一些字母和符号。同时也称为LED数码管。
在这里插入图片描述

数码管的结构

一个标准的七段数码管包括七个LED段,每个段用一个字母表示,从A到G。另外,有些数码管还包括一个小数点(DP),被称为八段数码管,用于显示小数或分隔不同的数字。

						  --A--			  --A--|     |		 |     |F     B		 F     B|     |		 |     |--G--			  --G--|     |		 |     |E     C		 E     C|     |		 |     |--D--			  --D-- • DP

数码管的工作原理

数码管的每个段实际上是一个独立的LED,通过控制各个LED的通断状态,可以组合成不同的字符。数码管通常有两种连接方式:共阳极和共阴极

  1. 共阳极数码管:所有的LED阳极(正极)连接在一起,通常接到电源正极。点亮某个段时,需将相应的段的阴极(负极)接地 GND。
  2. 共阴极数码管:所有的LED阴极(负极)连接在一起,通常接地。点亮某个段时,需将相应的段的阳极(正极)接电源正极。

请添加图片描述

静态数码管

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持直到送入新字形码为止。

电路图

从资料中提供的电路图可知,此开发板静态数码管使用的是共阳极数码管,如果使用共阴数码管,为了不影响其他IO口的电流,要增加IO口的驱动电路,单片机主要是用来控制的,如果要驱动一些外部的设备,通常会使用专门的驱动电路,比如74HC245芯片,74HC573芯片。
在这里插入图片描述

开发板IO连接图

请添加图片描述

代码演示

控制静态数码管显示数字0,即让P0口端口输出数字0的段码0x3F(共阴,共阳极取反即可),其他数字可根据连接方式自行计算。

#include <REGX52.H>#define SMG_STATIC P0void main()
{SMG_STATIC = ~0x3f;while(1){}
}

动态数码管

动态数码管显示,也称为动态扫描显示,是通过快速轮流点亮各个位数码管来实现的。利用人眼的视觉暂留效应,使人感觉所有数码管同时显示不同的数字。

实现步骤

  1. 段选和位选:将所有位数码管的段选线并联在一起,通过位选控制哪一位数码管有效。
  2. 轮流显示:轮流向各个位数码管送出字型码和相应的位选信号。由于切换速度很快,人眼无法分辨出切换过程,从而感觉所有数码管同时显示。
  3. 消影处理:在切换位选信号之前,先将段选信号清零,防止残影现象。

数码管驱动方式

  1. 单片机直接扫描:硬件设备简单,但会消耗大量的单片机CPU时间。
  2. 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。如:TM1640芯片、74HC595

电路图

请添加图片描述
由电路图可知,该开发板的动态数码管是由两个4位一体数码管组成的,一共八个数码管,它们的公共端单独引出来,位选段全部并联在一起,动态进行显示,采用的是共阴极。

八个公共端同一个时刻,只有一个数码管可以点亮,因为位选段是并联在一起的,所以即使有多个公共端同一个时刻被点亮,数码管显示的数据也是相同的。可以利用人眼视觉暂留和余晖效应进行延时操作即可!

动态数码管要搭配74H138模块74H245

  • 74H138:一种常用的 3 线到 8 线译码器芯片,主要用于地址解码、数据路由和逻辑控制。它可以将输入的三位二进制代码转换成八位的输出,常用于单片机系统中进行 I/O 扩展。即三个输入端操作8个输出端,具体操作方法可查看真值表。
    在这里插入图片描述

    • 输入端:A0、A1、A2 为三位二进制加权地址输入端口。
    • 输出端:Y0 至 Y7 为八个输出端口。
    • 使能端:E1 和 E2 为低有效,E3 为高有效。只有当 E1 和 E2 置低且 E3 置高时(默认),芯片才会工作
  • 74H245:一种常用的双向总线缓冲器芯片,防止信号干扰。可以将高电平信号转换为低电平信号,或将低电平信号转换为高电平信号,确保不同电平逻辑设备之间的兼容性。它能够隔离不同总线之间的电平差异和噪声干扰,确保数据的可靠传输。

开发板IO连接图

请添加图片描述

74H138的A0(A)与P22相连;A1(B)与P23相连;A2(C)与P24相连(真值表)

真值表

在这里插入图片描述
L表示0(低电平),H表示1(高电平)

代码演示1

根据真值表操作第五个LED数码管,显示数字6,Init_Port()函数用于操作操作真值表,为了方便对比,这里保留了静态数码管的代码。

#include <REGX52.H>#define SMG_STATIC P0void Init_Port()
{P2_2 = 0;P2_3 = 0;P2_4 = 1;
}void main()
{Init_Port();//显示LED数码管5SMG_STATIC = ~0x7d;P1 = 0x7d;while(1){}
}

代码演示2

动态数码管延时循环显示数字6,如果需要循环显示数字1到数字8,定义数组即可。

#include <REGX52.H>#define SMG_STATIC P0void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void Init_Port(unsigned char Location)
{switch(Location){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;}
}void main()
{unsigned char i;SMG_STATIC = ~0x7d;while(1){for(i = 1; i <= 8;i++){Init_Port(i);P1 = 0x7d;DelayXms(1000);}}
}

代码演示3

利用余晖效应,动态持续的显示数字1到8,P1 = 0x00; 这一行用于消影。消影的作用是防止数码管显示的残影现象。具体来说,当你在多位数码管上显示不同的数字时,如果不及时清除前一个数字的显示,可能会出现残影,即前一个数字的部分段码仍然亮着,影响当前数字的显示效果。通过在每次显示完一个数字后,将 P1 置为 0x00,可以确保所有段码都熄灭,从而避免残影现象,确保每次显示的数字都是清晰且正确的。

#include <REGX52.H>#define SMG_STATIC P0//共阴极数码管显示 0~F 的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void Init_Port(unsigned char Location)
{switch(Location){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;}
}void main()
{unsigned char i;SMG_STATIC = ~0x7d;while(1){for(i = 1; i <= 8;i++){Init_Port(i);P1 = gsmg_code[i];DelayXms(1);P1 = 0x00;//消影}}
}

相关文章:

普中51单片机:数码管显示原理与实现详解(四)

文章目录 引言数码管的结构数码管的工作原理静态数码管电路图开发板IO连接图代码演示 动态数码管实现步骤数码管驱动方式电路图开发板IO连接图真值表代码演示1代码演示2代码演示3 引言 数码管&#xff08;Seven-Segment Display&#xff09;是一种常见的显示设备&#xff0c;广…...

web缓存代理服务器

一、web缓存代理 web代理的工作机制 代理服务器是一个位于客户端和原始&#xff08;资源&#xff09;服务器之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理服务器发送一个请求&#xff0c;并指定目标原始服务器&#xff0c;然后代理服务器向原始…...

容器:queue(队列)

以下是关于queue容器的总结 1、构造函数&#xff1a;queue [queueName] 2、添加、删除元素: push() 、pop() 3、获取队头/队尾元素&#xff1a;front()、back() 4、获取栈的大小&#xff1a;size() 5、判断栈是否为空&#xff1a;empty() #include <iostream> #include …...

探索 WebKit 的后台同步新纪元:Web Periodic Background Synchronization 深度解析

探索 WebKit 的后台同步新纪元&#xff1a;Web Periodic Background Synchronization 深度解析 随着 Web 应用逐渐成为我们日常生活中不可或缺的一部分&#xff0c;用户对应用的响应速度和可靠性有了更高的期待。Web Periodic Background Synchronization API&#xff08;周期…...

ctfshow web入门 web338--web344

web338 原型链污染 comman.js module.exports {copy:copy };function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] object2[key]}}}login.js var express …...

mupdf加载PDF显示中文乱码

现象 加载PDF显示乱码,提示非嵌入字体 non-embedded font using identity encoding调式 在pdf-font.c中加载字体 调试源码发现pdf文档的字体名字居然是GBK&#xff0c;估计又是哪个windows下写的pdf生成工具生成pdf 字体方法&#xff1a; static pdf_font_desc * load_cid…...

常用的限流工具Guava RateLimiter 或Redisson RRateLimiter

在分布式系统和高并发场景中&#xff0c;限流是一个非常常见且重要的需求。以下是一些常用的限流工具和库&#xff0c;包括它们的特点和使用场景&#xff1a; 1. Guava RateLimiter Google 的 Guava 库中的 RateLimiter 是一个简单且高效的限流工具&#xff0c;适用于单节点应…...

卷积神经网络(CNN)和循环神经网络(RNN) 的区别与联系

卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;是两种广泛应用于深度学习的神经网络架构&#xff0c;它们在设计理念和应用领域上有显著区别&#xff0c;但也存在一些联系。 ### 卷积神经网络&#xff08;CNN&#xff09; #### 主要特点…...

Unity【入门】场景切换和游戏退出及准备

1、必备知识点场景切换和游戏退出 文章目录 1、必备知识点场景切换和游戏退出1、场景切换2、鼠标隐藏锁定相关3、随机数和自带委托4、模型资源的导入1、模型由什么构成2、Unity支持的模型格式3、如何指导美术同学导出模型4、学习阶段在哪里获取模型资源 2、小项目准备工作需求分…...

Python 函数递归

以下是一个使用递归计算阶乘的 Python 函数示例 &#xff1a; 应用场景&#xff1a; 1. 动态规划问题&#xff1a;在一些需要逐步求解子问题并利用其结果的动态规划场景中&#xff0c;递归可以帮助直观地表达问题的分解和求解过程。 2. 遍历具有递归结构的数据&#xff1a;如递…...

MyBatis(27)如何配置 MyBatis 实现打印可执行的 SQL 语句

在开发过程中&#xff0c;打印可执行的SQL语句对于调试和性能优化是非常有帮助的。MyBatis提供了几种方式来实现SQL语句的打印。 1. 使用日志框架 MyBatis可以通过配置其内部使用的日志框架&#xff08;如Log4j、Logback等&#xff09;来打印SQL语句。这是最常用的方法。 Lo…...

3.js - 裁剪平面(clipIntersection:交集、并集)

看图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import …...

在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;波兰洛迪} 本文讨…...

Perl 数据类型

Perl 数据类型 Perl 是一种功能丰富的编程语言&#xff0c;广泛应用于系统管理、网络编程、GUI 开发等领域。在 Perl 中&#xff0c;数据类型是编程的基础&#xff0c;决定了变量存储信息的方式以及可以对这些信息执行的操作。本文将详细介绍 Perl 中的主要数据类型&#xff0…...

网络协议 -- IP、ICMP、TCP、UDP字段解析

网络协议报文解析及工具使用介绍 1. 以太网帧格式及各字段作用 -------------------------------- | Destination MAC Address (48 bits) | -------------------------------- | Source MAC Address (48 bits) …...

【工具】豆瓣自动回贴软件

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 相比于之前粗糙丑陋的黑命令框版本&#xff0c;这个版本新增了UI界面&#xff0c;从此可以不需要再挨个去翻配置文件了。 另外&#xff0c;升级了隐藏浏…...

初学Spring之动态代理模式

动态代理和静态代理角色一样 动态代理的代理类是动态生成的 动态代理分为两大类&#xff1a; 基于接口的动态代理&#xff08;JDK 动态代理&#xff09;、基于类的动态代理&#xff08;cglib&#xff09; 也可以用 Java 字节码实现&#xff08;Javassist&#xff09; Prox…...

Visual studio 2023下使用 installer projects 打包C#程序并创建 CustomAction 类

Visual studio 2023下使用 installer projects 打包C#程序并创建 CustomAction 类 1 安装Visual studio 20203,并安装插件1.1 下载并安装 Visual Studio1.2 步骤二:安装 installer projects 扩展插件2 创建安装项目2.1 创建Windows安装项目2.2 新建应用程序安装文件夹2.3 添加…...

vue学习笔记(购物车小案例)

用一个简单的购物车demo来回顾一下其中需要注意的细节。 先看一下最终效果 功能&#xff1a; &#xff08;1&#xff09;全选按钮和下面的商品项的选中状态同步&#xff0c;当下面的商品全部选中时&#xff0c;全选勾选&#xff0c;反之&#xff0c;则不勾选。 &#xff08…...

昇思25天学习打卡营第19天 | RNN实现情感分类

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This fil…...

【VUE基础】VUE3第三节—核心语法之ref标签、props

ref标签 作用&#xff1a;用于注册模板引用。 用在普通DOM标签上&#xff0c;获取的是DOM节点。 用在组件标签上&#xff0c;获取的是组件实例对象。 用在普通DOM标签上&#xff1a; <template><div class"person"><h1 ref"title1">…...

生物化学笔记:电阻抗基础+电化学阻抗谱EIS+电化学系统频率响应分析

视频教程地址 引言 方法介绍 稳定&#xff1a;撤去扰动会到原始状态&#xff0c;反之不稳定&#xff0c;还有近似稳定的 阻抗谱图形&#xff08;Nyquist和Bode图&#xff09; 阻抗谱图形是用于分析电化学系统和材料的工具&#xff0c;主要有两种类型&#xff1a;Nyquist图和B…...

SQL使用join查询方式找出没有分类的电影id以及名称

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 现有电影信息…...

对MsgPack与JSON进行序列化的效率比较

序列化是将对象转换为字节流的过程&#xff0c;以便在内存或磁盘上存储。常见的序列化方法包括MsgPack和JSON。以下将详细探讨MsgPack和JSON在序列化效率方面的差异。 1. MsgPack的效率&#xff1a; 优点&#xff1a; 高压缩率&#xff1a; MsgPack采用高效的二进制编码格式&…...

Unix\Linux 执行shell报错:“$‘\r‘: 未找到命令” 解决

linux执行脚本sh xxx.sh报错&#xff1a;$xxx\r: 未找到命令 原因&#xff1a;shell脚本在Windows编写导致的换行问题&#xff1a; Windows 的换行符号为 CRLF&#xff08;\r\n&#xff09;&#xff0c;而 Unix\Linux 为 LF&#xff08;\n&#xff09;。 缩写全称ASCII转义说…...

动态路由--RIP配置(思科cisco)

一、简介 RIP协议&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的动态路由选择协议。 在RIP协议中&#xff0c;如果路由器A和网络B直接相连&#xff0c;那么路由器A到网络B的距离被定义为1跳。若从路由器A出发到达网络B需要…...

python - 函数 / 字典 / 集合

一.函数 形参和实参&#xff1a; >>> def MyFirstFunction(name): 函数定义过程中的name是叫形参 ... print(传递进来的 name 叫做实参&#xff0c;因为Ta是具体的参数值&#xff01;) print前面要加缩进tab&#xff0c;否则会出错。 >>> MyFirstFun…...

connect to github中personal access token生成token方法

一、问题 执行git push时弹出以下提示框 二、解决方法 去github官网生成Token&#xff0c;步骤如下 选择要授予此 令牌token 的 范围 或 权限 要使用 token 从命令行访问仓库&#xff0c;请选择 repo 。 要使用 token 从命令行删除仓库&#xff0c;请选择 delete_repo 其他根…...

Appium启动APP时报错Security exception: Permission Denial

报错内容Security exception: Permission Denial: starting Intent 直接通过am命令尝试也是同样的报错 查阅资料了解到&#xff1a;android:exported | App quality | Android Developers exported属性默认false&#xff0c;所以android:exported"false"修改为t…...

ubuntu22 使用ufw防火墙

专栏总目录 一、安装 sudo apt update sudo apt install ufw 二、启动防火墙 &#xff08;一&#xff09;启动命令 sudo ufw enable &#xff08;二&#xff09;重启命令 sudo ufw reload 三、配置规则 #允许SSH连接 sudo ufw allow ssh #如果sshd服务端口指定到了8888&a…...