晁红叶 发表于 2025-6-8 19:14:13

定时器与数码管之数码管

数码管的基本介绍


数码管共有 a、b、c、d、e、f、g、dp 八段,每一段都是一个LED灯,所以一个数码管是由8个LED灯组成的

数码管分为共阳极和共阴极两种。
共阴极就是8个LED灯的阴极连接在一起,阴极是公共端,由阳极来控制单个小灯的亮灭
共阳极就是8个LED灯的阳极连接在一起,阳极是公共端,由阴极来控制单个小灯的亮灭

以上是板子的数码管电路图
板子上的数码管都是共阳极数码管,数码管的阳极都接在了com端上
数码管的真值表

以DS6数码管为例分析:
控制DS6的是三极管Q7,需要LEDS5为低电平,三极管Q7才可以道通

ENLED为低电平,ADDR3为高电平,74HC138才能使能
ADDR2为高电平,ADDR1为低电平,ADDR0为高电平时,LEDS5为低电平,此时Q7导通
 
b、c段LED亮灯时,数码管将显示1,即P0 = 0xF9时,数码管显示1
#include<reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main(void)
{
        //74HC138使能
        ENLED = 0;
        ADDR0 = 1;


        //Q7导通
        ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 1;

        P0 = 0xF9;//数码管b、c段亮,即显示1

        while(1)
                ;
}按此方法依次得出数码管的真值表:
数码管真值表1字符01234567数值0xC00xF90xA40xB00x990x920x820xF8数码管真值表2字符89AbCdEF数值0x800x900x880x830xC60xA10x860x8E数码管的静态显示

数码管的静态显示:74HC138同一时刻只能让一个输出口为低电平,也就是说在一个时刻内,只能使能一个数码管,并根据给出的P0的值来改变这个数码管的显示字符
数码管的静态显示是对应动态显示而言的,静态显示对于一两个数码管还行,对于多个数码管,静态显示就没有意义了
code:51单片机的关键字

unsigned char 定义的变量放在单片机的ARM中,在程序中可以随意改变这些变量的值
在程序中要使用,却不会改变值,定义这种数据时可以加上一个code关键字修饰一下,这个数据就会存储到程序空间Flash中,这样子就可以大大减少单片机的RAM的使用量
 
#include<reg52.h>

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(void)
{
        unsigned cnt;//溢出次数
        int i;

        //74HC138使能
        ENLED = 0;
        ADDR0 = 1;

        //Q7导通
        ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 1;

        TMOD = 1;//To设置为模式0

        //设置T0初始值
        TH0 = 0xB4;
        TL0 = 0x00;

        TR0 = 1;//启动T0
    cnt = 0;
        i = 0;

        while(1)
        {
                if (1 == TF0)//溢出
                {
                        //设置T0初始值
                        TF0 = 0;
                        TH0 = 0xB4;
                        TL0 = 0x00;

                        cnt++;

                        //溢出1s
                        if (cnt >= 20)
                        {
                                cnt = 0;

                                if (16 == i)
                                        i = 0;

                                P0 = LedChar;
                                i++;
                        }
                }
        }
}数码管将从0显示到F,间隔1s,重复显示

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 定时器与数码管之数码管