美文网首页
51单片机之数码管动态显示

51单片机之数码管动态显示

作者: David_Rao | 来源:发表于2019-09-26 12:34 被阅读0次

动态显示的原理

根据上一篇文章数码管的静态显示,我们已经知道如何精准控制某一个数码管显示某一个数字。

如果我们要前三个数码管显示1、2、3,只不过是运用静态显示的方法,精准控制第一个数码管显示了1,然后马上,在非常短的时间内(单片机处理速度很快),精准控制第二个数码管显示2,又马上精准控制第三个数码管显示3,不断循环。

因为人眼识别不了这么快运动的图像,看上去就好像1、2、3一起显示了。

以下是一个有问题的程序

#include <reg52.h>

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

void main()
{
    while(1)
    {
        /*这里是循环头,循环尾的P0=0x5b跑到这里来了*************************************************/
        WE = 1;  //打开位选
        /*打开位选的一瞬间*************************************************************************/
        /*P0 = 0x5b;跑进来了***********************************************************************/
        P0 = 0XFE;  //选择第一个数码管
        WE = 0;  //锁住位选数据
    
        DU = 1;  //打开段选
        P0 = 0x06;  //显示1
        DU = 0;  //锁住段选数据



        WE = 1;  //打开位选
        P0 = 0XFD;  //选择第二个数码管
        WE = 0;  //锁住位选数据
    
        DU = 1;  //打开段选
        P0 = 0x5b;  //显示2
        DU = 0;  //锁住段选数据
        /*执行到这里,P0=0x5b,然后回到循环头********************************************************/
    }    
}

以下是正确的程序

#include <reg52.h>

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

void delay(unsigned int z)
{
    unsigned int x, y;
    for(x = z; x > 0; x--)
        for(y = 114; y >0; y--);
}

void main()
{
    while(1)
    {
        P0 = 0xff;  //1111 1111不选择任何一个数码管
        WE = 1;  //打开位选
        P0 = 0XFE;  //1111 1110选择第一个数码管
        WE = 0;  //锁住位选数据
    
        DU = 1;  //打开段选
        P0 = 0x06;  //显示1
        DU = 0;  //锁住段选数据
        delay(5);  //别切换太快了
        


        P0 = 0xff;  //1111 1111不选择任何一个数码管
        WE = 1;  //打开位选
        P0 = 0XFD;  //1111 1101选择第二个数码管
        WE = 0;  //锁住位选数据
    
        DU = 1;  //打开段选
        P0 = 0x5b;  //显示2
        DU = 0;  //锁住段选数据
        delay(5);  //别切换太快了
    }    
}

写一个显示三位数的函数

#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char

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

uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;  //code表示存在code区,数据不能被修改

void delay(unsigned int z)
{
    unsigned int x, y;
    for(x = z; x > 0; x--)
        for(y = 114; y >0; y--);
}

void display(uchar i)
{
    uchar bai, shi, ge;
    bai = i / 100;
    shi = i / 10 % 10;
    ge = i % 10;
    /*******************************************************/
    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()
{
    display(236);
}

相关文章

  • 51单片机之数码管动态显示

    动态显示的原理 根据上一篇文章数码管的静态显示,我们已经知道如何精准控制某一个数码管显示某一个数字。 如果我们要前...

  • MHT5-交通灯套件

    功能介绍: 本套件是基于51单片机的交通灯模拟设计,通过对单片机编程,控制数码管显示和LED亮灭的变化。有深夜模式...

  • 51单片机数码管的静态与动态显示

    姓名:冯子豪 学号:16020199001 转载自https://blog.csdn.net/qq_2748553...

  • Arduino基础入门篇14—跳动的数码管

    本篇介绍数码管显示器件,通过控制一位共阴极数码管动态显示数字0到9来了解数码管的使用。 1. 数码管介绍 数码管,...

  • 1.3 数码管-动态显示

    数码管的动态显示 数码管动态显示的实质就是利用了人眼视觉的暂留和二极管的余晖作用 由于人的视觉暂留现象及发光二极管...

  • 数码管

    数码管静态显示: 这个是一个共阳的数码管例子: 注意电阻排的阻值选用200欧姆 动态显示 共阴数码管的拓展 共阴和...

  • [51单片机]for循环中,数组数据提取

    学习代码,数码管动态显示。 案例说明:第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码管显示2,时...

  • 单片机实现秒表计时

    要求: 用stc89c51,数码管,锁存器实现秒表功能 实验仿真图: 加入两个锁存器使单片机能够分时进行位选和段选...

  • 向51单片机说再见!

    51单片机的辉煌过去 51单片机指MCS-51系列单片机,CICS指令集。由Intel公司开发,其结构增加了如乘(...

  • 51单片机常用波特率初值表(12M晶振)

    为什么51单片机的晶振一般使用11.0592? 用11.0592晶振的原因是51单片机的定时器导致的。用51单片机...

网友评论

      本文标题:51单片机之数码管动态显示

      本文链接:https://www.haomeiwen.com/subject/wiseyctx.html