《51单片机入门教程(3):使用数码管显示学号》

目录

1、数码管简介

2、静态显示

3、动态显示

4、小结


相信经过了流水灯的实现,大家已经弄清楚了Keil和Proteus是如何联动使用的,并且对51单片机也有了一定的认识,在这一章里,我带大家利用51单片机玩下数码管,看最终你们能不能把自己的学号显示出来。

1、数码管简介

LED数码管(LED Segment Displays)是由多个发光二极管封装在一起组成的器件。常见的LED数码管为“8”字型的,共计8段。每一段对应一个发光二极管。

数码管有共阳极和共阴极两种。共阴极: 数码管的发光二极管的阴极连在一起,通常公共阴极接地。当阳极为高电平时,发光二极管点亮。共阳极: 数码管的发光二极管的阳极连在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。

2、静态显示

现在我们先来讲一下数码管静态显示,其实数码管的本质就是8个LED组成的一个“8”字形加一个点(dp),如果我们想要显示0,那么就是把上图(c)中的a、b、c、d、e、f六段数码管点亮,让g、dp熄灭,最后就显示数字0了。

在开始之前,大家先要弄懂2进制、10进制、16进制的转换关系,因为单片机只认识二进制,而我们习惯于使用10进制。那么为何我要提到16进制呢,这是因为1位16进制恰好能够表示4位二进制,为了程序的简单,我们一般使用16进制来写代码。比如3FH是什么意思呢,首先末尾的H表示16进制的标志,还有同学记得我们上一章讲到的HEX吗?我上一章说HEX就是16进制的意思,H就是HEX的首字母。所以我们知道了3F是个16进制数,考虑到大家刚入门,我教大家如何使用计算器转换成2进制。

我们可以看到3F对应的二进制是00111111,我看到这串数字我就知道这在共阴极的情况下显示的是0,为什么呢,我来给大家分析。

首先共阴极的情况下,1就是灯亮,0就是灯灭。00111111正好对应8段LED灯。由于右边是低位,所以a=1、b=1、c=1、d=1、e=1、f=1、g=0、dp=0。对应我们上面数码管图,显示的就是数字0。这其实就是数码管显示数字的原理。大家也可以想一下如果是共阳极的情况呢?

现在直接实践环节,我们一起来显示个数字0,大家也可以根据上面的码表自己选择数字或字母。就不再演示建工程了,直接写代码,有忘记怎么建工程的同学回到第一章看看。

首先还是从硬件开始,打开Proteus,设计原理图。

大家可以根据我的硬件图进行搭建,为什么需要排阻呢,因为P0端口内部没有上拉电阻,如何将P0端口作为I/O口时,它会处于悬空状态,无法输出高电平,所以我们要给他加一个上拉电阻,以此给负载提供电流。我在这里故意使用P0这个特殊的端口,就是为了让大家知道这个知识点,后续很多实际工程中,很多人使用了P0端口却没有加排阻,导致调试不出结果。(包括我本人也被这个点坑过),所以在这里告诉大家。

软件设计我们使用Keil写代码,生成HEX文件即可,代码比较简单,大家对照着图片敲一下,当作练习。这个代码的意思就是让P0口输出00111111,用16进制表示就是0x3f,其中0x表示16进制,3f就是00111111,这个在上面讲过了,就不多赘述。

编译结果如下,0错误0警告。

注:如果找不到HEX文件,可能是魔术棒那里没有打勾。

最后我们把HEX文件烧录到Proteus里的51单片机中,进行运行验证。

可以看到,数码管已经显示数字0,证明我们的静态显示工程成功了!大家也可以上面的码表修改一下数字,多练几遍。

3、动态显示

如果有两位的数码管,每个数码管要显示不同的字符,那么电路该怎么搭建呢?对于多位数码管,经常使用动态扫描的方法来显示。

无论在任何时刻只有一个LED数码管处于显示状态,利用人的视觉暂留效应,依次显示每个不同的数码管。某一时刻,只有一位LED数码管被选通显示,其余位则是熄灭的,但人眼看到的是若干位稳定的同时显示的字符。

硬件连接图如下,大家可以在Proteus中搭建出来。

这个硬件连接也不是很难,数码管左边A、B、C、D、E、F、G、DP就是控制段选的,右边1、2、3、4、5、6、7、8是控制8个数码管到底哪一个亮(一次只能亮一个数码管)。

下面是我们的软件设计部分,大家利用Keil新建工程,把下面代码复制到main.c。

#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int

unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay (uint i)
	{
		uint m,n;
		for(m=i;m>0;m--)
		 for(n=200;n>0;n--);
	}
						
void main()
{
	uint j;
	while(1)
	{
		for(j=1;j<9;j++)
		{
			switch(j)
			{
				case 1:  P2=0xfe;P1=duan[3]; break;
				case 2:  P2=0xfd;P1=duan[1]; break;
				case 3:  P2=0xfb;P1=duan[9]; break;
				case 4:  P2=0xf7;P1=duan[4]; break; 
				case 5:  P2=0xef;P1=duan[0]; break;
				case 6:  P2=0xdf;P1=duan[3]; break;
				case 7:  P2=0xbf;P1=duan[0]; break;
				case 8:  P2=0x7f;P1=duan[6]; break;
			}	
				delay(1);		
		} 	
	}
}

编译成功,且顺利生成了HEX文件,接下来我们只需把文件放到51单片机中就可以运行验证就可以了。

这个时候,学号就显示出来了,其实这8个数字是一个接一个的亮,反复循环的,由于速度很快加上人眼的视觉残留,让我们感觉像是8个数码管一起在亮,大家也可以修改我的代码,看看能不能把自己的学号显示出来。提示一下大家,只需要修改switch语句里面的数字即可。

4、小结

对于数码管显示的学习到这里就结束了,其实回过头来看,数码管的显示本质还是LED,只是比较复杂的LED结构,需要考虑的因素多了一些罢了,这就需要大家多训练,在实践中感悟总结了。学到这一章,相信大家对于51单片机有了自己的理解和认识,入门51单片机的诀窍就是对I/O高低电平的理解,把这个理解清楚了,就基本入门了51单片机。

物联沃分享整理
物联沃-IOTWORD物联网 » 《51单片机入门教程(3):使用数码管显示学号》

发表评论