精华内容
下载资源
问答
  • 本文主要讲了动态数码管显示程序74HC573,下面起来学习一下
  • //这是个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止//使用时需采用锁存器#include#include"stdio.h"unsigned char code LED[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};...

    //这是一个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止//使用时需采用锁存器

    #include

    #include"stdio.h"

    unsigned char code LED[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; unsigned char LEDbuff[]={0xff,0xff,0xff,0xff};

    //定义数码管的位选段

    sbit SEG_bit_1 = P0^1;

    sbit SEG_bit_2 = P0^2;

    sbit SEG_bit_3 = P0^3;

    sbit SEG_bit_4 = P0^4;

    unsigned int cnt=0;

    unsigned int sec =0;

    unsigned int mini=0;

    unsigned int hour=0;

    unsigned char i=0;

    /*void delay(unsigned int z )

    {

    unsigned int x,y;

    for(x=z;x>0;x--)

    for(y=110;y>0;y--);

    }

    */

    void interrupttimer0() interrupt 1 /*设置中断函数*/

    {

    TH0=0xfc;

    TL0=0x18;

    cnt++;

    //P1=0x80;

    //delay(1);

    switch(i)

    {

    case 0: SEG_bit_1 = 0;SEG_bit_4 = 1;P1=LEDbuff[0];i++;break;

    case 1: SEG_bit_4 = 0;SEG_bit_3 = 1;P1=LEDbuff[1];i++;break;

    case 2: SEG_bit_3 = 0;SEG_bit_2 = 1;P1=LEDbuff[2]&;i++;break;

    case 3: SEG_bit_2 = 0;SEG_bit_1 = 1;P1=LEDbuff[3];i=0;break;

    default:break;

    }

    }

    /************************************************

    void serial_init()

    {

    展开全文
  • //这是个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止//使用时需采用锁存器#include#include"stdio.h"unsigned char code LED[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};...

    //这是一个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止//使用时需采用锁存器

    #include

    #include"stdio.h"

    unsigned char code LED[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; unsigned char LEDbuff[]={0xff,0xff,0xff,0xff};

    //定义数码管的位选段

    sbit SEG_bit_1 = P0^1;

    sbit SEG_bit_2 = P0^2;

    sbit SEG_bit_3 = P0^3;

    sbit SEG_bit_4 = P0^4;

    unsigned int cnt=0;

    unsigned int sec =0;

    unsigned int mini=0;

    unsigned int hour=0;

    unsigned char i=0;

    /*void delay(unsigned int z )

    {

    unsigned int x,y;

    for(x=z;x>0;x--)

    for(y=110;y>0;y--);

    }

    */

    void interrupttimer0() interrupt 1 /*设置中断函数*/

    {

    TH0=0xfc;

    TL0=0x18;

    cnt++;

    //P1=0x80;

    //delay(1);

    switch(i)

    {

    case 0: SEG_bit_1 = 0;SEG_bit_4 = 1;P1=LEDbuff[0];i++;break;

    case 1: SEG_bit_4 = 0;SEG_bit_3 = 1;P1=LEDbuff[1];i++;break;

    case 2: SEG_bit_3 = 0;SEG_bit_2 = 1;P1=LEDbuff[2]&;i++;break;

    case 3: SEG_bit_2 = 0;SEG_bit_1 = 1;P1=LEDbuff[3];i=0;break;

    default:break;

    }

    }

    /************************************************

    void serial_init()

    {

    展开全文
  • 本资源提供了单片机动态数码管显示程序和相应的proteus仿真图,可供大家学习参考。
  • 用c语言编写的 51单片机数码管驱动程序 下面是电路图
  • proteus+stm32+tm1637显示仿真,仿真时数码管刷新率太低,数字一位一位显示,哪位高手改进一下。
  • 动态数码管显示

    2019-01-03 14:11:28
    通过51单片机实现动态数码管的的动态显示,然后在原有程序上进行改进
  • 单片机数码管动态显示c程序多个数码管显示数字的时候,我们实际上是轮流点亮数码管(个时刻内只有个数码管是亮的),利用人眼的视觉暂留现象(也叫余辉效应),就可以做到看起来是所有数码管都同时亮了,这就是动态...

    单片机数码管动态显示c程序

    多个数码管显示数字的时候,我们实际上是轮流点亮数码管(一个时刻内只有一个数码管是亮的),利用人眼的视觉暂留现象(也叫余辉效应),就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫做动态扫描。

    例如:有 2 个数码管,我们要显示“12”这个数字,先让高位的位选三极管导通,然后控制段选让其显示“1”,延时一定时间后再让低位的位选三极管导通,然后控制段选让其显示“2”。把这个流程以一定的速度循环运行就可以让数码管显示出“12”,由于交替速度非常快,人眼识别到的就是“12”这两位数字同时亮了。

    那么一个数码管需要点亮多长时间呢?也就是说要多长时间完成一次全部数码管的扫描呢(很明显:整体扫描时间=单个数码管点亮时间*数码管个数)?答案是:10ms 以内。当电视机和显示器还处在 CRT(电子显像管)时代的时候,有一句很流行的广告语——“100Hz无闪烁”,没错,只要刷新率大于 100Hz,即刷新时间小于 10ms,就可以做到无闪烁,这也就是我们的动态扫描的硬性指标。那么你也许会问,有最小值的限制吗?理论上没有,但实际上做到更快的刷新却没有任何进步的意义了,因为已经无闪烁了,再快也还是无闪烁,只是徒然增加 CPU 的负荷而已(因为 1 秒内要执行更多次的扫描程序)。所以,通常我们设计

    程序的时候,都是取一个接近 10ms,又比较规整的值就行了。我们开发板上有 6 个数码管,那么我们现在就来着手写一个数码管动态扫描的程序,实现兼验证上面讲的动态显示原理。

    我们的目标还是实现秒表功能,只不过这次有 6 个位了,最大可以计到 999999 秒。那么现在要实现的这个程序相对于前几章的例程来说就要复杂的多了,既要处理秒表计数,又要处理动态扫描。在编写这类稍复杂的程序时,建议初学者们先用程序流程图来把程序的整个流程理清,在动手写程序之前先把整个程序的结构框架搭好,把每一个环节要实现的功能先细化出来,然后再用程序代码一步一步的去实现出来。这样就可以避免无处下笔的迷茫感了。如图 6-1 就是本例的程序流程图,大家先根据流程图把程序的执行经过在大脑里走一遍,然后再看接下来的程序代码,体会一下流程图的作用,看是不是能帮助你更顺畅的理清程序流程。

    784209e4afb3d7fc4ee1d1026ad5e6df.png

    图 6-1 数码管动态显示秒表程序流程图

    #include

    sbit ADDR0 = P1^0;

    sbit ADDR1 = P1^1;

    sbit ADDR2 = P1^2;

    sbit ADDR3 = P1^3;

    sbit ENLED = P1^4;

    unsigned char code LedChar[] = { //数码管显示字符转换表

    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

    };

    unsigned char LedBuff[6] = { //数码管显示缓冲区,初值 0xFF 确保启动时都不亮

    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

    };

    void main(){

    unsigned char i = 0; //动态扫描的索引

    unsigned int cnt = 0; //记录 T0 中断次数

    unsigned long sec = 0; //记录经过的秒数

    ENLED = 0; //使能 U3,选择控制数码管

    ADDR3 = 1; //因为需要动态改变 ADDR0-2 的值,所以不需要再初始化了

    TMOD = 0x01; //设置 T0 为模式 1

    TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1ms

    TL0 = 0x67;

    TR0 = 1; //启动 T0

    while (1){

    if (TF0 == 1){ //判断 T0 是否溢出

    TF0 = 0; //T0 溢出后,清零中断标志

    TH0 = 0xFC; //并重新赋初值

    TL0 = 0x67;

    cnt++; //计数值自加 1

    if (cnt >= 1000){ //判断 T0 溢出是否达到 1000 次

    cnt = 0; //达到 1000 次后计数值清零

    sec++; //秒计数自加 1

    //以下代码将 sec 按十进制位从低到高依次提取并转为数码管显示字符

    LedBuff[0] = LedChar[sec%10];

    LedBuff[1] = LedChar[sec/10%10];

    LedBuff[2] = LedChar[sec/100%10];

    LedBuff[3] = LedChar[sec/1000%10];

    LedBuff[4] = LedChar[sec/10000%10];

    LedBuff[5] = LedChar[sec/100000%10];

    }

    //以下代码完成数码管动态扫描刷新

    if (i == 0)

    { ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; }

    else if (i == 1)

    { ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; }

    else if (i == 2)

    { ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; }

    else if (i == 3)

    { ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; }

    else if (i == 4)

    { ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; }

    else if (i == 5)

    { ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; }

    }

    }

    }

    这段程序,大家自己抄到 Keil 中,然后边抄边结合程序流程图来理解,最终下载到实验板上看一下运行结果。其中下边的 if...else 语句就是每 1ms 快速的刷新一个数码管,这样 6个数码管整体刷新一遍的时间就是 6ms,视觉感官上就是 6 个数码管同时亮起来了。

    在 C 语言中, /”等同于数学里的除法运算,而“%”等同于我们小学学的求余数运算,这个前边已有介绍。如果是 123456 这个数字,我们要正常显示在数码管上,个位显示,就是直接对 10 取余数,这个“6”就出来了,十位数字就是先除以 10,然后再对 10 取余数,以此类推,就把 6 个数字全部显示出来了。

    对于多选一的动态刷新数码管的方式,我们如果用 switch 会有更好的效果,大家来看一下我们用 switch 语句完成的情况。

    #include

    sbit ADDR0 = P1^0;

    sbit ADDR1 = P1^1;

    sbit ADDR2 = P1^2;

    sbit ADDR3 = P1^3;

    sbit ENLED = P1^4;

    unsigned char code LedChar[] = { //数码管显示字符转换表

    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

    };

    unsigned char LedBuff[6] = { //数码管显示缓冲区,初值 0xFF 确保启动时都不亮

    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

    };

    void main(){

    unsigned char i = 0; //动态扫描的索引

    unsigned int cnt = 0; //记录 T0 中断次数

    unsigned long sec = 0; //记录经过的秒数

    ENLED = 0; //使能 U3,选择控制数码管

    ADDR3 = 1; //因为需要动态改变 ADDR0-2 的值,所以不需要再初始化了

    TMOD = 0x01; //设置 T0 为模式 1

    TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1ms

    TL0 = 0x67;

    TR0 = 1; //启动 T0

    while (1){

    if (TF0 == 1){ //判断 T0 是否溢出

    TF0 = 0; //T0 溢出后,清零中断标志

    TH0 = 0xFC; //并重新赋初值

    TL0 = 0x67;

    cnt++; //计数值自加 1

    if (cnt >= 1000){ //判断 T0 溢出是否达到 1000 次

    cnt = 0; //达到 1000 次后计数值清零

    sec++; //秒计数自加 1

    //以下代码将 sec 按十进制位从低到高依次提取并转为数码管显示字符

    LedBuff[0] = LedChar[sec%10];

    LedBuff[1] = LedChar[sec/10%10];

    LedBuff[2] = LedChar[sec/100%10];

    LedBuff[3] = LedChar[sec/1000%10];

    LedBuff[4] = LedChar[sec/10000%10];

    LedBuff[5] = LedChar[sec/100000%10];

    }

    //以下代码完成数码管动态扫描刷新

    switch (i){

    case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;

    case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;

    case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;

    case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;

    case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;

    case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break;

    default: break;

    }

    }

    }

    }程序完成的功能是一模一样的,但大家看一下,switch 语句是不是比 if...else 语句显得要整齐清爽呢。

    展开全文
  • 说明: 驱动四一体数码管动态显示数字,可方便的移植到其它程序中。 例如:1、硬件改为三位一体或二一体数码管,只需修改Display_Scan()函数COM个数。 2、本例中,采用了共阴数码管,如果用在共阳数码管,只...
  • 用c语言编写的 51单片机数码管驱动程序 下面是电路图:#include#define uint unsigned intvoid delay7ms(void) //误差 -0.217013888891us{unsigned char a,b;for(b=208;b>0;b--)for(a=14;a>0;a--);}void delay...

    用c语言编写的 51单片机数码管驱动程序 下面是电路图:

    722736e48929c48e807696b73ba0615a.png

    #include

    #define uint unsigned int

    void delay7ms(void)   //误差 -0.217013888891us

    {

    unsigned char a,b;

    for(b=208;b>0;b--)

    for(a=14;a>0;a--);

    }

    void delay2ms(void)   //误差 -0.217013888889us

    {

    unsigned char a,b;

    for(b=80;b>0;b--)

    for(a=10;a>0;a--);

    }

    void main(void)

    {

    uint led[10]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

    uint m,n=0,a=0;

    for(m=0;m<=10;m++)

    {

    while(a<30)

    {

    if(m==10)

    {

    m=0;

    n++ ;

    if(n==10)

    n=0;

    }

    P0=led[m];

    P2=0x40;

    delay7ms();

    P2=0x00;

    delay2ms();

    P0=led[n];

    P2=0x80;

    delay7ms();

    P2=0x00;

    delay2ms();

    a++;

    }

    a=0;

    }

    }

    展开全文
  • 动态数码管显示(proteus仿真图和程序

    万次阅读 多人点赞 2019-05-24 12:35:49
    采用四一体动态数码管显示。 二、共阳极数码管 1、基础介绍 共阳极数码管显示需要PNP三极管进行驱动电路。 三极管的集电极连接数码管的选端,发射极连接电源,基极连接单片机进行控制。 基极高电平,集电极就...
  • 单片机数码管动态显示程序实验,数码管显示一般分静态显示及动态显示两种驱动方式,静态显示占用口线比较多,本文介绍的是如何实现数码管动态显示,应该说数码管动态显示是单片机外部指令输出的重要途径,因此如何...
  • 动态数码管显示实验

    千次阅读 多人点赞 2019-04-19 19:20:24
    本实验采用了普中科技的51单片机开发板 本实验以静态数码管显示实验为基础 通过动态扫描方式静态显示八个数据
  • 基于51单片机的74HC164驱动数码管显示程序与仿真基于51单片机的74HC164驱动一位数码管显示程序与仿真#include#include#define uchar unsigned char#define uint unsigned int//74HC164sbit CLK=P1^0; // 符号CP 引脚...
  • //----------------------------------------------------------------------//名称:按键调节数码管显示//----------------------------------------------------------------------//功能:通过按键加减数码管所显示...
  • 51单片机DHT11数码管显示程序

    热门讨论 2012-09-05 23:01:41
    51单片机DHT11数码管显示程序,DHT11是款方便使用的温湿度传感器,可以同时检测温度和湿度,使用方便,本程序是基于51单片机数码管显示的DHT11,程序中重要部分都有注释,而且已测试通过请放心下载!
  • 51单片机一位数码管汇编程序

    万次阅读 多人点赞 2015-07-29 15:50:11
    51单片机一位数码管汇编程序
  • 51单片机之动态数码管显示

    万次阅读 多人点赞 2019-05-17 19:34:33
    本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。 138译码器的真值表如下图G1,G2A,G2B都是...
  • FPGA 动态数码管显示实验

    千次阅读 2020-10-31 22:17:00
    但一般不建议浪费宝贵的I/O口资源,尤其在I/O口资源紧张的情况下,所以对于多位数码管一般采用动态驱动方式使数码管显示数字。那么什么是动态驱动方式呢? 为了更好的理解数码管动态驱动,我们首先
  • 多个数码管显示数字的时候,我们实际上是轮流点亮数码管(个时刻内只有个数码管是亮的),利用人眼的视觉暂留现象(也叫余辉效应),就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫做动态扫描。...
  • 原标题:数码管滚动显示数字...(C程序)// 68639665数字//Create Time :2008-08-25#include #include #define uchar unsigned char#define uint unsigned intuchar code table[96]={ 0x82,0x80,0x82,0xb0,0x90,0x82,...
  • 数码管动态显示程序实验,数码管显示一般分静态显示及动态显示两种驱动方式,静态显示占用口线比较多,本文介绍的是如何实现数码管动态显示,应该说数码管动态显示是单片机外部指令输出的重要途径,因此如何设计...
  • 1 主要描述:数码管显示通用程序。带高位消隐功能。 2 硬件环境:51MCU, 4显示共阳数码管。P3口P3.2-P3.5是选,P1口对应数码管8段。 3 软件平台:Keil c, c51, rtx51 tiny. 4 附加描述:程序段先把数码管全部...
  • 这是用verilog语言写的七段数码管显示程序,所用板子为Basys2
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include #define uint unsigned int#define uchar unsigned charuint temp;sbit smg0=P1^0;sbit smg1=P1^1;sbit smg2=P1^2;sbit smg3=P1^3;uchar qian,bai,shi,ge,tt;...
  • 动态显示位数码管

    2018-04-29 09:34:58
    该文档是基于单片机实验得小程序,用c语言编写,来能为数码管动态显示,并且附Proteus仿真
  • Verilog——动态数码管显示

    千次阅读 2020-11-25 17:11:33
    要点:定时轮询6位数码管的使能,通过人眼的视觉差动态显示数码管信息。 1、模块信息 module seg_led_driver( input sys_clk, input sys_rst_n, input [5:0] point, //数码管point的显示状态,0为显示,1...
  • 1. 数码管静态、动态显示原理 静态显示的特点是每个...缺点是硬件电路比较复杂,成本较高 动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓...
  • FPGA-06FPGA动态数码管显示

    千次阅读 2019-08-30 10:16:00
    数码管各个位显示不同的数字,这就需要以动态驱动的方式驱动数码管。 (1)实验任务 使用FPGA开发板上的6位数码管以动态方式从0开始计数,每100ms计数值增加,当计数值从0增加到999999后重新从0开始计数。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,930
精华内容 3,172
关键字:

一位动态数码管显示程序