认识数码管动态原理与51单片机数码管动态显示74HC245芯片

 单片机数码管动态显示原理主要是通过控制数码管的位选和段选,实现不同数码管的动态显示。

首先,位选是指让哪一个数码管工作。在动态显示的过程中,我们可以轮流控制不同的数码管进行显示,比如先控制第一个数码管,然后控制第二个数码管,以此类推,实现动态显示[1][3]。

其次,段选是指让工作的数码管显示特定数字。在动态显示中,我们可以通过改变位选来控制不同的数码管亮灭,从而显示不同的数字。

 单片机动态数码管是一种常见的电子显示设备,主要由多个三极管和数码管组成。当需要显示数字时,单片机通过控制三极管的导通,使得数码管中的特定位数亮起,从而实现数字的显示。

动态显示的基本原理是,多个数码管显示数字的时候,我们实际上是轮流点亮数码管(一个时刻内只有一个数码管是亮的),利用人眼的视觉暂留现象(也叫做余辉效应),就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫做动态扫描。例如,有两个数码管,我们要显示"12"这个数字,先让高位的位选三极管导通,然后控制段选让其显示"1",延时一定时间后再让低位的位选三极管导通,然后控制段选让其显示"2"。把这个流程以一定的速度循环运行就可以让数码管显示出"12",由于交替速度非常快,人眼识别到的就是"12"这两位数字同时亮了。

在实现动态显示的过程中,我们需要注意的是,一个数码管需要点亮的时间非常短,一般来说,整体扫描时间 = 单个数码管点亮时间*数码管个数,答案是:10ms以内。当电视机和显示器还处在CRT(电子显像管)时代的时候,有一句很流行的广告语——“100Hz无闪烁”,没错,只要刷新率大于100Hz,即刷新时间小于10ms,就可以做到无闪烁,这也就是我们的动态扫描的硬性指标。

以上就是单片机动态数码管的基本概念和工作原理,希望对你有所帮助。 

在实现动态显示的过程中,我们需要利用单片机的延时功能。延时的长短会影响到显示的效果,延时长,会看到四个数码管依次显示1、2、3、4数字。延时短,会看到“静态”的1、2、3、4。但并不是静态的,因为其时间达到了微秒级,人眼不能分辨频率,造成的视觉暂留。

总的来说,通过位选和段选的控制,以及延时的调整,可以实现数码管的动态显示,给人一种所有数码管同时都在显示的视觉效果。 

  

 74HC245是一种八位双向电平转换器芯片,常用于驱动数码管的显示[4]。它的原理是,首先,数码管的共阴或共阳接口需要连接到74HC245芯片的输出引脚。共阴数码管的公共引脚连接到GND,而共阳数码管的公共引脚连接到Vcc。其次,74HC245芯片的输入引脚需要连接到微控制器或其他信号源的输出引脚。这些输入引脚被用来接收控制信号,用于选择是将数据从74HC245芯片的A端传输到B端,还是从B端传输到A端。接着,数据引脚D0-D7被连接到数码管的段选引脚,用于控制显示的数字或字符。通过设置相应的输入信号,可以选择传输的数据是十进制数字的编码还是其他字符的编码。最后,74HC245芯片的使能引脚(OE)用于控制芯片的输出是否有效[4]。

在实际操作中,单片机的IO口输出难以稳定,需要数码管与单片机连接需要增加驱动电路,例如使用74HC245[2]。例如,在开发板上,如果需要控制2个四位一体的共阴数码管显示,那么就需要使用2个74HC245芯片,每个74HC245芯片控制一个四位一体的共阴数码管。

在使用过程中,还需要注意,数码管动态显示,就是利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现的。 

 以下是一个简单的单片机数码管动态显示代码示例,使用的是8051微控制器和共阳极数码管。

```c
#include <reg52.h>

// 数码管段码定义
#define DIG_0 0x01
#define DIG_1 0x02
#define DIG_2 0x04
#define DIG_3 0x08
#define DIG_4 0x10
#define DIG_5 0x20
#define DIG_6 0x40
#define DIG_7 0x80

// 数码管位选定义
#define DIG_A 0x01
#define DIG_B 0x02
#define DIG_C 0x04
#define DIG_D 0x08

sbit LSA=P2^2; // A相输入口
sbit LSB=P2^3; // B相输入口
sbit LSC=P2^4; // C相输入口
sbit LSD=P2^5; // D相输入口

void delay(unsigned int t) { // 延时函数
    unsigned int i, j;
    for (i = t; i > 0; i--)
        for (j = 110; j > 0; j--);
}

void display() { // 数码管动态显示函数
    unsigned char code num[5] = {0xFD, 0xFE, 0xFF, 0xFB, 0xFC}; // 设置数码管显示内容
    unsigned int index;
    
    LS0 = 1; // 关闭消隐
    LS1 = 1;
    LS2 = 1;
    LS3 = 1;
    LS4 = 1;
    LS5 = 1;
    LS6 = 1;
    LS7 = 1;
    
    P0 = 0x00; // 设置数码管段码为0
    P2 = 0x0F; // 设置数码管位选为0
    _nop_(); // 空操作延时
    
    for (index = 0; index < 5; index++) {
        if (num[index]) {
            P0 = DIG_0 | DIG_A | DIG_B | DIG_C | DIG_D; // 选择数码管对应位数码管
            _nop_(); // 空操作延时
            
            P0 = DIG_1 | DIG_A | DIG_B | DIG_C | DIG_D; // 选择数码管对应位数码管
            _nop_(); // 空操作延时
            
            P0 = DIG_2 | DIG_A | DIG_B | DIG_C | DIG_D; // 选择数码管对应位数码管
            _nop_(); // 空操作延时
            
            P0 = DIG_3 | DIG_A | DIG_B | DIG_C | DIG_D; // 选择数码管对应位数码管
            _nop_(); // 空操作延时
            
            P0 = DIG_4 | DIG_A | DIG_B | DIG_C | DIG_D; // 选择数码管对应位数码管
            _nop_(); // 空操作延时
            
            P0 = DIG_5 | DIG_A | DIG_B | DIG_C | DIG_D; // 选择数码管对应位数码管
            _nop_(); // 空操作延时
            
            P0 = DIG_6 | DIG_A | DIG_B | DIG_C | DIG_D; // 选择数码管对应位数码管
            _nop_(); // 空操作延时
            
            P0 = DIG_7 | DIG_A | DIG_B | DIG_C | DIG_D; // 选择数码管对应位数码管
            _nop_(); // 空操作延时
        }
        
        delay(1000); // 延时1秒
    }
    
    P0 = 0x00; // 恢复数码管段码为0
    P2

 数码管动态显示软件编程需要使用微处理器或单片机来实现。以下是一个简单的数码管动态显示软件编程示例:

1. 连接数码管:将数码管的正极连接到单片机的一个输出口,将数码管的负极接地。

2. 设置数码管的段选:根据数码管的型号,设置数码管的段选。通常,数码管的段选由多个引脚组成,可以通过编程来控制。

3. 设置数码管的位选:根据数码管的位数,设置数码管的位选。通常,数码管的位数由多个引脚组成,可以通过编程来控制。

4. 显示数字:将需要显示的数字转换成二进制码,然后通过编程来控制数码管的段选和位选,从而显示出对应的数字。

5. 循环显示:通过循环读取数字并显示,从而实现动态显示。

以下是一个简单的数码管动态显示软件编程示例代码:

```
#include <8051.h>

// 数码管段选和位选的控制引脚
P1 = LED_PC0_PIN;
P2 = LED_PC1_PIN;

// 数码管的段选和位选
#define DIGIT0 0x01
#define DIGIT1 0x02
#define DIGIT2 0x04
#define DIGIT3 0x08
#define DIGIT4 0x10
#define DIGIT5 0x20
#define DIGIT6 0x40
#define DIGIT7 0x80

void delay(unsigned int time) { // 延时函数
    unsigned int i, j;
    for (i = 0; i < time; i++) {
        for (j = 0; j < 120; j++);
    }
}

void display() { // 显示函数
    P1 = DIGIT0; // 选择第一个数码管段选和位选
    P2 = DIGIT1;
    delay(50);
    
    P1 = DIGIT2; // 选择第二个数码管段选和位选
    P2 = DIGIT3;
    delay(50);
    
    P1 = DIGIT4; // 选择第三个数码管段选和位选
    P2 = DIGIT5;
    delay(50);
    
    P1 = DIGIT6; // 选择第四个数码管段选和位选
    P2 = DIGIT7;
    delay(50);
}

int main() {
    while (1) {
        display(); // 循环显示
    }
    return 0;
}
```

这只是一个简单的示例,实际应用中可能还需要考虑更多因素,如数码管的亮度调节、显示速度等。 

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值