51单片机从零开始入门教程 第四章(数码管篇)

本文详细介绍了LED数码管的工作原理,区分了共阳极和共阴极数码管,展示了静态和动态显示的方法,以及单片机驱动数码管的不同策略,包括直接扫描和专用驱动芯片的应用。

参考教程:[4-1] 静态数码管显示_哔哩哔哩_bilibili

一、数码管基础知识简介

1、数码管的组成

        LED数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件,也就是说,数码管显示数字的原理,只是点亮LED灯原理的plus版而已

2、数码管的分类及显示原理

(1)数码管分为共阳极数码管和共阴极数码管,原理图如下所示。

(2)对于共阴极数码管,如果想让其显示数字,首先要将其公共阴极置为低电平(否则永远不可能产生正向电流),对于各个LED的阳极,需要点亮哪个LED灯,就将哪个LED灯的阳极置为高电平;对于共阳极数码管,如果想让其显示数字,首先要将其公共阳极置为高电平(否则永远不可能产生正向电流),对于各个LED的阴极,需要点亮哪个LED灯,就将哪个LED灯的阴极置为低电平。

3、数码管的驱动方式

(1)单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间

(2)专用驱动芯片:芯片内部自带显存、扫描电路,单片机只需把显示需求发给驱动芯片,驱动芯片根据单片机需求驱动数码管。

二、开发板原理图中的数码管模块

1、动态数码管模块原理图

(1)开发板采用的是共阴极数码管,一共8个,每4个封装为1组。封装起来的4个数码管,其同样位置的LED阳极接的是同一条线(比如4个数码管的位置a的LED阳极,都连接SMG封装的11号引脚),也就是说,如果同时将4个数码管的公共阴极全部置为低电平,那么4个数码管将会显示同一个数字

(2)74HC245用于提升高电平驱动的能力,它没有额外的逻辑,Ax端口的信息会原封不动地传到Bx端口。

2、开发板上的138译码器

        如下图所示,138译码器左边有ABC三个输入,它们分别代表一位二进制数,译码器获取三位二进制数后,会将该二进制数转化为0~7的十进制数

        138译码器根据转化而得的十进制数选择LED1~8其中一个引脚输出低电平(LED1~8就是动态数码管模块中8个数码管的公共阴极),由于对应的数码管公共阴极被置为低电平,该数码管可以显示数字,而其它数码管的公共阴极被置为高电平,不可以显示数字

三、数码管显示实验

1、静态数码管显示一个数字实验

(1)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>

unsigned char NixieTube[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00 };
//在全局定义数码管段码表(数组),从左往右依次是0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,无显示

void Nixie(unsigned char Location, Number)  //Location是显示数字的数码管编号,Number是需要显示的数字(需要显示a则Number传入10,以此类推)
{
	switch (Location)
	{
	case 1:
		P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
		//选中LED8,左边第一个数码管显示数字
	case 2:
		P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
		//选中LED7,左边第二个数码管显示数字
	case 3:
		P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
		//选中LED6,左边第三个数码管显示数字
	case 4:
		P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
		//选中LED5,左边第四个数码管显示数字
	case 5:
		P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
		//选中LED4,左边第五个数码管显示数字
	case 6:
		P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
		//选中LED3,左边第六个数码管显示数字
	case 7:
		P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
		//选中LED2,左边第七个数码管显示数字
	case 8:
		P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
		//选中LED1,左边第八个数码管显示数字
	}
	P0 = NixieTube[Number];  //Number作为数组下标,自动匹配对应的段码
}

void main()
{
	/*
	P2_4 = 1;
	P2_3 = 0;
	P2_2 = 0;  //这三个变量控制138译码器ABC三个引脚,0b100译码得4,会选中LED5
	P0 = 0x7D;  //P0寄存器的8位分别控制数码管的8个LED灯,0111 1101对应数字6
	*/
	Nixie(7, 2);  //从左往右的第七个数码管显示数字2
	while (1)
	{

	}
}

(2)将生成的.hex文件下载到开发板中,可以看到从左往右的第七个数码管显示数字2。

2、动态数码管显示“123”实验

(1)根据前面的讲述,看起来不能同时点亮个数码管,更不能让它们同时显示不同的数字,但实际上并不是这样。共阴极数码管(共阳极数码管同理)被点亮后,即使阳极变为低电平或者公共阴极变为高电平,数码管也不会立刻熄灭,或者说人眼不能马上发现数码管熄灭,会有一个“视觉暂留”的现象,在人眼发现数码管熄灭之前可以先点亮其它数码管,接着再重新点亮熄灭的数码管,这个过程是非常迅速的,这样就可以实现多个数码管同时显示不同数字的效果

(2)动态数码管显示消影:

①位选负责选择要被点亮的数码管,段选负责决定显示的内容,一个数码管的位选要在段选之前。

②数码管被点亮后不会立刻熄灭,如果在下一个数码管的位选完成后,上一个数码管的段选没有清零,那么上一个数码管的段选会直接被“继承”到下一个数码管,即使下一个数码管有自己的段选,但是数码管被上一个段选点亮后,在肉眼看来,被误点亮的LED不会立刻熄灭,这样一来视觉上看就会显示错误。

③为了解决以上问题,段选完成后,要将段选全部置为0,防止上一个数码管的段选被继承到下一个数码管。

④数码管被点亮后,即使阳极变为低电平,在肉眼看来,数码管也不会立刻熄灭(“视觉暂留”现象),所以P0全部清零不会让数码管立刻熄灭。

(3)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>
#include <INTRINS.H>  //_nop_()需要这个头文件

void Delay(unsigned int xms)
{
	while (xms--)
	{
		unsigned char i, j;

		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

unsigned char NixieTube[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00 };
//在全局定义数码管段码表(数组),从左往右依次是0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,无显示

void Nixie(unsigned char Location, Number)  //Location是显示数字的数码管,Number是需要显示的数字(需要显示a则Number传入10,以此类推)
{
	switch (Location)  //(位选)
	{
	case 1:
		P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
		//选中LED8,左边第一个数码管显示数字
	case 2:
		P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
		//选中LED7,左边第二个数码管显示数字
	case 3:
		P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
		//选中LED6,左边第三个数码管显示数字
	case 4:
		P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
		//选中LED5,左边第四个数码管显示数字
	case 5:
		P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
		//选中LED4,左边第五个数码管显示数字
	case 6:
		P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
		//选中LED3,左边第六个数码管显示数字
	case 7:
		P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
		//选中LED2,左边第七个数码管显示数字
	case 8:
		P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
		//选中LED1,左边第八个数码管显示数字
	}
	P0 = NixieTube[Number];  //Number作为数组下标,自动匹配对应的段码(段选)

	Delay(1);
	P0 = 0x00;  //消影
}

void main()
{
	while (1)
	{
		Nixie(1, 1);
		Delay(1);
		Nixie(2, 2);
		Delay(1);
		Nixie(3, 3);
		Delay(1);
		//正是因为数码管不会立刻熄灭(视觉暂留)这一特性,让不同数码管分时段显示,就能达到看起来数码管同时显示不同数字的效果
	}
}

(3)将生成的.hex文件下载到开发板中,可以看到左边开始数的三个数码管显示“123”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值