IO的使用2–数码管
本文主要涉及51单片机的数码管的使用
文章目录
- IO的使用2--数码管
- 一、数码管的定义与类型
- 1.1 数码管的原理图
- 二、 举个栗子
- 2.1 一个数码管的底层函数
- 2.2 调用上面的底层函数显示具体数字
一、数码管的定义与类型
数码管是一种用于数字显示的电子元件,通常由多个LED(发光二极管)组成。它被广泛用于各种计数、测量和显示应用,如数字时钟、温度计、计数器等。
主要特点和结构如下:
-
LED组成: 数码管的基本组成单元是LED,通常为七段共阳(Common Cathode)或共阴(Common Anode)的结构。七段代表数码管上的七个LED段,分别对应显示数字0到9的不同线段。
-
共阳和共阴: 共阳数码管表示LED的阳极连接在一起,共阴数码管表示LED的阴极连接在一起。在共阳数码管中,通过给定的线段点亮LED,而在共阴数码管中,通过接通的线段关闭LED。
-
多位数码管: 为了显示更多的数字或字符,可以将多个数码管连接在一起形成多位数码管,每一位数码管对应显示其中的一个数字或字符。
-
控制信号: 为了控制数码管的显示,需要提供适当的控制信号。这些信号通常包括电源、段选信号和位选信号,以确保正确的数字或字符在正确的数码管上显示。
-
常见的数码管类型:
- 共阳七段数码管: 每个数字由7个LED段组成,共阳表示数字的阳极连接在一起。
- 共阴七段数码管: 同样由7个LED段组成,共阴表示数字的阴极连接在一起。
- 数码管显示器: 可以同时显示多个字符或数字,通常用于计算器、计数器等设备。
总体而言,数码管是一种简单、实用的数字显示设备,广泛应用于各种电子设备和嵌入式系统。
1.1 数码管的原理图
可以从上面原理图可以知道:
上图电路使用的是 2 个四位一体的共阴数码管组成,即 8 位数码管的段选数据 a-dp 全部并联一起引出,每位数码管的位选即公共端引出。数码管的段选
a-dp连接在 74HC245 驱动芯片输出口,由 P0 端口控制。由 P2.2、P2.3、P2.4 管脚控制 74HC138 译码器输入从而控制数码管位选
.
二、 举个栗子
1-利用动态扫描方法在三位数码管上显示出稳定的321。
思路:显示原理:
-
数码管类型: 数码管分为共阴极和共阳极两种类型。在共阴极数码管中,所有的LED的阴极(负极)都连接在一起,而阳极(正极)分别连接到不同的引脚。在共阳极数码管中,所有LED的阳极连接在一起,而阴极分别连接到不同的引脚。
-
动态扫描: 为了在有限的引脚上控制多个数码管,采用了动态扫描的方法。在一个很短的时间内,依次点亮每一个数码管,然后迅速切换到下一个数码管,以此类推。由于人眼的
视觉暂留效应
,看起来就像所有的数码管都在同时显示
。 -
数码管控制: 对于每个数码管,通过在段选信号上输出相应的二进制码,控制数码管的每一段LED的亮灭状态。例如,数字 0 对应的二进制码可以是
00111111
,其中每一位对应数码管的一个段,1 表示点亮,0 表示熄灭。 -
显示数字: 在动态扫描的过程中,根据要显示的数字,依次输出相应的段选信号,将对应数码管的LED点亮,实现数字的显示。通过迅速切换并依次点亮每个数码管,就能够看到整个数字在数码管上的显示效果。
-
控制电平: 在具体的硬件连接中,控制数码管的LED点亮和熄灭需要通过控制相应的引脚输出高电平或低电平来实现。不同的数码管芯片和硬件连接可能存在一些差异,但基本的原理是类似的。
2.1 一个数码管的底层函数
下面的函数通过数码管显示一位数字,通过设置数码管的位选信号(Location参数)以及数码管的段选信号(NixieNumber数组中的对应数字),从而实现数字的显示。
其中:
-
unsigned char smgNumber[] = {...}
:定义了一个数组,用于存储共阳极数码管的七段编码。每个元素对应一个数字的七段编码,共阳极表示为1,点亮。 -
void smg(unsigned char Location, Number)
:定义了一个函数smg
,接收两个参数,Location
表示选择哪一个数码管,Number
表示要在该数码管上显示的数字。 -
switch(Location)
:根据Location
的值,选择要点亮的数码管。根据不同的Location
值,设置对应的位选信号,即数码管的引脚。这样在多位数码管的情况下,可以选择具体点亮哪个数码管。 -
P0 = smgNumber[Number];
:将对应数字的七段编码写入P0口,通过具体的硬件连接和控制逻辑,实现数码管的段选。 -
Delay(1);
:通过调用Delay
函数,延时一段时间,以使得数码管的LED能够被稳定点亮,确保显示效果。 -
P0 = 0x00;
:将P0口清零,熄灭数码管的LED,准备进行下一轮的显示。
这样,通过不断调用smg
函数,可以在指定的数码管上显示相应的数字。
unsigned char smgNumber[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阳极编码,七位表示数字
void smg(unsigned char Location,Number) //第一个参数选择数码管,第二个参数表示显示数字
{
//这一段swith代码是为了设置位选信号,选择数码管
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=smgNumber[Number];
Delay(1);
P0=0x00;
}
2.2 调用上面的底层函数显示具体数字
要显示具体的数值,只需要在主函数中调用上述底层函数即可
//利用动态扫描显示稳定的321
void main()
{
while(1)
{
Nixie(1,3);
Nixie(2,2);
Nixie(3,1 );
}
}
上面代码中还使用到了延迟函数
如下:
void Delay(unsigned int xms)
{
unsigned char i,j;
while(xms)
{
i=2;
j=239;
do
{
while(j--);
}
while(i--);
xms--;
}
}
当然其他延迟函数也是适用的。