89C52单片机静态数码管的显示,动态数码管显示

1.简介

就是用单片机控制点亮上面的灯,显示对应数字
在这里插入图片描述

2、理论介绍

1)我么们先看一下电路图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1)我们可以看到 控制数码管的连接方式是
P0 口 连接 锁存器 ,通过锁存器 再控制数码管上灯亮
2)锁存器U8 通过 LE 脚 高低电平 来控制WE1~WE8 引脚的电平和P0口是否保持一致。进而控制8个数码管中的哪一个数码管可以亮或者灭
3)锁存器U9 通过 LE 脚 高低电平 来控制A~H 引脚的电平和P0口是否保持一致。进而控制一个数码管里面哪个字段可以亮或者灭从而形成数字
在这里插入图片描述

3.示例展示

下面我们就让第四个数码管显示1来展示

#include<reg52.h>
sbit U8 = P2^7; //U8 锁存器LE 端口,用于控制哪一个数码管
sbit U9 = P2^6;// U9 锁存器LE端口,用于控制数码上数字显示

void main(){
	//控制哪一个数码管亮
	U8 = 1;//锁存器 高电平,则表示 允许U8锁存器输出端和输入端电平一样
	P0 = 0xf7; //1111 0111	 我们想第四个数码管亮,第四位置为低电平
	U8 = 0; //锁存器 低电平 ,表示 即使 输入端电平改变,输出端也不改变

	//控制数码管显示什么数字
	U9 = 1;
	P0 =0x06; //0000 0110 显示1 则数码管 bc 段位 显示高电位,其余都是0 
	U9 = 0;
    
	while(1){
	;
	}

}

4、实物展示

但是 这个数码管会每隔几秒闪一下,到现在不知为什么?
在这里插入图片描述

5.动态数码管显示

动态数码管就是让人感觉多个数码管一起亮
动态数码管显示和静态基本类似
就是多个数码管切换的过程,利用人的视觉效果差,来感觉数码管是一起亮的

//数码管动态显示12345678
#include <reg52.h> //51头文件 	

#define uchar unsigned char//宏定义
#define uint  unsigned int //宏定义
sbit we = P2^7;	//位定义数码管位选锁存器接口
sbit du = P2^6;	//位定义数码管段选锁存器接口
//数码管段选表
uchar code leddata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义
 
                         };
//毫秒级延时函数
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--);
}

void main()
{
				
		while(1)
		{
			 //第一位数码管显示1
			P0 = 0xfe;//1111 1110 第一位数码管显示,注意数码管的排序,P0.0对应连接的是左边第一位数码管
			we = 1;//打开位选
			we = 0;	//关闭位选

			P0 = leddata[1];
			du = 1;	//打开段选
			du = 0;	//关闭段选
			delay(2);//延时
			

			//第二位数码管显示2
			P0 = 0xfd;//1111 1101  只选通第二位数码管
			we = 1;	//打开位选
			we = 0;	//关闭位选
			
			P0 = leddata[2]; //显示2
			du = 1;//打开段选
			du = 0;	//关闭段选
			delay(2);//延时
			
			//第三位数码管显示3
			P0 = 0xfb;// 1111 1011只选通第三位数码管
			we = 1;	//打开位选
			we = 0;	//关闭位选
			
			P0 = leddata[3]; //显示3
			du = 1;//打开段选
			du = 0;	//关闭段选
			delay(2);//延时
			
			P0 = 0xf7;//1111 0111  只选通第四位数码管
			we = 1;	//打开位选
			we = 0;	//关闭位选
			
			P0 = leddata[4]; //显示4
			du = 1;//打开段选
			du = 0;	//关闭段选
			delay(2);//延时
			
			P0 = 0xef;//1110 1111  只选通第五位数码管
			we = 1;	//打开位选
			we = 0;	//关闭位选
			
			P0 = leddata[5]; //显示5
			du = 1;//打开段选
			du = 0;	//关闭段选
			delay(2);//延时
			
			P0 = 0xdf;//1101 1111  只选通第六位数码管
			we = 1;	//打开位选
			we = 0;	//关闭位选
			
			P0 = leddata[6]; //显示6
			du = 1;//打开段选
			du = 0;	//关闭段选
			delay(2);//延时
			
			we = 1;	//打开位选
			P0 = 0xbf;//1011 1111  只选通第七位数码管
			we = 0;	//关闭位选
			
			P0 = leddata[7]; //显示7
			du = 1;//打开段选
			du = 0;	//关闭段选
			delay(2);//延时
			
			P0 = 0x7f;//0111 1111  只选通第八位数码管
			we = 1;	//打开位选
			we = 0;	//关闭位选
			
			P0 = leddata[8]; //显示8
			du = 1;//打开段选
			du = 0;	//关闭段选
			delay(2);//延时	
		}
}

我们可以看到所有数码管都是通过P0口来控制,利用程序执行的速度和人视觉差来实现的。
其实这里面的灯是一个一个亮起来的
在这里插入图片描述

发布了354 篇原创文章 · 获赞 114 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/qq_27061049/article/details/101611677