数码管的基本介绍与在80c51单片机上使用数码管。

基本介绍

数码管简介

数码管是一种可以显示数字和其他信息的电子设备。

数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示)。数码管通常为”8“字形,按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管。

数码管按照连接方式,分为共阳极共阴极两种。

Proteus中的数码管

在Proteus中,有许多种数码管可供选择,以7段数码管为例,7段数码管有8个引脚,7个引脚是控制各段LED的亮灭,剩下一个为共阴或共阳的引脚,数码管的引脚与每段LED的关系如图(数字代表引脚按从上到下或从左到右的顺序编号):

示意图

但是在Proteus中还有一个特殊的数码管:BCD译码数码管,该数码管只有4个引脚,数码管内置的芯片会根据4个引脚输入的二进制数据转换成十六进制数,在数码管上显示。

相关链接s

CSDN:好玩的单片机——数码管原理(一)

知乎:【单片机自学】3.数码管静态及动态显示

数码管的使用

在80c51单片机上,分别使用BCD译码数码管与共阴极数码管按照0、1、2、3、···、F、0、1、... 循环显示数字。

BCD译码数码管显示数字

最简单的做法是把数码管直接与单片机的并行口的低四位连接,再向对应的并行口的低四位进行赋值就可以实现,比较简单。

共阴极数码管显示数字

相对于BCD译码数码管显示数字更加复杂,需要自己对想要显示的数字进行编码,才能让数码管显示对应的数字,而编码方式需要根据引脚接线来设计。

原理图部分

左边为BCD译码数码管,右边为共阴极数码管

原理图

代码部分

对数据编码

对于上方所示的数码管接线方式,设计出下方的编码表:

数字1(P2.0)2(P2.1)3(P2.2)4(P2.3)5(P2.4)6(P2.5)7(P2.6)8(P2.7)编码值
01111011063(0x3F)
1011000006(0x06)
21101101091(0x5B)
31111001079(0x4F)
略...

数字为显示的数字,1(P2,0) ...为LED段与对应的引脚和单片机并行接口的电平,编码值为编码后单片机应给对应并行口输出的字节值

编码函数

根据编码表设计出编码函数如下:

//输入要转换的数字,范围为0~15,超过范围返回0x00
char DT_Convert(char numb){
    switch(numb){
        case 0:
            return 0x3F;
        case 1:
            return 0x06;
        case 2:
            return 0x5B;
        case 3:
            return 0x4F;
        case 4:
            return 0x66;
        case 5:
            return 0x6D;
        case 6:
            return 0x7D;
        case 7:
            return 0x07;
        case 8:
            return 0x7F;
        case 9:
            return 0x6F;
        case 10:
            return 0x77;
        case 11:
            return 0x7C;
        case 12:
            return 0x39;
        case 13:
            return 0x5E;
        case 14:
            return 0x79;
        case 15:
            return 0x71;
        default:
            return 0x00;
    }
}

完整代码

该代码在keil 5中编译通过

#include <reg51.h>

//BCD译码数码管显示数字
void DT1_Show(char numb){
    P1=numb;
}

//输入要转换的数字,范围为0~15,超过范围返回0x00
char DT_Convert(char numb){
    switch(numb){
        case 0:
            return 0x3F;
        case 1:
            return 0x06;
        case 2:
            return 0x5B;
        case 3:
            return 0x4F;
        case 4:
            return 0x66;
        case 5:
            return 0x6D;
        case 6:
            return 0x7D;
        case 7:
            return 0x07;
        case 8:
            return 0x7F;
        case 9:
            return 0x6F;
        case 10:
            return 0x77;
        case 11:
            return 0x7C;
        case 12:
            return 0x39;
        case 13:
            return 0x5E;
        case 14:
            return 0x79;
        case 15:
            return 0x71;
        default:
            return 0x00;
    }
}

//共阴极数码管显示数字
void DT2_Show(char numb){
    P2=DT_Convert(numb);
}

//延时1秒
void Delay(){
    unsigned int i=100000;
      while(--i);
}

void main(){
    char Count=0;
    while(1){
        DT1_Show(Count);
        DT2_Show(Count);
        if(Count>15){
            Count=0;
            continue;
        }
        ++Count;
        Delay();
    }
}

结语

数码管的使用还是比较简单的,主要难点在于要了解各个引脚于LED的对应关系。

Last modification:May 18th, 2020 at 10:59 am