江协科技/江科大-51单片机入门教程——P[4-1] 静态数码管显示 P[4-2] 动态数码管显示

ops/2025/3/10 22:28:29/

本节将介绍数码管的原理和操作方法,包括静态数码管显示和动态数据管显示

目录

一、静态数码管显示

二、动态数码管显示


一、静态数码管显示

首先,看一下开发板上数码管的位置,它位于左上角,是八个 8 字形的显示器件。同时,138 译码器和右边的 74HC25 都属于数码管操作相关的部分。

在原理图上,数码管及左边的 138 译码器都用于控制数码管显示。

本章节要写的示例代码。

  • 第一个代码是实现在八个数码管上任意位置显示任意数据,演示在第三个位置显示了数字 6。操作数码管时,下面的 595 八个灯和右边的点阵屏可能会乱闪,可将 GP595 跳线帽拔下插到其中一个引脚,断开连接,这样 595 和点阵屏就不会乱闪。
  • 第二个代码的功能是在数码管的前三位显示三个数字 123,此代码实现的是数码管的动态显示,可在数码管任意位置显示任意数字且能多个显示,而第一个代码只能显示一个数字。

下面介绍数码管。我们使用的是 LED 数码管,其内部发光器件为 LED。数码管是一种简单廉价的显示器,在生活中较为常见,它由多个发光二极管分装在一起组成 8 字形器件。例如,显示温度的设备、刷卡机的显示器件以及红绿灯路口的计时显示都使用了数码管,尽管现在红绿灯数码管的一段可能由多个小 LED 组成,但本质操作与本节所学数码管操作相同。

接着看数码管里面的引脚定义。这里有一位数码管和四位一体数码管。

一位数码管由 8 个 LED 组成,其连接方式有两种。上面一种连接方式中,8 个 LED 的阴极都连接到一个端口,称为共阴极连接;下面一种连接方式中,它们的阳极都连在一个引脚,叫共阳极连接。

左下角定义了段的名称,最上面一段叫 a 段,右边顺时针依次为 b、c、d、e、f 段,中间一横叫 g 段,外加一个小数点叫 DP 段,这八个段正好与一个字节的 8 位一一对应,且 51 单片机也是 8 位单片机

引脚序号定义为正视数码管时,左下角引脚为 1 号引脚,逆时针依次为 2 号、3 号等。

每个段对应的引脚位置不同,如 a 段的阳极连接到 3 号和 8 号引脚,阴极连接到 7 号引脚等。在设计电路时,要清楚各段对应的引脚。

要让数码管显示特定数字,以共阴极连接为例,若要显示数字 6,需点亮 a、c、d、e、f、g 段,熄灭其他段。首先将公共端3,8接地(接低电平),选中位选端,再将 a 段等要点亮的段的阳极接高电平,不点亮的段接低电平。这样,给单片机 Io 口输入相应的 8 位数据,再选中公共端,数码管就会显示数字 6,这个 8 位数据就是 LED 的段码(1011 1110)。

若为共阳极连接,显示 6 时公共端接 VCC(高电平),要点亮的段接低电平,不点亮的段接高电平,其段码(0100 0001)与共阴极连接的段码(1011 1110)相反。

开发板上使用的是四位一体数码管,左右各有一个,共 8 位。

它也有引脚序号,从左下角开始为 1 - 12 号引脚,同样有共阴极和共阳极两种连接方式。

与一位数码管相比,多位数码管多分出几个小单元,各单元的公共端单独引出,位选端全部连在一起。

若要在第三位显示数字 1,对于共阴极连接,将第三个公共端给 0,其余给 1,再将 b、c 段给 1,其他段给 0,第三位就会显示数字 1。

由于数码管共用引脚,同一时刻只能有一个数码管被点亮,即使多个被选中,显示的数据也相同,但这种连接方式可节省单片机的 I o口。

若要实现多位同时显示不同数字,需采用动态数码管显示,即利用人眼视觉暂留和数码管显示的余晖原理,快速依次显示不同数字,实现多个数字同时显示的效果。第一个示例代码是静态数码管显示,只能显示一位数字。

再看原理图部分。板子上除数码管外,还有 74LS138(开发板上接的是 74HC138)译码器和 74HC245 双向数据缓冲器。

74LS138 译码器可将 8 个端口用 3 个端口控制,其输入端为 A、B、C,输出端为 Y0 - Y7,芯片需接电源,左下角三个引脚为使能端,将 G1 接高电平,G2A、G2B 接低电平,芯片上电即可工作。

三个输入端(CBA,C为高位)输入的数据转化为十进制数,对应输出端的引脚为低电平有效。例如,输入 000 时,Y0 输出 0,其他为 1;输入 001 时,Y1 输出 0,其他为 1 等。要注意输出端与数码管的连接存在错位,如 Y0 接的是 LED1 等。通过给 A、B、C 输入数据,可选中某个数码管,再给其段码端数据,就能显示相应数字。

双向数据缓冲器 74HC245 用于数据缓冲,其内部线路 A0 到 B0 等是连接关系,还有控制引脚。OE 引脚为芯片使能端,低电平有效,直接接地。dir 引脚控制数据传输方向,开发板上跳线帽将其接高电平,使数据从左边 P0 口送到右边。加缓冲器是因为单片机高电平驱动能力有限,通过缓冲器可提高驱动能力,使数码管显示更亮。

此外,电路中还有电容和排阻。电容标注为 104(10 0000pF,100nF),其容量为 0.1 微法,用于稳定电源,起到电源滤波的作用。排阻是四个电阻一体的,电阻值为 100 欧姆,作用是限流,防止数码管电流过大,采用排阻比使用 8 个独立电阻更便捷。

使某一位数码管显示数据的步骤为:

第一步,通过控制 P2 口的三个引脚,使某一位输出 0 选中;

第二步,给 P0 口一个段码数据,经过缓冲后送到公共段码端,数码管即可显示相应数据。

在开始写代码之前,介绍 C 语言的两个重要知识点:数组和子函数。

数组是将相同类型的一系列数据统一编制到一个组别中,可通过数组名加索引快速操作大量数据。数组的定义方法有直接定义和定义并初始化两种,引用数组数据时要注意从 0 开始,避免数组越界,因为 C 语言编译器对数组越界不报错,但程序会出错。

子函数是将完成某一种功能的程序代码单独抽取出来形成一个模块,可在其他函数中随时调用,目的是实现代码复用和优化程序结构。子函数的定义包括返回值类型、函数名、形参列表和函数体。无返回值的子函数调用时直接写函数名加括号;有参数的子函数调用时要传递相应参数;有返回值的子函数在函数末尾需加 return 语句,调用时可将返回值赋给一个变量。

下面开始写本节的示例代码。

打开软件,新建工程,命名为 4 - 1 静态数码管显示,选择 at89c52 芯片,添加主函数并写出基本框架。

若要在第三位显示 6,先让 LED6 输出低电平,即让 Y5 输出低电平,将 6 转化为二进制 101,分别给 P2 的三个引脚赋值。

再给 P0 口段码数据,显示 6 的段码为:二进制为0111 1101(数据的高位对应标号的高位),十六进制为 7D,编译并下载代码,第三位就会显示 6。

若要在第四位显示 6,将 Y4 对应的二进制 100 赋值给 P2 的三个引脚即可。

为优化程序结构,将数码管某一位显示某一个数字的功能封装成子函数。

子函数名为 “Nixie(数码管显示)”,有两个参数,分别是位置(Location)和显示的数字(Number)。

在子函数内部,根据位置使用 switch case 语句判断并给 P2 的三个引脚赋值

同时使用数组存储数码管的段码,根据显示的数字从数组中取出相应段码赋给 P0 口。

通过调用该子函数,可在数码管的任意位置显示任意数字,而无需关注子函数内部的实现细节,从而达到优化程序结构的目的。

程序代码如下:

#include//数码管段码表unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9//数码管显示子函数void Nixie(unsigned char Location,Number){switch(Location) //位码输出{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=NixieTable[Number]; //段码输出}void main(){Nixie(2,3); //在数码管的第2位置显示3while(1){}}

二、动态数码管显示

接下来开始编写动态数码管显示的代码,其目的是实现数码管多位不同位置显示不同数字,显示不同数字后可用于显示数据,在调试程序时十分方便。有了一位数码管显示的基础,多位数码管动态显示便近在咫尺。

首先新建一个工程,创建名为 “4 - 2” 的文件夹,写入工程名,选择单片机类型,添加主函数。接着将上一节的代码复制过来。

上一个代码实现的是显示一位,而动态数码管显示需要不断扫描,这是一个循环过程,所以要将相关内容挪到 while(1) 循环里,并复制几段。例如,让第一位显示 1,第二位显示 2,第三位显示 3。

为方便观察现象,先添加一个 1 毫秒的通用延时函数

可从之前工程复制过来并进行改造,调用该延时函数,让每显示一位数字后延时 200 毫秒,再复制相关内容以实现不同位显示不同数字。

编译代码时需勾选相关选项,切换到新代码后进行下载,此时会看到数码管一位一位地显示 123。

若将延时时间改短,如改为 20 毫秒,数码管闪烁会更快;若将延时代码注释掉,可利用注释和解除注释功能方便调试代码。

此时虽显示 123,但位置会错乱,如 3 显示在第一位,2 显示在第四位,这是数码管常见的 “消影” 问题。

数码管显示有位选和段选过程,由于单片机速度快,选中下一位的短时间内,上一位数据会串到下一位,导致显示数据串位。

为避免此问题,需在上一个段选之后先将段选清零,在代码中显示后先延时 1 毫秒让其稳定显示,再将 P0 赋值为 0X00,重新编译下载后,数码管显示的 123 就不会串位了。

程序代码如下:

#include//数码管段码表unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//延时子函数void Delay(unsigned int xms){unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}}//数码管显示子函数void Nixie(unsigned char Location,Number){switch(Location) //位码输出{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=NixieTable[Number]; //段码输出Delay(1); //显示一段时间P0=0x00; //段码清0,消影}void main(){while(1){Nixie(1,1); //在数码管的第1位置显示1// Delay(20);Nixie(2,2); //在数码管的第2位置显示2// Delay(20);Nixie(3,3); //在数码管的第3位置显示3// Delay(20);}}

数码管动态显示的代码讲解至此,下面总结数码管的驱动方式。

有两种驱动方式,一种是单片机直接扫描,当前代码就属于这种方式。数码管常需显示多位数据,涉及动态扫描,即不断送数据、刷新。这种扫描方式硬件设备简单,只需单片机,无需复杂电路,但会消耗大量单片机 CPU 时间,一旦程序阻塞,数码管就会闪烁或熄灭。

另一种是使用专用驱动芯片,如 TM1640,其内部自带显存扫描电路,单片机只需通过两根通信线,按照规定的通信协议告诉它显示什么,它就会自行扫描数码管,不会出现闪烁问题,该芯片用两根线就能控制 16 个数码管显示任意数字。还有一种 74HC595 移位寄存器模块(右边),通过三根数据线和两根电源线可控制 8 个数码管,虽也需单片机扫描、耗费 CPU 时间,但能大幅节省单片机 I/O 口。若自行设计,更推荐使用 TM1640 驱动数码管,因其使用方便,且不会出现闪烁、不显示等问题。


http://www.ppmy.cn/ops/164775.html

相关文章

Navigation的进阶知识与拦截器配置

Navigation的进阶知识与拦截器配置 写的不是很详细,后续有时间会补充,建议参考官方文档食用 1.如何配置路由信息 1.1 创建工程结构 src/main/ets ├── pages │ └── navigation │ ├── views │ │ ├── Mine.ets //…

laravel es 相关代码 ElasticSearch

来源&#xff1a; github <?phpnamespace App\Http\Controllers;use Elastic\Elasticsearch\ClientBuilder; use Illuminate\Support\Facades\DB;class ElasticSearch extends Controller {public $client null;public function __construct(){$this->client ClientB…

【RAG】基于向量检索的 RAG (BGE示例)

RAG机器人 结构体 文本向量化: 使用 BGE 模型将文档和查询编码为向量。 &#xff08;BGE 是专为检索任务优化的开源 Embedding 模型&#xff0c;除了本文API调用&#xff0c;也可以通过Hugging Face 本地部署BGE 开源模型&#xff09; 向量检索: 从数据库中找到与查询相关的文…

HTML 插入图片(简单易懂较详细)

在 HTML 中&#xff0c;插入图片是通过 <img> 标签实现的。<img> 标签是一个空标签&#xff0c;意味着它不需要闭合标签。以下是插入图片的基本语法和常用属性的详细讲解。 一、基本语法 <img src"图片路径" alt"替代文本">src&#x…

使用Wireshark截取并解密摄像头画面

在物联网&#xff08;IoT&#xff09;设备普及的今天&#xff0c;安全摄像头等智能设备在追求便捷的同时&#xff0c;往往忽视了数据传输过程中的加密保护。很多摄像头默认通过 HTTP 协议传输数据&#xff0c;而非加密的 HTTPS&#xff0c;从而给潜在攻击者留下了可乘之机。本文…

Calico-BGP FullMesh模式与RR模式 Day04

1. BGP协议简单介绍 BGP是什么&#xff1f;BGP是如何工作的&#xff1f; - 华为 Configure BGP peering | Calico Documentation 1.1 什么是BGP 边界网关协议&#xff08;BGP&#xff09;是一种用于在网络中的路由器之间交换路由信息的标准协议。每台运行 BGP 的路由器都有一…

SAP HANA Merge

在SAP HANA数据库中&#xff0c;数据表都分为两个区域&#xff1a;Main Store和Delta Store。Main Store中的数据经过高压缩处理&#xff0c;查询和计算效率高&#xff0c;但写入成本高&#xff1b;而Delta Store则是为写入优化的区域&#xff0c;数据会定期从Delta Store合并到…

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…