51单片机—静态、动态数码管学习总结
一. 静态数码管总结(8段数码管)
-
静态数码管电路图解析及接线
上图电路是静态数码管电路,模块独立,使用的是 1 个共阳数码管 组成,即8 位数码管的段选数据 a-dp 全部一起引出,数码管的位选即公共端直接接 VCC,根据共阳数码管显示特点可知,只要保证数码管 a-dp 段输入电平为低电平即可点亮。
由于使用的是共阳数码管,公共极接 VCC,所以在数码管控制端可加一个限流电阻,阻值为 470 欧(471)。我们使用I/O引脚的 P0 口连接 J8 端子。 -
程序编译与1.——9.的效果展示
在编程前,从电路图中可以看出静态数码管的段选a、b、c、d、e、f、g、dp分别对应的I/O引脚的8、7、6、5、4、3、2、1,高位到低位且段选端共阳极,所以在编程的时候数据的输入需要按照此规格对应起来。当显示为“1.”时,数码管的位选a=1、b=0、c=0、d=1、e=1、f=1、g=1、dp=0,即1001 1110=0x9e。当显示为“2.”时,数码管的段选a=0、b=0、c=1、d=0、e=0、f=1、g=0、dp=0,即0010 0100=0x24,剩下的依次类推。变成如下:
#include <reg51.h>
typedef unsigned int u16 ; //定义一个u16类型的别名变量用
//于Delay—延时函数引用
void delay(u16 a) //定义一个延时函数便于观察数码管数字显示
{
while(a--);
}
void main(void)
{
while(1)
{
P0 = 0x9e;
delay(50000);
P0 = 0x24;
delay(50000);
P0 = 0x0c;
delay(50000);
P0 = 0x98;
delay(50000);
P0 = 0x48;
delay(50000);
P0 = 0x40;
delay(50000);
P0 = 0x1e;
delay(50000);
P0 = 0x00;
delay(50000);
P0 = 0x08;
delay(50000);
}
}
因上边程序比较繁琐,所以可以定义一个数组保存 1.—9. 的数据,然后用while和for循环来实现,编程如下:
void main(void)
{
unsigned char a[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08};
unsigned char i = 0;
while(1)
{
for(i=0; i<10; i++)
{
P0 = a[i];
delay(50000);
}
}
}
#include <reg51.h>
typedef unsigned int u16 ;
void delay(u16 a)
{
while(a--);
}
void main(void)
{
unsigned char a[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08}; //1.——9.数字数组
unsigned char i = 0;
while(1)
{
for(i=0; i<10; i++)
{
P0 = a[i];
delay(50000);
}
}
}
二. 动态数码管总结(8段数码管)
74HC138+74HC245![38译码器位选电路图](https://img-blog.csdnimg.cn/4e69d0a89f7b4b6abe003daf22b3159e.png#pic_center)
![动态数码管段选电路图](https://img-blog.csdnimg.cn/a1cce711bca6471bb3bf61dae5ef9670.png#pic_center)
动态数码管显示需要一个74HC138芯片,74HC138D 是一种三通道输入、八通道输出译码器,主要应用于消费类电子产品。
74HC138控制位选且有效电平为低电平
从上面的管脚功能定义说明及真值表可以知道该芯片使用方法很简单,给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 具体哪一个输出有效电平 , 就看输入二进制对应的十进制数值 。 也可理解为当 A0 、 A1 、A2 为100时 , 其对应的十进制数是 4 ,对应的真值表的数值为1011 1111,所以 Y1(Y0_Y7) 输出有效电平(低电平)。当 A0 、 A1 、A2 为101 时 , 其对应的十进制数是 5 ,对应的真值表的数值为1111 1011所以 Y5(Y0_Y7) 输出有效电平(低电平)。
74HC245
从上面的管脚功能定义说明及真值表可以知道该芯片使用方法很简单,给 OE使能管脚低电平,DIR 管脚为高电平传输方向是 A->B 输出,DIR 为低电平传输方向是 B->A,至于输出高电平还是输出低电平取决于输入端的状态,如果输入为低电平,输出即为低;输入为高电平,输出即为高。如果 OE 使能管脚为高电平,不论 DIR 管脚是高还是低,输出是高组态。通常我们使用 74HC245 芯片用作驱动只会让其在一个方向输出,即 DIR 管脚为高电平,传输方向是 A->B。
总结:P0-7连接74HC245 高位相连,即对应段选a—h
#include <reg51.h>
typedef unsigned char u8; //定义别名变量
u8 d[8] = {0xfd, 0x61, 0xdb, 0xf3,
0x67, 0xb7, 0xbf, 0xe1}; //定义数码管段选数组
u8 w[8] = {0, 1, 2, 3, 4, 5, 6, 7}; //定义数码管位选数组
void delay(u8 a)
{
while(a--); //定义循环函数 unsigned char范围是0~255
}
void main (void)
{
while(1)
{
u8 i = 0;
for(i=0; i<8; i++)
{
P2 = w[i];
P0 = d[i]; //定义数码管段选函数
delay(100);
P0 = 0x00; //消隐
}
}
}