以8段数码管为例
一、数码管概念
根据内部的连接进行分类,可以分为共阴极和共阳极。8段数码管内部有8颗LED组成,控制相应的LED亮起,其他熄灭就可以显示出想要的字形。如下图所示,第二幅图是共阴极,第三幅是共阳极。第一幅图中是共阴极,接GND。
原理图
1.74HC573锁存器工作原理
真值表
通过真值表可知:
输出口Q要想输出高低电平OE脚必须接GND。
LE脚为高时,输出端Q随输入端D的数据而变化。
LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据。
【注】因此,当我们在锁存器中输入想要维持不变的数据时,
先输入数据使Q变化,再将LE置为低,此时Q的数据就会被锁住!
2.接上拉电阻原因
由原理图可知,P0口接了RL1和RL2俩个上拉电阻,原因在于当P0口作为输入/输出口时,上电复位后处于开漏模式。P0口内部无上拉电阻,所以作I/O口必须外接10K-4.7K的上拉电阻。
注:G级导通,管脚置低电平
【注】三级管介绍
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);
}
运行结果
二、数码管动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
#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); //数码管显示函数
}
}
运行结果: