51单片机数码管显示(三)

目录

一、静态数码管显示

1、一位数码管

(1)LED数码管各段名称

(2)数码管引脚定义

(3) 共阴极(89C52RC单片机LED数码管采用共阴极方式)

(4)共阳极

2、四位一体数码管

(1)四位一体数码管引脚定义

(2)上面共阴极和下面共阳极

 3、数码管模块原理图详解

4、编写程序

5、实物展示

二、动态数码管显示

1、数码管的消影

2、编写程序

3、实物展示

4、数码管驱动方式


一、静态数码管显示

1、一位数码管

(1)LED数码管各段名称

(2)数码管引脚定义

接线服从就近原则

(3) 共阴极(89C52RC单片机LED数码管采用共阴极方式)

中间是二极管,电流只能从下面流向上面,所以所有接口共用一个阴极,上面接口接地,

给下面接口输入1时,LED二极管亮;输入0时,LED二极管灭。

(4)共阳极

 中间是二极管,电流只能从上面流向下面,所以所有接口共用一个阳极,上面接口接电源VCC,

当给下面接口输入0时,LED二极管亮;输入1时,LED二极管灭。

2、四位一体数码管

(1)四位一体数码管引脚定义

(2)上面共阴极和下面共阳极

89C52RC单片机采用共阴极方式,当给共阴极12、9、8、6为1101时,再给下面共用端口输入0110 0000时,LED段B、C亮,这时第三个LED数码管会显示1;如果给共阴极12、9、8、6为1001,则第二个数码管和第三个数码管都会显示1。

 3、数码管模块原理图详解

(1)138译码器

~有上划线,代表低电平有效,如果没有上划线,表示高电平有效

 开发板上接的是74HC138,右侧LED1~LED8接到了数码管的公共端,通过138译码器,能够使由左侧P22、P23、P24三个端口来控制选择右边的8个端口LED1~LED8

例:当C、B、A输入为000时,输出Y0低电平有效,其他无效,即输出LED8~LED1为1111 1110。

CBA输出(上面一横代表低电平有效)
000Y0(1111 1110 )
001Y1(1111 1101)
010Y2(1111 1011)
011Y3(1111 0111)
100Y4(1110 1111)
101Y5(1101 1111)
110Y6(1011 1111)
111Y7(0111 1111)

 左下角G1、G2A和G2B为使能端,当G1接VCC,G2A和G2B接地,138译码器才会工作。

89C52RC单片机采用的是共阴极数码管,右上角COM指公共端,所以如果想点亮第三个数码管,首先需要给LED1~LED8赋值1101 1111,这样第三个数码管就被选中了,然后给第三个数码管数据,需要给数码管下面的接口输入阳码(1为亮,0为灭)——如想让数码管显示1,需要输入      0110 0000。

74HC245为双向数据缓冲器,右上角VDD是电源接VCC,OE为使能端口,低电平有效,接地时芯片才开始工作,左下角GND为接地。

左侧A0和右侧B0为一 一对应的关系,左上角DIR为控制数据方向端口,如果DIR接高电平是将左侧数据A0~A8送到右侧B0~B8,如果DIR接低电平,是将右侧数据B0~B8送到左侧A0~A8,由于在电路板上LE始终与VCC连接,因此这里74HC245的作用是将左侧数据A0~A8送到右侧B0~B8

由于数码管为共阴极,给数码管下面接口输入阳码时,LED才亮,但是直接将P0~P7的高电平输入到数码管时,89C52RC单片机的I/O口是弱上拉类型,单片机高电平驱动能力有限,输出的最大电流不能太大,而低电平驱动能力更强一些因此过从P0~P7的数据,经过74HC245,就会使输入数码管的电流更小,这样驱动能力会更强一些

4、编写程序

#include <REGX52.H>

unsigned char shumaguanTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};	
					//定义数组注意后面要加分号,且左边是方框,右边是中括号
					//右边分别是0~9的数码管显示输入值的16进制	

void shumaguan(unsigned char Location,Number)
{
	switch(Location)		
	{					//通过switch函数判断输入的Location是1~8哪一个值
						//再由后面的138译码器来选择对应的数码管
        case 1:P2_4=1,P2_3=1,P2_2=1;break;
		case 2:P2_4=1,P2_3=1,P2_2=0;break;
		case 3:P2_4=1,P2_3=0,P2_2=1;break;
		case 4:P2_4=1,P2_3=0,P2_2=0;break;
		case 5:P2_4=0,P2_3=1,P2_2=1;break;
		case 6:P2_4=0,P2_3=1,P2_2=0;break;    
		case 7:P2_4=0,P2_3=0,P2_2=1;break;
		case 8:P2_4=0,P2_3=0,P2_2=0;break;
	}
	P0=shumaguanTable[Number];	//Number输入0~9的任意数字,就会显示相应数字
}


void main()
{
	shumaguan(7,2);			//输入Location为7,Number为2,带入函数中
	while(1)
	{
	
	}
}

5、实物展示


二、动态数码管显示

1、数码管的消影

在shumaguan(Location,Number)函数中,Location左边数字,段选控制选择哪个数码管亮;Number右边数字,位选控制数码管显示的值。

若主程序为

void main()
{
	shumaguan(1,1);		
	shumaguan(2,2);		
	shumaguan(3,3);
	while(1)
	{
	}
}

函数运行过程为(第一个函数)位选、段选、(第二个函数)位选、段选、(第三个函数)位选、段选。

由于人的视觉暂留效果,并且没有加延时,单片机运行速度太快,在上个函数的段选和下个函数位选之间会发生显示数据串位的问题,如下图所示。

 所以为了消除串位的现象,需要在每一个函数段选后,将其消0,这样就能实现动态数码管显示

2、编写程序

#include <REGX52.H>

unsigned char shumaguanTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};	
					//定义数组注意后面要加分号,且左边是方框,右边是中括号
					//右边分别是0~9的数码管显示输入值的16进制	

void Delay(unsigned int xms)		//延时函数,输入x多少,就延时多少ms
{
	unsigned char i, j;				
    while(xms--)						
    {
		i = 2;
		j = 239;
		do
	    {
			while (--j);
	    } while (--i);											
    }
     
}


void shumaguan(unsigned char Location,Number)	//数码管显示函数,Location是第几个数码管,Number是显示的数字
{
	switch(Location)		
	{					//通过switch函数判断输入的Location是1~8哪一个值
						//再由后面的138译码器来选择对应的数码管
		case 1:P2_4=1,P2_3=1,P2_2=1;break;
		case 2:P2_4=1,P2_3=1,P2_2=0;break;
		case 3:P2_4=1,P2_3=0,P2_2=1;break;
		case 4:P2_4=1,P2_3=0,P2_2=0;break;
		case 5:P2_4=0,P2_3=1,P2_2=1;break;
		case 6:P2_4=0,P2_3=1,P2_2=0;break;
		case 7:P2_4=0,P2_3=0,P2_2=1;break;
		case 8:P2_4=0,P2_3=0,P2_2=0;break;

	}
	P0=shumaguanTable[Number];	//Number输入0~9的任意数字,就会显示相应数字
	Delay(1);	//让数码管稳定显示数字,立刻清零的话,数码管会显示比较暗
	P0=0x00;	//在数码管显示数字后,将段选清零,消除串位重影现象
}


void main()
{
	while(1)
	{
	shumaguan(1,1);	
	shumaguan(2,2);		
	shumaguan(3,3);
	}
}

3、实物展示

4、数码管驱动方式

单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间;

专用驱动芯片:内部自带显存,扫描电路,单片机只需告诉它显示什么即可,

TM1640就是这种专用驱动芯片。 

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剑鞘的流苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值