51单片机实验程序——数码管知识,静态与动态显示

	注意:本实验采用清翔电子51单片机开发板(同样的51单片机开发板,不同型号,内部设计会有一定差异,程序不一定适用)
	每段程序都有现象图,同型号单片机保证能用。
	给我点个赞,谢谢!

1、数码管知识
在这里插入图片描述
a图为一个数码管每段对应的字母
b图为共阴极数码管(他们的阴极都相连)
c图为共阳极数码管(他们的阳极都相连)
数码管分为共阳和共阴两种,共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭……
在这里插入图片描述
这是这块开发板对应数码管部分的原理图,我简短解说一下,手打有点吃不消。
这里使用了两个74HC573,这个叫锁存器,它可以把数据输入端与输出端进行隔离或连接。
输出口Q要想输出高低电平OE脚必须接GND。
LE脚为高时,输出端Q随输入端D的数据而变化。
LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据。
由图可见,OE端直接与地相连,而LE端分别与单片机的P2.6和P2.7相连,所以这款单片机是用P2.6和 P2.7来控制数码管的。
P2.7叫做位控,控制哪一位(总共有八位)
P2.6叫做段控,控制数码管哪几段显示(一段段组成数字)
2、数码管静态显示
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。

#include <reg51.h>

#define uint unsigned int //定义无符号整型的写法
#define uchar unsigned char //定义无符号字符型的写法
	
sbit DU = P2^6;
sbit WE = P2^7;

void main()
{
	WE = 1;			//打开位控
	P0 = 0XFE;	//1111 1110 根据原理图顺序,为左边第一个数码管
	WE = 0;			//关闭位控
	
	DU = 1;			//打开段控
	P0 = 0X66;	//0110 0110 对应数字4
	DU = 0;			//关闭段控
	while(1);
}

现象图:在这里插入图片描述

3、数码管动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit DU = P2^6;
sbit WE = P2^7;

uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//0-9,这里用code是把它放到ROM区,节省RAM区

void delay(uint z)//约1ms延时
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 

void display(uint i)//显示程序
{
	uchar bai,shi,ge;
	bai = i/100;				 //521/100=5
	shi = i%100/10;			 //521%100/10=2
	 ge = i%10;					 //521%10=1
	//第一位数码管
	P0 = 0xFF;		//清除断码
	WE = 1;				//打开位选锁存器
	P0 = 0xFE;		//1111 1110
	WE = 0;				//锁存位选数据

	DU = 1;				//打开段选锁存器
	P0 = table[bai];		
	DU = 0;				//锁存位选数据
	delay(5);
	
	//第二位数码管
	P0 = 0xFF;		//清除断码
	WE = 1;				//打开位选锁存器
	P0 = 0xFD;		//1111 1101
	WE = 0;				//锁存位选数据

	DU = 1;				//打开段选锁存器
	P0 = table[shi];		
	DU = 0;				//锁存位选数据
	delay(5);
	
	//第三位数码管
	P0 = 0xFF;		//清除断码
	WE = 1;				//打开位选锁存器
	P0 = 0xFB;		//1111 1011
	WE = 0;				//锁存位选数据

	DU = 1;				//打开段选锁存器
	P0 = table[ge];		
	DU = 0;				//锁存位选数据
	delay(5);
}

void main()
{
	while(1)
	{
		display(521);//调用上面的显示函数
	}
	
}

现象图:在这里插入图片描述

大家自己在编写这块程序要注意一个问题,uchar 范围为0-255
uint 为0-65535,这个错误我一开始也犯了。搞得我超范围的数显示不出来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值