本章所要实现的功能是:控制动态数码管从左至右显示数字 0-7。学习本章可以参考
前面的实验章节内容。本章分为如下几部分内容:
1 数码管介绍
2 74HC245 和 74HC138 芯片介绍
3 硬件设计
4 软件设计
5 实验现象
1.数码管介绍
1.1 多位数码管简介
多位数码管,即两个或两个以上单个数码管并列集中在一起形成一体的数码管。当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线(a-dp)全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可以控制这个能点亮数码管亮什么数字,通常我们把公共端叫做“位选线”,连接在一起的段线叫做“段选线”,有了这两个线后,通过单片机及外部驱动电路就可以控制任意的数码管显示任意的数字了。
我们开发板上使用了 2 个四位一体的共阴数码管,这样可在上面同时显示 8
个数值。
1.2 数码管动态显示原理
动态显示,就是利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现的。比如在第一次选中第一位数码管时,给段选数据 0,下一次位选中第二位数码管时显示 1。为了在显示 1 的时候,0 不会消失(当然实际上是消失了),必须在人肉眼观察不到的时间里再次点亮第一次点亮的 0。而这时就需要记住,人的肉眼正常情况下只能分辨变化超过 24ms 间隔的运动。也就是说,在下一次点亮 0 这个数字的时间差不得大于 24ms。这时就会发现,数码管点亮是在向右或者向左一位一位点亮,形成了动态效果。如果把间隔时间改长就能直接展现这一现象。
2. 74HC245 和 74HC138 芯片介绍
2.1 74HC245 芯片简介
要使单片机能控制开发板上 2 位一体的共阴数码管显示,仅靠单片机 IO 口来驱动是不行的,这里就需要增加外部驱动芯片,开发板上使用的是 74HC245 芯片。
74HC245 是一种三态输出、八路信号收发器,主要应用于大屏显示,以及其
它的消费类电子产品中增加驱动。
(1)主要特性
①采用 CMOS 工艺
②宽电压工作范围:3.0V-5.0V
③双向三态输出141
④八线双向收发器
⑤封装形式:SOP20、SOP20-2、TSSOP20、DIP20
(2)管脚功能定义
从上面的管脚功能定义说明及真值表可以知道该芯片使用方法很简单,给 OE使能管脚低电平,DIR 管脚为高电平传输方向是 A->B 输出,DIR 为低电平传输方向是 B->A,至于输出高电平还是输出低电平取决于输入端的状态,如果输入为低电平,输出即为低;输入为高电平,输出即为高。如果 OE 使能管脚为高电平,不论 DIR 管脚是高还是低,输出是高组态。通常我们使用 74HC245 芯片用作驱动只会让其在一个方向输出,即 DIR 管脚为高电平,传输方向是 A->B。
2.2 74HC138 芯片简介
2 个 4 位一体的共阴数码管的位选线有 8 根,
直接让单片机 IO 口控制是没有任何问题的,但考虑到 51 单片机 IO 口资源的限
制,通常我们会使用一种 IO 扩展芯片,比如 74HC138、74HC164、74HC595 芯片
等,只需要很少的单片机 IO 口就可以扩展出 8 个控制口,通过级联方式甚至可
扩展出更多的控制口(这个在后面 LED 点阵实验章节中会有详细介绍)。我们开
发板上使用的是 74HC138 译码器芯片,只需单片机 3 个 IO 口就可以实现 8 个位
选管脚的控制,节省了芯片的 IO 资源。
74HC138D 是一种三通道输入、八通道输出译码器,主要应用于消费类电子产品。
(1)主要特性
①采用 CMOS 工艺
②低功耗
③工作电压:3.0V-5.0V
④封装形式:SOP16
(2)管脚功能定义
给E1、E2 使能管脚低电平,E3 管脚为高电平,至于哪个管脚输出有效电平(低电
平),要看 A0,A1,A2 输入管脚的电平状态。如果 A0,A1,A2 都为低电平,则
Y0 输出有效电平(低电平),其他管脚均输出高电平。如果 A0 为高电平,A1,
A2 都为低电平,则 Y1 输出有效电平(低电平),其他管脚均输出高电平。其他
几种输出大家可以对照真值表查看。如果 E1、E2 使能管脚任意一个为高电平或
者 E3 为低电平,不论输入是什么,输出都为高电平。
这里给大家总结一个方法:A0、A1、A2 输入就相当于 3 位 2 进制数,A0 是
低位,A1 是次高位,A2 是高位。而 Y0-Y7 具体哪一个输出有效电平,就看输入
二进制对应的十进制数值。比如输入是 101(A2,A1,A0),其对应的十进制数
是 5,所以 Y5 输出有效电平(低电平)。
3 硬件设计
本实验使用到硬件资源如下:
(1)动态数码管模块
(2)74HC138
注:与静态数码管一致
上图电路使用的是 2 个四位一体的共阴数码管组成,即 8 位数码管的段选数
据 a-dp 全部并联一起引出,每位数码管的位选即公共端引出。数码管的段选 a-dp
连接在 74HC245 驱动芯片输出口,由 P0 端口控制。由 P2.2、P2.3、P2.4 管脚控
制 74HC138 译码器输入从而控制数码管位选。
4 软件设计
要实现的功能是:控制动态数码管从左至右显示数字 0-7。
5.原始代码如下:
#include"reg52.h" //对系统默认数据类型进行重定义 typedef unsigned char u8; typedef unsigned int u16; //使用宏定义数码管段码口 #define SMG_A_DP_PORT P0 //定义数码管位选信号控制脚 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; //共阴极数码管显示 0~F 的段码数据 u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //延时函数 void delay_time(u16 ten_us) { while(ten_us--); } //动态数码管显示 void smg_display(void) { int i=0; for(i=0;i<=7;i++) { switch(i) { case0:LSC=1;LSB=1;LSA=1;break; case1:LSC=1;LSB=1;LSA=0;break; case2:LSC=1;LSB=0;LSA=1;break; case3:LSC=1;LSB=0;LSA=0;break; case4:LSC=0;LSB=1;LSA=1;break; case5:LSC=0;LSB=1;LSA=0;break; case6:LSC=0;LSB=0;LSA=1;break; case7:LSC=0;LSB=0;LSA=0;break; } SMG_A_DP_PORT=gsmg_code[i]; //传送段选数据 delay_time(100);//延时,使之稳定 SMG_A_DP_PORT=0x00;//消音 } } void main() { while(1) { smg_display(); } }