本小节目录:
3.1数码管的分类和结构
3.2数码管原理图分析
3.3数码管静态和动态显示程序的分析
3.1)数码管的分类和结构
数码管其实也就是:由若干个发光二极管按共阴极或者共阳极连接在一起的器件。
图1
数码管分类:
按段数分:七段数码管和八段数码管(比七段多一点(上图1红圈内一点))
按位数分:如上图1,常见有1位,2位,3位,4位数码管
按极性分:共阴极(所有二极管阴极连一起)和共阳极(同理)如下图2
图2数码管内部解剖图
数码管结构解释:
1)内部由8个发光二极管组成,其中7个发光二极管(a,b,c,d,e,f,g)作为7段组成“8”字结构(又称7段LED数码管),剩下1发光二极管为h点(或dp),如上图3.1.2。
2)内部8个发光二极管的全部负极连接一起,作为公共端COM,(故称为共阴极),而剩下8个正极分别作为独立引脚,其引脚名称分别用a,b,c,d,e,g,f,h(或dp)表示;而共阳极反之。
3)从图3.1.2显然可以看出,共阴极数码管,只需给a到h端中的某段,给高电平“1”则亮,给“0”低电平则灭,反之共阳极某段,给高电平“1”,则灭,给“0”则亮。
4)显然:对于共阴极数码管,若公共端给低电平“0”,给b,c高电平“1”,剩下a,d,e,f,g,h送低电平“0”则亮数字“1”,那么亮数字“8”呢?又显然给a,b,c,d,e,f高电平送“1”,剩下g,h给低电平“0”。同理想亮别的数字就很简单了呀!
3.2)数码管原理图分析
图3 两个4位共阴极数码管连接图
图4 单片机原理图
对于初学者来说,数码管连接单片机的原理图是很不好看懂的,单单让初学者找相同的物理标识都要找很久,说不定还没有找到,本人当初看郭天祥的书时,就是深受原理图坑了很久才看懂。所以本人将图3,和图4相互连接的地方,全用同色笔圈出了。
结合图3和图4不难看出共阴极数码管连接单片机的原理图:
(1)黑色圈圈:两个数码管的DU0—DU7都连接到图3右下方74HC573(U6)的DU0—DU7
(2)红色圈圈:两个数码管的WE0—WE7连接到图3左下方74HC573(U5)的WE0—WE7
(3)蓝色圈圈:两个74HC573的COM0—COM7都连接到图4的P0口(COM0—COM7)
(4)图3中1,2数字的WE#和DU#和图4中的1,2数字的WE#(P1^6)和DU#(P1^7)连接
(5)为什么要用74HC573驱动数码管?
因为单片机IO口的拉电流比较小(100~200uA),灌电流也最多是25mA,显然直接用来驱动数码管是不行的,所以必须要扩流,而加573能启到扩流的作用,同时还能节约单片机的IO口。
(6)关于74HC573芯片,初学者只需记住,
1,只有当单片机给LE端送高电平“1”时,(即打开573)
单片机P0口再给573的D0—D7哪个口送“1”,则对应Q0—Q7哪个口才为“1”;
反之给D0-D7送“0”,对应Q0-Q7才为“0”
2,而当单片机给LE端为低电平“0”时,(即关闭573)
不论单片机P0口再给573送“0”或者“1”,D0-D7都不反应,即573没有起作用。(若有兴趣也可深究573数据手册(DataSheet)。)
(7)什么是段选,位选?(务必要理解这里,否则后面程序没办法理解)
段选就是亮哪段(例如亮0,就给a,b,c,d,e,f段送高电平“1”)
位选是哪个亮(例如第1位数码管亮,还是第2位亮,还是第8个亮
总的来说就是:往单片机里写程序,去控制两个74HC573,从而控制两个4位数码管的位选和段选,让其哪位亮,亮什么。
3.3)数码管静态和动态显示程序的分析
1,数码管静态显示:
有了上面的原理图的7条分析后,不难理解,如果我们想让8个共阴极数码管都亮数字“1”,则8个位选应全给低电平“0”,即为00000000;而段选的b,c给高电平“1”,剩下a,d,e,f,g,h给低电平“0”,则不就实现了吗?答案是肯定的。
8个数码管全亮数字“1”程序:
#include
sbitWei_select=P1^6;//位选的573的LE口连接单片机P1^6口
sbitDuan_select=P1^7;//段选的573的LE口连接单片机P1^7口
voidmain(void)
{
Wei_select=1; //单片机给U5的573送高电平,开启573,上3.2)中的(6)已讲
P0=0x00; //单片机给U5的573送位选数据00000000,全选8个数码管
Wei_select=0; //单片机给573送低电平,关闭573,以上3.2)中的(6)已讲过
Duan_select=1;//单片机给U6的573送高电平,开启573,以上3.2)中的(6)已讲
(10)P0=0x06; //单片机给U6的573送段选数据00000110,给b,c高电平,
// 其他 a,d,e,f,g,h给低电平
Duan_select=0; //单片机给573送低电平,关闭573,以上3.2)中的(6)已讲过
while(1); //程序停止到这里
}
图5 8个数码管全显示数字“1”(由于手机像素的原因,效果不太好)
或许程序(10)处的P0=0x06还有人疑问,(当初本人学的时候也很困惑)
为什么a,b,c,d,e,f,g,h按顺序不是给01100000才对嘛?而是给00000110呢?
解释:请细心看图3和图4的原理图,
很容易看出,数码管的a,b,c,d,e,f,g,h分别与573的DU0—DU7连接,然后通过573的COM0--COM7与单片机的P0.0(低位)--P0.7(高位)连接,而0x06(00000110)的高位在前,低位在后,所以送电平时要颠倒过来给。
也就是说:给P0口送的电平对应的是h—a,而不是a—h,如下表
2,数码管动态显示:
数码管动态显示就是轮流向数码管送位码和相应的段码,利用人眼的视觉暂留现象使人感觉各位数码管是同时亮了,而实际是一位一位轮流亮的,只是轮流的时间太短,人眼无法分辨而已。(对于初学者来说,或许不好理解,但是只要有开发板,写程序下载,看过静态和动态显示现象的人,或许就明白什么是动态,什么是静态了,当然,本人当初学得时候也是没有理解的)
8个数码管从第一个数码管开始显示“1”,0.5s后,第二个数码管显示“2”,0.5后,,,,,,,,,,,一直到第八个数码管显示“8”的程序:
#include
#defineUchar8unsignedchar
#defineUint12unsignedint
#defineDateP0 //P0口宏定义
sbitWei_select=P1^6;
sbitDuan_select=P1^7;
//共阴极第1个数码管到第8个数码管的位码值数组
Uchar8codeWei_tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//共阴极0—-7数字显示段码值
Uchar8codeDuan_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
/*******************************************************/
//函数功能: 毫秒延时函数
//入口参数: 延时毫秒数(xms)
//出口参数: 无
/*******************************************************/
voidDelayms(Uint12xms)
{
Uint12i,j;
for(i=xms;i>0;i--)
for(j=121;j>0;j--);
}
voidmain(void)
{
Uchar8num;
while(1)
{
for(num=0;num<8;num++)
{
Wei_select=1; //段选打开
Date=Wei_tab[num]; //送位选数据
Wei_select=0; //段选关闭
Duan_select=1; //位选打开
Date=Duan_tab[num]; //送段选数据
Duan_select=0; //位选关闭
Date=0xff;//消影
Delayms(500); //约延时500毫秒
}
}
}
1)#defineDateP0中所谓宏定义:也就是用Date代替P0,在后面的程序中都用Date代替P0,这样的优点方便程序的修改和编写
2)Date=0xff;为什么要消影?
因为给P0口送完段选数据后,会一直会保持着,若不加0xff消影,使数码管段选完完全全取消,则下步送位选数据时,会直接影响在数码管的段选,也就会造成不让亮的数码管某段,隐隐约约的再发亮!这也就是一些书上所说的“鬼影”,所以加0xff是非常重要的。
季节的围栏,毕竟还是锁不住斗转星移,时光流逝,如同那数码管跳动一般地消无声息,而你,又是否感受到了呢?学精数码管,为自己DIY一个数码管高精度时钟吧!
本系列《MCU之心路分享》博文,本人尽自己微薄之力,以菜鸟的身份,写写初学者最详细,最具体的入门博客,本人自当也种是锻炼,仅仅如此简单容易,如有误之处,欢迎拍砖,本人不胜感激!