原创 【博客大赛】MCU之心路分享--跳跃的数码管(三)

2013-11-2 01:00 2855 15 24 分类: MCU/ 嵌入式 文集: MCU之心路分享

 

     总是在不经意间,时间就从我们的指缝中一点点流逝,成长的日子,撕了皮连着肉,来不及疼痛,来不及流泪,只因时光如流水般,无声地流着流着,,,,,,数码管那数字跳跃的旋律,或许能让我们感觉到时光流逝的疼痛!  

—————————————————————————————————————    

本小节目录:

            3.1  数码管的分类和结构          

            3.2  数码管原理图分析

            3.3  数码管静态和动态显示程序的分析

 

3.1)数码管的分类和结构

数码管其实也就是:由若干个发光二极管按共阴极或者共阳极连接在一起的器件。                      

1.jpg

                                                       图 1

数码管分类:  

            按段数分: 七段数码管和八段数码管(比七段多一点(上图1 红圈内一点))

            按位数分: 如上 图 1,常见有1位,2位,3位,4位数码管    

            按极性分: 共阴极(所有二极管阴极连一起)和共阳极(同理)如下图2

2.jpg

                                                  图 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 - 副本.jpg

                         图 3 麦光电子上两个4位共阴极数码管连接图         

  

4.jpg

                                        图 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”,即为 0000 0000;而段选的b,c给高电平“1”,剩下a,d,e,f,g,h给低电平“0”,则不就实现了吗?答案是肯定的。

 

8个数码管全亮数字“1”程序:

#include 

sbit Wei_select = P1^6; // 位选的573的LE口连接单片机P1^6口

sbit Duan_select = P1^7;// 段选的573的LE口连接单片机P1^7口

void main(void)

{

     Wei_select = 1;  //单片机给U5的573送高电平,开启573,上3.2)中的(6)已讲

     P0 = 0x00;  //单片机给U5的573送位选数据0000 0000,全选8个数码管

     Wei_select = 0;  //单片机给573送低电平,关闭573,以上3.2)中的(6)已讲过

     Duan_select = 1; //单片机给U6的573送高电平,开启573,以上3.2)中的(6)已讲

    (10)P0 = 0x06;      //单片机给U6的573送段选数据0000 0110,给b,c高电平,

                                    // 其他   a,d,e,f,g,h给低电平

    Duan_select = 0;    //单片机给573送低电平,关闭573,以上3.2)中的(6)已讲过

    while(1);                    //程序停止到这里

5.jpg

       图5     8个 数码管全显示数字“1”(由于手机像素的原因,效果不太好)

 

     或许程序(10)处的P0 = 0x06还有人疑问,(当初本人学的时候也很困惑)

     为什么a,b,c,d,e,f,g,h 按顺序不是给0110 0000才对嘛?而是给0000 0110呢?

解释:请细心看图3 和图4的原理图,

      很容易看出,数码管的a,b,c,d,e,f,g,h分别与573的DU0—DU7连接,然后通过573的COM0--COM7与单片机的P0.0(低位)--P0.7(高位)连接,而0x06(0000 0110)的高位在前,低位在后,所以送电平时要颠倒过来给。

       也就是说:给P0口送的电平对应的是h—a,而不是a—h,如下表

     数码管段选 :    h       g          f          e         d         c         b         a

        P0口   :      P0.7   P0.6   P0.5   P0.4   P0.3   P0.2   P0.1   P0.0

 分别对应:P0=    0         0         0         0         0         1         1         0     

 

2,数码管动态显示:

     数码管动态显示就是轮流向数码管送位码和相应的段码,利用人眼的视觉暂留现象使人感觉各位数码管是同时亮了,而实际是一位一位轮流亮的,只是轮流的时间太短,人眼无法分辨而已。(对于初学者来说,或许不好理解,但是只要有开发板,写程序下载,看过静态和动态显示现象的人,或许就明白什么是动态,什么是静态了,当然,本人当初学得时候也是没有理解的)

 

8个数码管从第一个数码管开始显示“1”,0.5s后,第二个数码管显示“2”,0.5后,,,,,,,,,,,一直到第八个数码管显示“8”的程序:

#include

#define Uchar8 unsigned char

#define Uint12 unsigned int

 

#define Date P0    // P0口宏定义

sbit Wei_select = P1^6;

sbit Duan_select = P1^7;

 

//共阴极第1个数码管到第8个数码管的位码值数组

Uchar8 code Wei_tab[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

 

//共阴极0—-7数字显示段码值

Uchar8 code Duan_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; 

/* ***************************************************** */

// 函数功能: 毫秒延时函数

// 入口参数: 延时毫秒数(xms)

// 出口参数:  无

/* ***************************************************** */

void Delayms(Uint12 xms)

{

    Uint12 i, j;

     for(i=xms; i>0; i--)

        for(j=121; j>0; j--);

}

void main(void)

{

    Uchar8 num;

    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)#define  Date  P0中所谓宏定义:也就是用Date代替P0,在后面的程序中都用Date代替P0,这样的优点方便程序的修改和编写

        2)Date = 0xff;  为什么要消影?

        因为给P0口送完段选数据后,会一直会保持着,若不加0xff消影,使数码管段选完完全全取消,则下步送位选数据时,会直接影响在数码管的段选,也就会造成不让亮的数码管某段,隐隐约约的再发亮!这也就是一些书上所说的“鬼影”,所以加0xff是非常重要的。

        

        季节的围栏,毕竟还是锁不住斗转星移,时光流逝,如同那数码管跳动一般地消无声息,而你,又是否感受到了呢?学精数码管,为自己DIY一个数码管高精度时钟吧!

 

         本系列《MCU之心路分享》博文,本人尽自己微薄之力,以菜鸟的身份,写写初学者最详细,最具体的入门博客,本人自当也种是锻炼,仅仅如此简单容易,如有误之处,欢迎拍砖,本人不胜感激!

(说明:本人所用开发板为:麦光电子单片机开发板)

 

                                                                                                于2013年11月1日 夜

PARTNER CONTENT

文章评论9条评论)

登录后参与讨论

用户377235 2013-11-22 13:32

楼主用心了呀!赞一个

644398774_263592779 2013-11-11 23:46

同样,天天写实在没时间,但会常常上博客看看!

chen_zs2012_704941858 2013-11-11 06:51

做不到天天写

chen_zs2012_704941858 2013-11-11 06:50

最近没有时间写了,忙

644398774_263592779 2013-11-11 01:10

还是你厉害,每个月都写得很多!嘿嘿,,

chen_zs2012_704941858 2013-11-10 17:14

有时间写下很好

用户377235 2013-11-9 23:51

谢谢分享

644398774_263592779 2013-11-7 23:30

互相学习,写写博客当是一种锻炼

用户377235 2013-11-2 01:38

很好很强大。谢谢分享。。。

相关推荐阅读
流年一束光 2014-05-20 13:32
有时候,我也不知道我是否还能坚持下去
       退学?真的要退学么? 这个问题伴随着我整个大学,从第一天开始就一直到现在!       一面是对未来,或许说是梦想的追求,渐渐清晰地看见,并学会接受现实,走在自己选择未来的电子路...
流年一束光 2014-04-07 00:55
【博客大赛】MCU之心路分享-----前言
        如果你想要得到从未有过的东西,那就去做你从未做过的事情!!!                                                          ...
流年一束光 2014-04-07 00:46
【博客大赛】MCU之心路分享--倾听你的改变--AD/DA转换(十一)
         用勇气来改变可以改变的事情,用胸怀来接受不可改变的事情,用智慧来分辨两者的不同                                                  ...
流年一束光 2014-04-05 17:28
【博客大赛】MCU之心路分享—有种爱叫:IIC(十)
         在工科男的世界里,连IIC都能想象成浪漫的牵手,而一个对单片机充满热爱的工科男,有什么理由不去认识它,学会它,并去驾驭它啊!当然,在我知道的世界里,貌似大学老师从来都没有真正教过...
流年一束光 2014-03-20 00:34
【博客大赛】MCU之心路分享—你小小的心令我感动(九)
          如果说,学过单片机,却连单片机最小系统都没有焊接过或者搭建过!甚至连电烙铁都没有摸过,那是个多么巨大的笑话呀?          但现实不幸的是,这样的笑话,一直重演在许多...
流年一束光 2014-03-10 20:29
【博客大赛】MCU之心路分享—偷偷爱你--12864液晶(八)
       时隔3个月没有更新《MCU之心路分享》了,不知道我是否有幸,让胖螃蟹小编对我拍拍砖呢?嘿嘿…….这3个月,一直都没有离开过EDN,一直都潜伏着,这3个月中,见证,陪伴,小小地参与...
EE直播间
更多
我要评论
9
15
关闭 站长推荐上一条 /1 下一条