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


原标题:搞定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)。
将段码数据存储在数组中,方便在程序中调用。
显示函数:
编写显示函数,用于控制数码管的选通和段码数据的发送。
在每次定时器中断时,调用显示函数,更新数码管的显示内容。
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)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。