tag 标签: 8段数码管

相关博文
  • 热度 33
    2013-12-25 13:55
    2028 次阅读|
    3 个评论
    74HC595 是 8 位串行输入串 / 并行输出的锁存移位寄存器。它的串入并出特性,非常适合驱动 8 段数码管;串入串出特性,非常适合首尾串联。 8 段数码管采用共阴或者共阳都可以,因为 74HC595 的吸入 / 灌出电流均达到 20mA 。   它的使用方法也很简单,并行输出接到 8 段数码管上,串行输入与输出首尾连接即可。单片机提供第一个 74HC595 的串行输入,最后一个 74HC595 的串行输出悬空。所有的 74HC595 共用 2 根时钟线、 1 根使能线。因此,理想情况下单片机提供 4 个 IO 口,能驱动后续的无限多个 74HC595 。原理图如下: 但实际情况下, 74HC595 驱动 8 段数码管,究竟最多能串联多少呢? 换一种问法: 第一,电路板能够通过的最大电流? 第二,推挽输出能够驱动多少个高阻态输入? 第三,推挽输出可以传输多长距离? 第四,末端位置的电源线和地线的变化? (图中左端的数码管比右端稍暗,是因为限流电阻的关系。所处的位置对它的亮度影响不大。)   第一,电路板能够通过的最大电流? 限流电阻取 1K 时,每个 74HC595 大概需要 8mA 的电流。 电源线宽度为 25mil ,铜层厚度为 1oz ,则最大电流为 1.7A 。 因此,可以串联的 74HC595 个数为 1.7A/8mA=212 个。   第二,推挽输出能够驱动多少个高阻态输入? 典型的推挽输出,驱动能力为 4mA 。 74HC595 的技术手册上,高阻态输入的漏电流为 1uA 。 一个推挽输出至少可以驱动 4000 个高阻态输入引脚。换言之,单片机的 IO 口可以驱动 4000 个 74HC595 。 (实际上,IO口在电平快速切换的时候,比静态驱动的情况要稍微复杂一些,需要进行阻抗匹配的处理。)   第三,推挽输出可以传输多长距离? 推挽输出为 TTL 电平,使用它传输信号,距离一般不会超过 2 米。这不是受 TTL 电平的驱动能力限制,而是因为它需要对地参考,所以很容易受到环境的干扰。 如果工作环境的干扰很小,传输距离可以更长一些。   第四,末端位置的电源线和地线的变化? 串联 60 个 74HC595 小电路板,以 500ms 时间间隔显示 0 ~ 9 ,实测发现:当数码管熄灭时,最末端供电电压为 +5V ;当数码管点亮时,最末端供电电压为 +2.91V 。 74HC595 的最低工作电压在 +2V 。因此设每个 74HC595 电路板的线上电阻为 R ,串联个数为 x ,则有: x*R*(8mA*x/2)=U x=60 , U=2.1 ,因此 R=0.146 。 U=3V 时, x=71 。 因此,受线上压降和 74HC595 的最低工作电压限制,能够串联的个数限制为 71 。   结论: 综合以上四点,可以知道 74HC595 驱动 8 段数码管最大串联数量为 71 。 而实际上,通过将电源和地线变得更加短粗,并且选择更好的接插件,可以减少线上电阻,从而降低线上压降;而且由于很少会同时点亮数码管的所有段,所以实际上能够串联的个数比 71 还要更多一些。
  • 热度 27
    2013-12-25 13:21
    1923 次阅读|
    0 个评论
    问题:当多个数码管串联时,不论是多少个,为什么处在末端的几个模块都有可能出现乱码?   使用示波器的 10x 探头观察,会发现高速时钟线上会出现驻波 (standing wave) 。其实信号线上都会有驻波,只是强度大小不同而已。 驻波强度和信号的 0/1 频率没有关系,而是上升下降斜率的频率有关。   一般来说,判断电平值的信号线,驻波并没有多大的影响;但是读取边沿的信号线,驻波的影响就不可忽视。驻波造成了 74HC595 的时钟线读取错误:本来应该读取 1 个数据的时候,它读取了多个进去。   解决方法有两个: 第一,降低信号线频率,将 GPIO_Speed_50MHz 改为 GPIO_Speed_2MHz 。 降低了信号线频率,驻波的强度也会随之降低,原来会出现的乱码现象也会消失。 从前我一直不明白,既然 STM 能够做到 50MH 的 IO 口操作频率,为什么还要提供 2M 、 10M 、 50M 三种选项呢?直接都设置成 50MHz 不就可以了吗? 原来它们是有各自适用的范围的。     第二,使用 GPIO_Speed_50MHz 频率,但是在信号线上串联一个 68 ohms 的电阻。 在高速时钟线上,阻抗不匹配会导致信号的反射,也就是信号的振铃效应。一般来说,对直流通路而言,输出引脚的阻抗较低,而输入引脚的阻抗较高;在高速频率下,传输线还具备大概认为是 50 ohms 的特征阻抗。信号遇到高阻抗的输入引脚,反射回来叠加到输出引脚上,形成驻波。因此,通常在高速时钟线上串联一个 47 ohms ~ 100 ohms 的电阻,吸收掉它。 如果串联的电阻为 10 欧姆 ,信号振铃几乎没有改善; 如果串联的电阻为 120 欧姆 ,信号变形严重; 如果串联的电阻为 68 欧姆 ,信号振铃得道很好的改善。      
  • 热度 21
    2013-12-24 14:58
    2904 次阅读|
    0 个评论
    //使用STM32F103作为MCU,74HC595驱动8段数码管的程序 #define HC595_OE_H()          GPIO_SetBits(GPIOB, GPIO_Pin_12) #define HC595_OE_L()        GPIO_ResetBits(GPIOB, GPIO_Pin_12) #define HC595_RCK_H()          GPIO_SetBits(GPIOB, GPIO_Pin_13) #define HC595_RCK_L()        GPIO_ResetBits(GPIOB, GPIO_Pin_13) #define HC595_SCK_H()          GPIO_SetBits(GPIOB, GPIO_Pin_14) #define HC595_SCK_L()        GPIO_ResetBits(GPIOB, GPIO_Pin_14) #define HC595_DAT_H()          GPIO_SetBits(GPIOB, GPIO_Pin_15) #define HC595_DAT_L()        GPIO_ResetBits(GPIOB, GPIO_Pin_15) void HC595_init(void) {     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_Init(GPIOB, GPIO_InitStructure);     GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);     HC595_start(); } void HC595_start(void) {     HC595_OE_L(); } void HC595_stop(void) {     HC595_OE_H(); } void HC595_shift_byte(uint8_t byte) {     uint8_t i = 0;     for (i = 0; i 8; i++) {         if (byte 0x80)             HC595_DAT_L();         else             HC595_DAT_H();         HC595_SCK_L();         HC595_SCK_H();         byte = byte 1;     }     HC595_RCK_L();     HC595_RCK_H(); } //每执行HC595_shift_byte一次,串联起来的8段数码管就会将自己的显示往左边推移一位; //HC595_shift_byte的入口参数byte的二进制,刚好对应8段数码管的段位; //是不是很森破呢~