天天看点

数码管显示原理——MCU51

以8段数码管为例

一、数码管概念

根据内部的连接进行分类,可以分为共阴极和共阳极。8段数码管内部有8颗LED组成,控制相应的LED亮起,其他熄灭就可以显示出想要的字形。如下图所示,第二幅图是共阴极,第三幅是共阳极。第一幅图中是共阴极,接GND。

数码管显示原理——MCU51

原理图

数码管显示原理——MCU51

1.74HC573锁存器工作原理

数码管显示原理——MCU51

真值表

数码管显示原理——MCU51

通过真值表可知:

输出口Q要想输出高低电平OE脚必须接GND。
LE脚为高时,输出端Q随输入端D的数据而变化。
LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据。
【注】因此,当我们在锁存器中输入想要维持不变的数据时,
	 先输入数据使Q变化,再将LE置为低,此时Q的数据就会被锁住!
           

2.接上拉电阻原因

由原理图可知,P0口接了RL1和RL2俩个上拉电阻,原因在于当P0口作为输入/输出口时,上电复位后处于开漏模式。P0口内部无上拉电阻,所以作I/O口必须外接10K-4.7K的上拉电阻。

数码管显示原理——MCU51
数码管显示原理——MCU51

注:G级导通,管脚置低电平

【注】三级管介绍

数码管显示原理——MCU51
1.   PNP管子是发射极流入后从基极和集电极流出,NPN管子是基极和集电极流入从发射极流出。
2.   PNP管子工作在放大区时电压是,Ue>Ub>Uc,NPN管子工作在放大区时电压时Uc>Ub>Ue。
3.   PNP是共阴极,即两个PN结的N结相连做为基极,另两个P结分别做集电极和发射极;电路图里标示为箭头朝内的三极管。NPN则相反。

4.   PNP管子:发射极电流  =   集电极电流  +   基极电流

5.   NPN管子:集电极电流  =  发射极电流  +   基极电流
           

何为开漏模式

开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,
	开集电路中的“集”就是指三极管的集电极。开漏电路就是
	指以MOS FET的漏极为输出的电路。
	开漏输出:OC门的输出就是开漏输出;OD门的输出也是开漏输出。
	它可以吸收很大的电流,但是不能向外输出的电流。所以,为了
	能输入和输出电流,它使用的时候要跟电源和上拉电阻一齐用。
           

点亮第一个数码管显示2

#include <reg52.h>
#include <intrins.h>

sbit WEI = P2^7; //数码管位选
sbit DU = P2^6;  //数码管段选

int main()
{
	WEI = 1;
	P0 = 0XFE;//1111 1110 选定第一位
	WEI = 0;
	
	DU = 1;
	P0 = 0X5B;//0101 1011 显示2
	DU = 0;
	
	while(1);
}
           

运行结果

数码管显示原理——MCU51

二、数码管动态显示

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

#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选

//共阴数码管段选表0-9
uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};

/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 

/*====================================
函数	:display(uchar i)
参数	:i 显示数值,取值范围0-255
返回值	:无
描述	:三位共阴数码管动态显示
====================================*/
void display(uchar i)
{
	uchar bai, shi, ge;
	bai = i / 100; //233/ 100  = 2
	shi = i % 100 / 10;	//233 % 100 / 10 = 3
	ge  = i % 10;//233 % 10 =3
	
	//第一位数码管  		
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFE; //1111 1110
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[bai];//
	DU = 0;//锁存段选数据
	delay(5);

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

	//第三位数码管
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFB; //1111 1011
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[ge];//
	DU = 0;//锁存段选数据
	delay(5);
}

void main()//main函数自身会循环
{	
	while(1)
	{
		display(233); //数码管显示函数
	}	
}  
           

运行结果:

数码管显示原理——MCU51