当前位置:   article > 正文

51单片机教程:数码管动态显示(0~99999999)74hc138驱动_c51单片机数码管动态倒数

c51单片机数码管动态倒数

数码管动态显示0~99999999

一、共阴极8位数码管原理

在这里插入图片描述
在这里插入图片描述

首先了解一些必要知识
1、多位数码管是扫描显示,也就是同一时刻只有一个数码管显示
2、视觉暂留效果:第一个数码管显示完,第二个数码管接着显示,接着后面数码管一次显示,当显示(扫描)足够快的时候,人眼是看不到闪烁的,就认为多个数码管是同时显示的
3、多位数码管只能同时显示多个一样的数字,要显示不同数字需要扫描显示

比如说要显示12345678,你看起来8个数码管是同时亮的,其实同一时刻只有一个数码管是亮的
在这里插入图片描述
我们把时间放慢,看看数码管都发生了什么变化:
1、第1毫秒
在这里插入图片描述
2、第二毫秒
在这里插入图片描述
3、第三毫秒
在这里插入图片描述
4、第四毫秒
在这里插入图片描述
5、第五毫秒
在这里插入图片描述
6、第六毫秒
在这里插入图片描述
7、第七毫秒
在这里插入图片描述
8、第八毫秒
在这里插入图片描述

当数码管的扫描频率大于50hz的时候人眼是基本分不清的,也就是你的扫描8个数码管的周期控制在20ms内就可以实现动态显示不闪烁。

二、了解原理后打开proteus仿真,画电路图
这里用了74hc138,不会用的可以百度一下芯片用法
在这里插入图片描述
三、编写代码
代码功能,显示从0自加到99999999

#include <reg51.h>

typedef unsigned long u32;	   //对数据类型进行声明定义
typedef unsigned int u16;	
typedef unsigned char u8;

sbit LSA=P3^0;		//74hc138的A B C引脚定义
sbit LSB=P3^1;
sbit LSC=P3^2;

#define SMG P0		//定义数码管段数据接口P0

u8 buff[8];		//显示缓冲数组
u8 a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//分别显示0 1 2 3 4 5 6 7 8 9

void delay_ms(u16 t)
{
	u16 i,j;
	for(i=0; i<t; i++)
		for(j=0; j<120; j++);
}

void update(u32 val)  //更新缓冲数组
{	
	//分离各位数据
	buff[0]=val/10000000%10;	//12345678/10000000%10=1;
	buff[1]=val/1000000%10;	 	//12345678/1000000%10=2;
	buff[2]=val/100000%10;		//12345678/100000%10=3;
	buff[3]=val/10000%10;		//12345678/10000%10=4;
	buff[4]=val/1000%10;     	//12345678/1000%10=5;
	buff[5]=val/100%10;	    	//12345678/100%10=6;
	buff[6]=val/10%10;	     	//12345678/10%10=7;
	buff[7]=val%10;		        //12345678%10=8;
}

void display(void)	  //显示函数
{
	u8 n;
	for(n=0; n<8; n++)
	{
		switch(n)	  //先位选
		{
			case 0:LSC=0;LSB=0;LSA=0;break;
			case 1:LSC=0;LSB=0;LSA=1;break;
			case 2:LSC=0;LSB=1;LSA=0;break;
			case 3:LSC=0;LSB=1;LSA=1;break;
			case 4:LSC=1;LSB=0;LSA=0;break;
			case 5:LSC=1;LSB=0;LSA=1;break;
			case 6:LSC=1;LSB=1;LSA=0;break;
			case 7:LSC=1;LSB=1;LSA=1;break;
		}
		SMG=a[buff[n]];	//后发送段数据
		delay_ms(1);	//小延时,显示更稳定
	}
}

void main(void)
{
	u32 num=0;	 //要显示的数据
	u16 t;		 //延时用
	while(1)
	{
		update(num);	   //更新显示缓冲数组
		for(t=0; t<50; t++)	  //用for循环来延时不然显示不正常
		{
			display();		//显示缓冲数组
		}
		num++;	 //显示数据自加
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

执行效果:一开始显示00000000,然后自动加一,一会变成00000035,直到溢出
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/946705
推荐阅读
相关标签
  

闽ICP备14008679号