在之前的文章中我们学习了单片机是如何点亮一盏LED灯,并且让LED灯玩出花样本章我们把前面所学习到的内容融合起来,实现如题数码管显示,数码显示的自然就是数字了,本章节目标 -- 数码管显示数字。
一、功能概述
数码管显示的单片机的基础功能,数码管具有动态显示,和静态显示两种状态,其显示的原理就是利用人眼睛的视觉暂留现象,通过控制单片机IO快速刷新数码管的显示内容,达到人们眼中所见的稳定不变的显示。
(资料图片)
二、显示原理
1.数码管通常有一位或多位一体,其中一位数码管中由8段LED灯组合而成,每段分别命名为a,b,c,d,e,f,g,dp,通过控制单片机的8个IO给这8个管脚施加不同的电压电位,就可以使其中的LED发光,从而组成不同的显示状态如0 ~ 9甚至是字母A~H都可以。
2.数码管由8个LED组成,将8个LED的其中一端并联到一起就形成了一个公共端,如果被并联的一端都是由LED的负极组成的话,那么这种数码管就称之为共阴极数码管,反之被并联的一端都是由LED的正极组成的话,这种数码管就称之为共阳极数码管。
3.多位一体数码管,多位一体数码管可以视作由多个一位数码管组成的数码管,通过高速扫描每一个位的端口,利用人眼的视觉暂留现象实现在人眼中多位同时显示的效果,这种方式称之为位选也叫位的选择。
三、电路连接
将一位数码管的a,b,c,d,e,f,g,dp端口分别与单片机的P00~P07相连,将数码管的公共端与电源地连接,这是个共阴极数码管,所以公共端是要连接到电源地的,那么这个数码管的驱动电位则为高电位驱动,单片机的IO输出高电位就能够点亮这个数码管。
四、程序设计
首先根据电路连接,P00~P07分别对应数码管的a,b,c,d,e,f,g,dp,即:
单片机I/O口 | 数码管端口 |
---|---|
P0.0 | a |
P0.1 | b |
P0.2 | c |
P0.3 | d |
P0.4 | e |
P0.5 | f |
P0.6 | g |
P0.7 | dp |
以共阴极数码管为例,根据共阴极数码管高电平点亮原则,可以以此计算出每个数字所代表的16进制位码。
首先数字0的位码应该怎么计算?这里我们首先就要看当数字0点亮时,数码管中应该是哪些LED段亮起哪些段是熄灭的:
根据以上两个例子,呢么是不是可以以此类推出剩下的数字码:
当然,不同的接法有不同的字码计算方法,不同的数码管的管脚排列也不一定相同,还要根据实际使用中来进行分辨和计算,本例中的字码如下:
数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
字码 | 0xfc | 0x60 | 0xda | 0xf2 | 0x66 | 0xb6 | 0xbe | 0xe0 | 0xef | 0xf6 |
数码管从0-9顺序显示数字,功能实现代码:
include< reg52.h >#define uchar unsigned char#define uint unsigned intvoid delay(uint n) //定义延时函数{uint x,y;for(x = n;x >0;x--)for(y = 110;y >0;y--);}uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xef,0xf6}; // 数字0-9void main(){P0=0xff; //P0口初始化高电平,时数码管初始熄灭状态while(1){P0 = table[i];delay(1000); //延时约1si++;if(i >9) i = 0; // 从0-9显示后,再从0开始}}
总结
总体而言实现一位数码管显示数字,并按一定的规律显示其内容,相对来说还是比较简单的,实际上还是上一章流水灯中所用到的知识,本章的重点还是在于理解数码管位码的计算提取,大家可以根据本章所学到的内容举一反三,下一章中我们将要进一步使用数码管实现更具有挑战性的效果。
标签: