资讯详情

单片机数码管显示原理

1.数字管的基本介绍

先给大家提供一张原理图,如图1所示。

图1数字管原理图

这是数码管的常见原理图,我们板上有6根数码管。LED学习小灯,学习,数字管的学习会容易得多。从图1可以看出,数字管是共有的a,b,c,d,e,f,g,dp事实上,这八段的每一段都是一段LED小灯,所以数码管是8个LED由小灯组成。让我们来看看数字管的内部结构图。

图2数字管结构图

数码管分为共阳数码管和共阴数码管,所谓的共阴数码管就是8只LED小灯的阴极是连接在一起的,即阴极是公共端,小灯是否亮灭由阳极控制。同理,共阳数码管是阳极接收在一起的,大家可以仔细研究下图1。细心的学生也会发现数字管上有两个com,其实是我们数码管的公共端。为什么有2 我个人认为,一方面有两个可以起到对称的作用,只有10个引脚。另一方面,公共端通过的电流很大,我们在初中就学会了。并联电路电流之和等于总电流,使用两个com将公共电流平均上升到两个引脚上,以减少线路承受的电流。

从我们板子的电路图可以看出,我们使用的数码管是共阳数码管,如图所示。

图3共阳数码管电路

他们的com当然,上,当然,和,LED小灯电路相似,也是74HC138控制了三极管的导通来控制整个数字管的电流。让我们先看看DS这个数字管。原理图上可以看到控制DS1的三极管是Q17,控制Q17的引脚是LEDS0,对应到74HC138上边就是Y0端的输出。

图474HC138控制图

我们现在的目的是让步LEDS这个引脚输出低电平,相信大家现在可以根据之前学到的内容独立把握ADDR0,ADDR1,ADDR2,ADDR3,ENLED这4个输入状态写出来,现在大家不要偷懒,都去根据138的手册去写一下,不需要你记住这些结论,但是遇到就写一次,锻炼过几次后,当你遇到类似的芯片时,你知道如何解决问题。

数字管通常用来显示数字。我们板上的6个数字管通常被称为6位。控制位选择74HC138。数码管内部有8个LED我们称小灯为数码管段,所以数码管段的选择(即该段的亮灭)是通过的P74后0口控制HC245驱动。

2、数码管的真值表

我们直接将数字管的8段视为8段LED控制小灯,那就是a、b、c、d、e、f、g、dp一共8个LED小灯。如果我们点亮们可以很容易地看到,如果我们点亮b和c这两个LED小灯,即数码管的b段和c段,如果所有其他段都熄灭,可以让数码管DS1显示一个数字1,所以这个时候其实是P0值的二进制是0b1111001,16进制xF9。然后我们写一个程序,看看数字管显示。

#include///包含寄存器的库文件

sbitADDR0=P1^0;

sbitADDR1=P1^1;

sbitADDR2=P1^2;

sbitADDR3=P1^3;

sbitENLED=P1^4;

voidmain()

{

unsignedcharj=0;

unsignedinti=0;

ENLED=0;

ADDR0=0;

ADDR1=0;

ADDR2=0;

ADDR3=1;//74HC138开启三极管Q17

while(1)///程序死循环

{

P0=0xF9;//打开数码管b和c段

}

}

编译此程序,下载到单片机中,您会发现最右边的数字管成功显示1。

同样,我们可以成功地在数字管上显示其他数字,并且数字管显示的数字是相应的P0的赋值,我们称之为数字管的真值表。让我们列出我们电路图中的数字管真值表。请注意,这个真值表中显示的数字没有小数点。

表1数字管真值表

数字

0

1

2

3

4

5

6

7

真值表

0xC0

0xF9

0xA4

0xB0

0x99

0x92

0x82

0xF8

数字

8

9

A

B

C

D

E

F

真值表

0x80

0x90

0x88

0x83

0xC6

0xA1

0x86

0x8E

大家可以把上边那个数码管显示1的那个程序中的P0的赋值随便修改成我们表5-1中的真值表里的数字试试看,把数码管显示的数字显示出来。

3、数码管的静态显示

从第三课我们学习74HC138以后,我们了解到74HC138同时一次只能让一个输出口为低电平,也就是在一个时刻内,我们只能让一个数码管显示,始终选通数码管并且可以根据我们的P0总线的信号来改变这个数码管的值,我们可以理解为数码管的静态显示。

数码管静态显示是对应动态显示而言的,静态显示对于一两个数码管还行,多个数码管,静态显示实现的意义就没有了。这节课我们先用一个数码管的静态显示来实现一个简单的秒表,为下节课的动态显示打下基础。

先来介绍一个51单片机的关键字code。我们前边课程定义变量的时候,一般用到unsigned char或者unsigned int这两个关键字,这样定义的变量都是放在我们的单片机的RAM中,我们在程序中可以随意去改变这个变量的值。但是还有一种常数,我们在程序中要使用,但是却不进行对这个值的改变,这种值我们可以加一个code关键字修饰一下,修饰完毕后,这个值就会存储到我们的程序空间flash中,这样可以大大节省我们单片机的RAM的使用量,毕竟我们的RAM空间比较小,而程序空间是很大的。比如我们现在要使用的数码管真值表,我们来看一下我们下边的这个程序。

#include               //包含寄存器的库文件                   

sbit  LED = P0^0;

sbit  ADDR0 = P1^0;

sbit  ADDR1 = P1^1;

sbit  ADDR2 = P1^2;

sbit  ADDR3 = P1^3;

sbit  ENLED = P1^4;

unsigned char code LedChar[] = {

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e

};                  //用数组来存储数码管真值表,下一课详细介绍数组

void main()

{

    unsigned char counter = 0;

    unsigned char j = 0;

    ENLED = 0; ADDR0 = 0; ADDR1 = 0;

     ADDR2 = 0; ADDR3 = 1; P0 = 0XFF;  //74HC138和P0初始化部分

     TMOD = 0x01;                    //设置定时器0为模式1

     TH0  = 0xB8;

    TL0  = 0x00;                   //定时值初值

     TR0  = 1;                      //打开定时器0

    while(1)

    {

        if(1 == TF0)                 //判断定时器0是否溢出

        {

            TF0 = 0;

            TH0 = 0xB8;              //溢出后,重新赋值

            TL0 = 0x00;

            counter++;

            if(50 == counter)      //判断定时器0溢出是否达到50次

            {

                counter = 0;        //counter清0,重新计数

                P0 = LedChar[j++]; //把数组里的对应值送给P0

                if(16 == j)         //当显示到F后,归0重新开始

                {

                     j = 0;

                }

             }

         }

    }

}

文章来源于网络,版权归原作者

觉得不错,请点个赞

 

标签: 三极管dp3080

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台