数码管显示原理及应用实现
视频链接
对应课程:P11-P12
数码管显示原理
-
我们先看一下一个数码管是如何亮起来的。数码管内部电路如图所示:
为了封装统一,生产商为单位数码管都封装了10个引脚,其中第3个和第8个引脚是连接在一起的。显示一个8字需要七个小段,另外还有一个小数点,所以其内部共有8个小的发光二极管,最后还有一个公共端。
公共端可分为共阳极和共阴极,其内部原理图如图所示:
对于共阴极数码而言,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称为”共阴“,它们的阳极是独立的。当我们给数码管的任一个阳极加上一个高电平时,对应的发光二极管就点亮了。
例如如果想让数码管显示”0“,只需要让”g“"dp"引脚送入低电平,而其余引脚全部输入高电平。
共阳极数码同理,其8个发光二极管的阳极在数码管内部全部连接在一起,所以称为”共阳“,它们的阴极是独立的。当我们给数码管的任一个阴极加上一个低电平时,对应的发光二极管就点亮了。
数码管内部发光二极管要想点亮,需要5mA以上的电流,但电流也不可过大,否则会烧毁发光二极管。由于单片机的I/O口送不出如此大的电流,所以数码管与单片机连接时需要加上驱动电路。
-
多位一体数码管
以四位一体的数码管为例,其内部原理图如图所示:
它们内部的公共端是独立的,而负责显示什么数字的段线全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可知控制这个能点亮数码管亮什么数字。
通常我们把公共端叫做位选线
连接在一起的段线叫做段选线
有了这两个线,通过单片机及外部电路就可以控制任意的数码管显示任意的数字了。
数码管静态显示
先来看巫妖王V2版数码管原理图:
本实验板使用的数码管为共阴极,COM为公共端,若想让LED6亮,则赋LED6为0其余为1,此为”选中“,若想LED6显示1,则要给阳码:0110 0000 (1是亮 0是灭)
-
74LS138(38译码器)
LED1—LED8连接38译码器的输出端,即通过38译码器可实现P22、P23、P24这三个I/O口来控制LED1—LED8的输出。
-
74HC573(锁存器)
OE(使能端,低电平有效)
LE连接VCC(跳帽连接)
这样锁存器的输入端连接单片机的P0口,实现D0-D7的数据原封不动的送入Q0-Q7.
代码
先介绍C51数组
-
数组:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据
-
定义和引用:
int x[3]; //定义一组变量(3个) int x[]={1,2,3};//定义一组变量并初始化 x[0] //引用数组的第0个变量 x[1] //引用数组的第1个变量 x[2] //引用数组的第2个变量 引用x[3]时,数组越界,读出的数值不确定,应避免这种操作
-
Switch语句
switch(变量) { case 常量1:语句体1;break; case 常量2:语句体2;break; case 常量3:语句体3;break; case 常量4:语句体4;break; ... default:语句体x;break; }
将变量与case后的各个常量对比,若有相等,则执行相应的语句体。若没有一个相等,则执行default后的语句体(default可以不写)
完整代码如下:
#include <REGX52.H> //和#include <REG52.H>的区别
//段位表(共阴极数码管编码,对于的符号为0,1,2,3,4,5,7,8,9)
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
switch(Location) //位码输出,通过38译码器进而实现数码管的选中
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number]; //段码输出
}
void main()
{
while(1)
{
Nixie(3,0); //在第3个数码管位置显示0
}
}
/*
当P0等于0x3f,换算成2进制为 0011 1111
P0.0是低位,P0.7是高位,则P0.0-P0.7:1111 1100
由于是共阴极连接,1是亮,0是灭,则g,dp不亮,其余亮,显示为数字0
*/
数码管动态显示
数码管驱动方式通常有两种:
-
单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
-
专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可文章来源:https://www.toymoban.com/news/detail-450263.html
数码管动态扫描,其实是轮流向各个数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使得人的感觉好像数码管同时都在显示,实际上多位数码管是一位一位轮流显示的,只是轮流的速度非常快,人眼无法分辨出来。文章来源地址https://www.toymoban.com/news/detail-450263.html
#include <REGX52.H> //和#include <REG52.H>的区别
//段位表(共阴极数码管编码,对于的符号为0,1,2,3,4,5,7,8,9)
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延时子函数
void Delay1ms(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
switch(Location) //位码输出,通过38译码器进而实现数码管的选中
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number]; //段码输出
Delay1ms(1); //
P0=0x00; //消影
}
void main()
{
while(1)
{
Nixie(1,0); //八个数码管依次显示为01234567
Nixie(2,1);
Nixie(3,2);
Nixie(4,3);
Nixie(5,4);
Nixie(6,5);
Nixie(7,6);
Nixie(8,7);
}
}
到了这里,关于二、数码管显示原理及应用实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!