51单片机——数码管显示

1.数码管显示(4位7段数码管)

数码管显示分为静态显示和动态显示

静态显示

可直接利用IO口例:P0口P0=0x3f显示数字0;

动态显示

两种方法:一种是将刷新频率提高,人的肉眼分辨不开,即看到同时显示。
另一种是利用锁存器件,先显示一个数字,利用锁存器件锁到一个数码管上,在显示第二个数字,以此类推。

动态扫描原理

所有数码管段选都连接在一起的时候,怎么让数码管显示不一样的数字呢?动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。就像我们看的电影是有一帧一帧的画面显示的,当速度够快的时候我们看到它就是动态的。当我们显示数码管的速度够快的时候,也就可以看到它们是同时显示了。

数码管的动态显示原理

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差些,所以在选择限流电阻时应略小于静态显示电路中的。

动态显示编程原理。

先编写一个程序,在4位一体数码管左数第4位显示4,过1秒,在左数第3位显示3,过1秒,在左数第2位显示2,过1秒,在左数第1位显示1,上述过程不断循环。将中间的延时时间不断改短,我们发现了什么?刷新频率>50HZ,我们就感觉不到闪烁了。所谓动态扫描显示是指轮流向各位数码管送出段选(字形码)和位选,由于人眼的视觉残留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要低,所以在选择限流电阻时应小于静态显示电路中的。
注意事项
普通LED数码管公共端,正常静态工作电流最大能达到70-80mA,一般单片机IO口不足以提供这么大的电流,加三极管可扩展IO口的驱动能力。
另外,加三极管可以起到缓冲和隔离作用,使单片机工作更加稳定可靠。常用电路图如下图所示:
在这里插入图片描述

2.数码管分类

数码管一般分为共阴数码管和共阳数码管
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
共阴数码管字符显示表

字符 显示数字
0 0x3f
1 0x06
2 0x5b
3 0x4f
4 0x66
5 0x6d
6 0x7d
7 0x07
8 0x7f
9 0x6f
A 0x77
B 0x7c
C 0x39
D 0x5e
E 0x79
F 0x71
不显示 0x00

共阳与共阴的显示刚好互补,即相加后两位等于FF。

3.静态显示

代码
//数码管静态显示
#include<reg51.h>
sbit led1=P2^1; //定义第一个数码管
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
void main()
{
  led1=1;
  led2=0;
  led3=0;
  led4=0;
  P0=0x7c;  //1000 0011 显示字符b
  while(1);  
}
原理图

在这里插入图片描述

4.动态显示

动态显示调用之前的延时函数,将延时时间不断减少,最终可看到效果。

代码
//数码管动态显示
#include<reg51.h>
#include"delay.h"
sbit led1=P2^1; 
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
unsigned char code datas[17]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x6f,0x7f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};   //定义一个数组,存放显示数字
//0--F;  数组下标与数组中的内容完全对应
void main()
{
   while(1)
   {
   P0=datas[4]; 
   led1=0; 
   led2=0;
   led3=0;
   led4=1;
   delay(1000);
   P0=datas[3]; 
   led1=0; 
   led2=0;
   led3=1;
   led4=0;
   delay(1000);
   P0=datas[2]; 
   led1=0; 
   led2=1;
   led3=0;
   led4=0;
   delay(1000);
   P0=datas[1]; 
   led1=1; 
   led2=0;
   led3=0;
   led4=0;
   delay(1000);
   }
}

总结
仿真仅仅只是仿真,在测试动态显示时,仿真中出现的结果与预想结果不符,将延时时间逐渐变慢后发现时软件延迟的原因,因此测试应在开发板上进行具体测试。

发布了19 篇原创文章 · 获赞 15 · 访问量 2527

猜你喜欢

转载自blog.csdn.net/qq_44981039/article/details/103949746