目录
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 #define uchar unsigned char#define uint unsigned intunsigned 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单片机。