前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(四)51单片机基础——数码管

(四)51单片机基础——数码管

作者头像
小点点
发布2022-12-12 14:07:31
8580
发布2022-12-12 14:07:31
举报
文章被收录于专栏:小点点

        接下来就是介绍数码管了,相对于前面的知识来说,数码管对于电路的要求更多,所以比较难理解。首先,我们来介绍一下数码管的构造。

        首先,我们先来研究一个数码管,右图是两种连接方式,一种是共阴极的连接方法, 另一种是共阳极的连接方法,开发板就是共阴极连接的,所以我们只讲解共阴极,共阳极的原理也是一样的,就不细细讲解。首先,负极接地(位选),再对各个引脚赋值(和LED那章类似),就可以显示出相应的数字了。

        之后,我们就要开始研究四位一体的数码管了,四位一体的数码管并不是单纯的把四个数码管拼接在一起,那样引脚数码过多,不利与操作。个人认为这个四位一体数码管设计的十分巧妙,仅仅使用了12个引脚就解决了(一个数码管是10个引脚,就加了2个引脚,却能多控制3个数码管),让我们来看看四位一体的数码管的构造吧!

        这个数码管点亮的方式,和 一个数码管类似,就是需要去控制4个位选端,其他的引脚和之前的类似,但是呢,有人可能有疑问了,这样只能显示一个数字啊,如果要显示1234,明显是做不到的,确实是这样的,但是我们有办法解决这个问题。

在这之前,还要介绍一个东西——译码器。

        译码器,可以用3个io口去控制8个io口,进一步减少了需要操作的引脚数。左下角是使能端,可以理解为电源。控制原理就是,用3位二进制,通过转换成十进制,操控对应的端口(低电平有效)。

这个是缓冲器 ,可以理解为提高驱动能力,传输电位信号(双向)。


电路知识介绍完毕,于是,我们现在开始点亮数码管了。

代码语言:javascript
复制
#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=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];	//段码输出,就是后面那8个引脚
}

void main()
{
	Nixie(2,3);	//在数码管的第2位置显示3
	while(1)
	{
		
	}
}

运行结果如下所示:

        我们还要一个问题没有解决,那就是,如何在数码管上显示不同数字,答案就是,反复刷新,因为单片机频率比较快,所以通过反复刷新,人眼是看不出来的。 但是在刷新的过程中,数码管显示不是特别清楚,有残影(如下图所示),是因为在位选和段选切换的时候,就会发生数据篡位,所以我们需要消影,具体做法就是,在一次位选和段选结束之后,选择清零,这样就可以了,代码如下所示。


代码语言:javascript
复制
#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=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);
	}
}

运行结果如下所示:

        如果想要显示多位数字,可以修改一下延时时间,就可以实现了。好了,这就是有关数码管的知识点了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档