51单片机 (七)数码管

news/2025/1/8 19:45:52/

数码管介绍:

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。

        一个数码管是由八个二极管所组成的,我们分别给它命名为 a、b、c、d、e、 f、g、dp;如果八个二极管的阳极连接在一起,那么我们就称这个为共阳极数码管,如果八个二极管的阴极连接在一起,那么我们就称这个数码管为共阴极数码管。由上图可见,八个发光二极管围成了一个 8 字形,那么我们要让它显示什么数字或者形状只需要点亮对应的二极管即可。

 这个是单个数码管的硬件电路图

 

 

这个是多个数码管的硬件电路图

        这种数码管点亮的时候需要我们对它进行选择,也就是点亮哪一个,这种选择方式我们叫做‘位选’;而当我们选择数码管之后,我们让被选中的数码管显示何种数字或者形状,这种我们称为‘段选’。

 

 

 

这个是实验所用开发板的数码管原理图
在实际当中,单片机所发出的电流是微安(uA)级别的,但是驱动数码管点亮的电流需要 10 毫安(mA),于是我们会使用电流放大装置来使单片机发出的电流 被放大。有些开发板所用的电流放大装置为三极管,而有些开发板的电流放大装置为锁存器。图中的 74HC245 即是锁存器。
如何点亮数码管
        在上面我们有介绍到单个数码管是由八个发光二极管所组成的;点亮数码管的方式跟点亮流水灯的方式类似。我们实验室所用使用的开发板有八个 LED 灯,我们是通过十六进制数来选择哪个 LED 灯亮或者灭,那么我们的数码管也是如此。
        首先我们来重新看一遍单个数码管的原理图

 

当我们赋给发光二极管 a 的值为 0 的时候,发光二极管 a 就会被点亮,同理,我们知道当给哪一个发光二极管赋予低电平时它就会被点亮。
我们现在将单个数码管的八个发光二极管进行一个排序,排序顺序如下:

 

我们现在想要使单个数码管显示数字 1,那么我们对应所需要点亮的发光二极管就是 b 和 c。那么此时我们给这八个发光二极管所赋的值就如下:
对应转化称十六进制数就是 0x9f;
下面为示例代码和开发板的显示详情:
        我们现在可以看到,数码管并没有按照我们的预期显示数字 1 ,我们刚才说显示数字 1 需要我们点亮发光二极管 b c ,但是开发板显示的却是 f g ,由此我们可以推测,我们排序发光二极管的时候,将二极管的顺序搞反了,所以我们现在对单个数码管的八个发光二极管进行重新排序:

 那么我们现在重新对 c b 进行点亮操作,这个时候的赋值如下:

这个时候的十六进制数表示为:0xf9

下面为示例代码和开发板的显示详情:

 

现在我们看到开发板上的第一个数码管显示了数字 1 ,证明我们现在的代码是正确的。

如何同时点亮多个数码管

        如果我们仔细观察我们可以发现,数码管在我们的生活当中无处不在,例如教室的电子时钟。
        现在我们思考一个问题,数码管这么多个,它是同时亮着显示的吗?答案是否定的,厂家为了节省开发板的能源损耗,将数码管设置为在某一个时间段只点亮单个数码管,而我们的人眼看到的数码管它好像是全部亮着的,这是利用了人的视觉的暂留效应。当一个东西闪得很快的时候,我们人眼是观察不出来的,所以这个时候我们看着它好像就是一直亮着的。我们的开发板多个数码 管就是利用了这样的原理。
        下面为示例代码
#include <REGX52.H>//数码管段码表
unsigned char NixieTable[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};//数码管显示子函数
void Nixie(unsigned char Location,Number)
{switch(Location)		//位码输出{case 1:P2_4=0;P2_5=1;P2_6=1;P2_7=1;break;case 2:P2_4=1;P2_5=0;P2_6=1;P2_7=1;break;case 3:P2_4=1;P2_5=1;P2_6=0;P2_7=1;break;case 4:P2_4=1;P2_5=1;P2_6=1;P2_7=0;break;}P0=NixieTable[Number];	//段码输出
}void main()
{Nixie(2,3);	//在数码管的第2位置显示3while(1){}
}

这里的数码管是静态显示的,那我们改如何让数码关动态显示呢?话不多说,上代码

#include <REGX52.H>//数码管段码表
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=0;P2_5=1;P2_6=1;P2_7=1;break;case 2:P2_4=1;P2_5=0;P2_6=1;P2_7=1;break;case 3:P2_4=1;P2_5=1;P2_6=0;P2_7=1;break;case 4:P2_4=1;P2_5=1;P2_6=1;P2_7=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);}
}


http://www.ppmy.cn/news/519705.html

相关文章

数码管显示原理与驱动方式

目录 一、数码管内部结构 二、数码管的显示方式 三、数码管显示编程思想 一、数码管内部结构 1、内部结构有八个发光二极管&#xff0c;一个8字只需要显示7段&#xff0c;但是有一个小数点&#xff0c;dp&#xff0c;所以有八个发光二极管。 2、单个数码管封装十个引脚。…

各种锁的概念

我们学习多线程相关知识的时候都会涉及到各种锁&#xff0c;自旋锁、乐观锁、悲观锁、可重入锁、互斥锁、排它锁、独占锁、 共享锁。。等等 其实很多锁的概念都是来源与数据库&#xff0c;java中的锁也有这些特性&#xff0c;因此我们在学习多线程的时候就会接触这些概念 sync…

单片机实验--单片机控制数码管

实验目的 学习单片机程序开发软件Keil uVision的使用方法学习单片机控制数码管动态显示的方法学习模块化程序设计的方法 实验仪器 硬件&#xff1a;X86型兼容计算机&#xff0c;单片机开发板&#xff1b;软件&#xff1a;Keil uVision和烧录软件 实验内容 设计程序控制数码管动…

进化吧,MySQL锁!无锁->偏向锁->轻量级锁->重量级锁(请自动脑补数码宝贝进化音)

写在前边 走到哪都有各种琐事&#xff0c;在MySQL中咱已经聊透了各种琐事 ->MySQL锁机制&&事务&#xff0c;今天来看看Java里边的锁升级过程&#xff0c;以及各种锁之间的比较&#xff0c;悲观乐观&#xff0c;粗化消除~ 四种锁的Markword 优先程度 偏向锁->轻…

数码管和573锁存器的细节问题

今天在QQ群上一个初学单片机的人提了一个关于数码管的问题&#xff0c;主要是程序的问题&#xff0c;由于对基础知识掌握不够&#xff0c;花了比较长的时间才解决&#xff0c;现总结一下其中的细节。 电路中8位数码管是由两个74HC573锁存器分别控制位选和段选的。 原程序大致如…

蓝桥杯单片机——锁存器、数码管、定时器的基本操作

锁存器 蓝桥杯的锁存器可以直接背&#xff0c;这里就不再赘述 数码管的基本原理 共阳数码管&#xff1a;将所有发光二极管的阳极接到一起形成公共阳极的数码管&#xff0c;且公共极接VCC 共阴数码管&#xff1a;将所有发光二极管的阴极接到一起形成公共阴极的数码管&#xff…

51单片机(三)数码管(超详细、必会!)

数码管详细总结 一、数码管电路1、单个数码管2、多个数码管3、数码管与芯片的连接3.1 为什么要使用锁存器&#xff1f;3.2 锁存器的电路连接 二、数码管显示数字时芯片引脚的状态值三、数码管实现动态显示1、一个数码管从0到F动态显示2、多个数码管从0到F动态显示3、一个经典例…

51单片机学习篇-- --静态数码管的显示(74HC138译码器,74HC245锁存器,74HC573锁存器)

开篇先说一句废话 本旺名字叫萨摩耶&#xff0c;&#xff0c;Please 叫我旺财&#xff0c;&#xff0c;&#xff0c;哈哈&#xff0c;招财进宝嘛&#xff01; 数码管的介绍 啥是个数码管呢&#xff1f;先来看一些数码管的照片。 其实数码管就是通过点亮里面的发光二极管来发…