【51单片机—静态、动态数码管学习总结】

一. 静态数码管总结(8段数码管)

  1. 静态数码管电路图解析及接线

    静态数码管电路图
    上图电路是静态数码管电路,模块独立,使用的是 1 个共阳数码管 组成,即8 位数码管的段选数据 a-dp 全部一起引出,数码管的位选即公共端直接接 VCC,根据共阳数码管显示特点可知,只要保证数码管 a-dp 段输入电平为低电平即可点亮。
    由于使用的是共阳数码管,公共极接 VCC,所以在数码管控制端可加一个限流电阻,阻值为 470 欧(471)。我们使用I/O引脚的 P0 口连接 J8 端子。

  2. 程序编译与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);				
		}
	}
}
  1. 程序保存

#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段数码管)

  1. 动态数码管电路图解析接线

74HC138+74HC24538译码器位选电路图动态数码管段选电路图

动态数码管显示需要一个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

  1. 程序编译与效果展示

#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;		 //消隐
		}		
	}	
}
  1. 程序保存

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值