0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >基础知识 > 搞定138译码器(14),基于74hc138译码器的驱动数码管

搞定138译码器(14),基于74hc138译码器的驱动数码管

来源: 21ic
2020-12-24
类别:基础知识
eye 21
文章创建人 拍明

原标题:搞定138译码器(14),基于74hc138译码器的驱动数码管

74HC138是一款高速CMOS 3线-8线译码器/多路复用器,具有低功耗、高速度的特点,广泛应用于数字电路中,特别是在需要控制多个设备的场合,如驱动数码管显示。以下是基于74HC138译码器驱动数码管的设计指南。

一、74HC138译码器简介

  • 功能特点

    • 3个二进制输入(A、B、C),8个低电平有效输出(Y0-Y7)。

    • 3个使能输入端(E1、E2、E3),其中E1和E2为低电平有效,E3为高电平有效。只有当E1和E2为低电平,且E3为高电平时,译码器才工作。

    • 输出为低电平有效,即当某个输出被选中时,该输出端为低电平,其余输出端为高电平。

  • 典型应用

    • 用于地址译码,将3位二进制地址解码为8条输出线中的一条。

    • 作为多路复用器的控制信号源,控制多个设备(如数码管)的选通。

二、数码管驱动原理

  • 数码管类型

    • 数码管分为共阴极和共阳极两种类型。共阴极数码管的各段发光二极管的阴极相连,共阳极数码管的各段发光二极管的阳极相连。

    • 在驱动时,需要根据数码管的类型选择相应的驱动方式。

  • 动态扫描显示

    • 当需要驱动多个数码管时,为了节省I/O端口,通常采用动态扫描显示方式。

    • 通过轮流选通每个数码管,并快速切换显示的数字,利用人眼的视觉暂留效应,使人感觉所有数码管都在同时显示。

三、基于74HC138的数码管驱动设计

1. 硬件连接

  • 输入连接

    • 将74HC138的输入端A、B、C连接到单片机的三个I/O端口,用于控制译码器的输出。

  • 输出连接

    • 将74HC138的输出端Y0-Y7分别连接到8个数码管的公共端(共阴极数码管接低电平有效端,共阳极数码管需通过反相器连接)。

    • 数码管的各段发光二极管连接到单片机的其他I/O端口,用于控制显示的数字。

  • 使能端配置

    • 将E1和E2接地(低电平),E3接高电平,使译码器处于工作状态。

2. 软件设计

  • 定时器中断

    • 使用单片机的定时器中断功能,产生定时信号,用于控制数码管的动态扫描。

    • 在中断服务程序中,依次选通每个数码管,并发送相应的段码数据。

  • 段码数据

    • 根据需要显示的数字,预先定义好每个数字的段码数据。例如,对于共阴极数码管,数字“0”的段码为0x3F(二进制:00111111)。

    • 将段码数据存储在数组中,方便在程序中调用。

  • 显示函数

    • 编写显示函数,用于控制数码管的选通和段码数据的发送。

    • 在每次定时器中断时,调用显示函数,更新数码管的显示内容。

QQ_1740733463825.png

3. 示例代码(以51单片机为例)

c复制代码


#include <reg51.h>



// 定义数码管段选数据(共阴极,0表示亮,1表示灭)

unsigned char code digit[] = {

0x3F, // 0

0x06, // 1

0x5B, // 2

0x4F, // 3

0x66, // 4

0x6D, // 5

0x7D, // 6

0x07, // 7

0x7F, // 8

0x6F  // 9

};



// 定义74HC138的输入端口

sbit A = P3^0;

sbit B = P3^1;

sbit C = P3^2;



// 定义数码管的段选端口(假设连接在P2端口)

sbit SEG_A = P2^0;

sbit SEG_B = P2^1;

sbit SEG_C = P2^2;

sbit SEG_D = P2^3;

sbit SEG_E = P2^4;

sbit SEG_F = P2^5;

sbit SEG_G = P2^6;



// 定时器初始化

void Timer0_Init() {

TMOD = 0x01; // 定时器0模式1,16位定时器

TH0 = 0xFC;  // 设置定时器初值

TL0 = 0x66;

ET0 = 1;     // 使能定时器0中断

EA = 1;      // 开启总中断

TR0 = 1;     // 启动定时器0

}



// 数码管显示函数

void display_digit(unsigned char position, unsigned char number) {

// 根据数字选择相应的段选数据

unsigned char seg = digit[number];

SEG_A = (seg >> 0) & 0x01;

SEG_B = (seg >> 1) & 0x01;

SEG_C = (seg >> 2) & 0x01;

SEG_D = (seg >> 3) & 0x01;

SEG_E = (seg >> 4) & 0x01;

SEG_F = (seg >> 5) & 0x01;

SEG_G = (seg >> 6) & 0x01;



// 选择要显示的数码管位置(通过74HC138)

switch(position) {

case 0: A = 0; B = 0; C = 0; break;

case 1: A = 0; B = 0; C = 1; break;

case 2: A = 0; B = 1; C = 0; break;

case 3: A = 0; B = 1; C = 1; break;

case 4: A = 1; B = 0; C = 0; break;

case 5: A = 1; B = 0; C = 1; break;

case 6: A = 1; B = 1; C = 0; break;

case 7: A = 1; B = 1; C = 1; break;

}

}



// 定时器中断服务函数

void Timer0_ISR(void) interrupt 1 {

static unsigned char pos = 0; // 当前显示的数码管位置

static unsigned char digits[8] = {0, 1, 2, 3, 4, 5, 6, 7}; // 存储显示的每一位数字



// 选择并显示当前数码管

display_digit(pos, digits[pos]);



// 更新显示的数码管位置

pos++;

if (pos == 8) pos = 0; // 8个数码管显示完后重新从第一个开始

}



void main() {

Timer0_Init(); // 初始化定时器0



while(1) {

// 主循环,可以添加其他逻辑

}

}

四、总结

基于74HC138译码器的数码管驱动设计,通过合理利用译码器的输出控制数码管的选通,结合单片机的定时器中断和段码数据,实现了多个数码管的动态扫描显示。这种设计方法不仅节省了I/O端口资源,还提高了系统的可靠性和灵活性。在实际应用中,可以根据需要调整数码管的显示内容和显示方式,满足不同的设计要求。

74HC138是一款高速CMOS 3线-8线译码器/多路复用器,具有低功耗、高速度的特点,广泛应用于数字电路中,特别是在需要控制多个设备的场合,如驱动数码管显示。以下是基于74HC138译码器驱动数码管的设计指南。

一、74HC138译码器简介

  • 功能特点

    • 3个二进制输入(A、B、C),8个低电平有效输出(Y0-Y7)。

    • 3个使能输入端(E1、E2、E3),其中E1和E2为低电平有效,E3为高电平有效。只有当E1和E2为低电平,且E3为高电平时,译码器才工作。

    • 输出为低电平有效,即当某个输出被选中时,该输出端为低电平,其余输出端为高电平。

  • 典型应用

    • 用于地址译码,将3位二进制地址解码为8条输出线中的一条。

    • 作为多路复用器的控制信号源,控制多个设备(如数码管)的选通。

二、数码管驱动原理

  • 数码管类型

    • 数码管分为共阴极和共阳极两种类型。共阴极数码管的各段发光二极管的阴极相连,共阳极数码管的各段发光二极管的阳极相连。

    • 在驱动时,需要根据数码管的类型选择相应的驱动方式。

  • 动态扫描显示

    • 当需要驱动多个数码管时,为了节省I/O端口,通常采用动态扫描显示方式。

    • 通过轮流选通每个数码管,并快速切换显示的数字,利用人眼的视觉暂留效应,使人感觉所有数码管都在同时显示。

三、基于74HC138的数码管驱动设计

1. 硬件连接

  • 输入连接

    • 将74HC138的输入端A、B、C连接到单片机的三个I/O端口,用于控制译码器的输出。

  • 输出连接

    • 将74HC138的输出端Y0-Y7分别连接到8个数码管的公共端(共阴极数码管接低电平有效端,共阳极数码管需通过反相器连接)。

    • 数码管的各段发光二极管连接到单片机的其他I/O端口,用于控制显示的数字。

  • 使能端配置

    • 将E1和E2接地(低电平),E3接高电平,使译码器处于工作状态。

2. 软件设计

  • 定时器中断

    • 使用单片机的定时器中断功能,产生定时信号,用于控制数码管的动态扫描。

    • 在中断服务程序中,依次选通每个数码管,并发送相应的段码数据。

  • 段码数据

    • 根据需要显示的数字,预先定义好每个数字的段码数据。例如,对于共阴极数码管,数字“0”的段码为0x3F(二进制:00111111)。

    • 将段码数据存储在数组中,方便在程序中调用。

  • 显示函数

    • 编写显示函数,用于控制数码管的选通和段码数据的发送。

    • 在每次定时器中断时,调用显示函数,更新数码管的显示内容。

3. 示例代码(以51单片机为例)

c复制代码


#include <reg51.h>



// 定义数码管段选数据(共阴极,0表示亮,1表示灭)

unsigned char code digit[] = {

0x3F, // 0

0x06, // 1

0x5B, // 2

0x4F, // 3

0x66, // 4

0x6D, // 5

0x7D, // 6

0x07, // 7

0x7F, // 8

0x6F  // 9

};



// 定义74HC138的输入端口

sbit A = P3^0;

sbit B = P3^1;

sbit C = P3^2;



// 定义数码管的段选端口(假设连接在P2端口)

sbit SEG_A = P2^0;

sbit SEG_B = P2^1;

sbit SEG_C = P2^2;

sbit SEG_D = P2^3;

sbit SEG_E = P2^4;

sbit SEG_F = P2^5;

sbit SEG_G = P2^6;



// 定时器初始化

void Timer0_Init() {

TMOD = 0x01; // 定时器0模式1,16位定时器

TH0 = 0xFC;  // 设置定时器初值

TL0 = 0x66;

ET0 = 1;     // 使能定时器0中断

EA = 1;      // 开启总中断

TR0 = 1;     // 启动定时器0

}



// 数码管显示函数

void display_digit(unsigned char position, unsigned char number) {

// 根据数字选择相应的段选数据

unsigned char seg = digit[number];

SEG_A = (seg >> 0) & 0x01;

SEG_B = (seg >> 1) & 0x01;

SEG_C = (seg >> 2) & 0x01;

SEG_D = (seg >> 3) & 0x01;

SEG_E = (seg >> 4) & 0x01;

SEG_F = (seg >> 5) & 0x01;

SEG_G = (seg >> 6) & 0x01;



// 选择要显示的数码管位置(通过74HC138)

switch(position) {

case 0: A = 0; B = 0; C = 0; break;

case 1: A = 0; B = 0; C = 1; break;

case 2: A = 0; B = 1; C = 0; break;

case 3: A = 0; B = 1; C = 1; break;

case 4: A = 1; B = 0; C = 0; break;

case 5: A = 1; B = 0; C = 1; break;

case 6: A = 1; B = 1; C = 0; break;

case 7: A = 1; B = 1; C = 1; break;

}

}



// 定时器中断服务函数

void Timer0_ISR(void) interrupt 1 {

static unsigned char pos = 0; // 当前显示的数码管位置

static unsigned char digits[8] = {0, 1, 2, 3, 4, 5, 6, 7}; // 存储显示的每一位数字



// 选择并显示当前数码管

display_digit(pos, digits[pos]);



// 更新显示的数码管位置

pos++;

if (pos == 8) pos = 0; // 8个数码管显示完后重新从第一个开始

}



void main() {

Timer0_Init(); // 初始化定时器0



while(1) {

// 主循环,可以添加其他逻辑

}

}

四、总结

基于74HC138译码器的数码管驱动设计,通过合理利用译码器的输出控制数码管的选通,结合单片机的定时器中断和段码数据,实现了多个数码管的动态扫描显示。这种设计方法不仅节省了I/O端口资源,还提高了系统的可靠性和灵活性。在实际应用中,可以根据需要调整数码管的显示内容和显示方式,满足不同的设计要求。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

资讯推荐
云母电容公司_云母电容生产厂商

云母电容公司_云母电容生产厂商

开关三极管13007的规格参数、引脚图、开关电源电路图?三极管13007可以用什么型号替代?

开关三极管13007的规格参数、引脚图、开关电源电路图?三极管13007可以用什么型号替代?

74ls74中文资料汇总(74ls74引脚图及功能_内部结构及应用电路)

74ls74中文资料汇总(74ls74引脚图及功能_内部结构及应用电路)

芯片lm2596s开关电压调节器的中文资料_引脚图及功能_内部结构及原理图_电路图及封装

芯片lm2596s开关电压调节器的中文资料_引脚图及功能_内部结构及原理图_电路图及封装

芯片UA741运算放大器的资料及参数_引脚图及功能_电路原理图?ua741运算放大器的替代型号有哪些?

芯片UA741运算放大器的资料及参数_引脚图及功能_电路原理图?ua741运算放大器的替代型号有哪些?

28nm光刻机卡住“02专项”——对于督工部分观点的批判(睡前消息353期)

28nm光刻机卡住“02专项”——对于督工部分观点的批判(睡前消息353期)

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告