找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2439|回复: 11
打印 上一主题 下一主题
收起左侧

初学定时中断做了个时钟,显示数字为何一直闪?请教各位了!

  [复制链接]
跳转到指定楼层
楼主
ID:686778 发表于 2020-2-5 22:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:

#include<reg52.h>

unsigned char i=0;
unsigned int c = 0;

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

void delay(unsigned int ms)  //延迟函数
{
        unsigned int a;
        unsigned int b;
        for (a = ms; a > 0; a--)
        {
                for (b = 121; b > 0; b--);
        }
}

void dsnumber() //数码二极管显示函数
{
        unsigned int b;
       
        b = c;
        P2 = 0xfe;      //第一个数码管亮
        b  = b/600%6;   //计算十分位的数值
        P0 = table[b];  //
        delay(10);                 //延迟

        b = c;
        P2 = 0xfd;      //第二个数码管亮
        b  = b/60%10;   //计算分位的数值
        P0 = table[b];  //
        delay(10);                 //延迟

               
        b = c;
        P2 = 0xfb;      //第三个数码管亮
        b  = b/10%6;    //计算十秒位的数值
        P0 = table[b];  //
        delay(10);                 //延迟

       
        b = c;
        P2 = 0xf7;      //第四个数码管亮
        b  = b%10;       //计算秒位的数值
        P0 = table[b];         //
        delay(10);                 //延迟
    P0=0xff;
       
}


void InitTimer0(void)
{
    TMOD = 0x01;//计数器状态选择
        TH0 = 0x4C;//计数初值,11.0592M晶振
    TL0 = 0x00;//计数初值
    EA = 1;//EA为 中断开关,不需硬件中断时可以不写。
    ET0 = 1;//ET0为0或不写默认为0时,计数器溢出TF0=1,不产生中断,需要软件清除。为1时引发中断同时硬件清0标志位。
    TR0 = 1;//计数开始
       
}

void main(void)
{
   InitTimer0();//重复上面的中断
        while(1)
        dsnumber();
       
}

void Timer0Interrupt(void) interrupt 1
{

        i++;
        TH0 = 0x4C;
    TL0 = 0x00;
        if  (i==20) /* 50ms定时中断,20次为1S */
        {
                c++;
                i=0;
               
        }
       
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:437615 发表于 2020-2-5 23:04 来自手机 | 只看该作者
闪的话一般是因为51单片机速度比较慢,数码管刷新的速度跟不上
回复

使用道具 举报

板凳
ID:686778 发表于 2020-2-5 23:43 | 只看该作者
还有个问题,显示延时的时间,是否影响时钟的准确性,需要在定时中断中减去或者说补偿一下吗?
回复

使用道具 举报

地板
ID:235200 发表于 2020-2-6 00:16 | 只看该作者
你要明白数码管闪的原因是每一位数码管点亮至下一位点亮的时间问题,程序中用了delay(10);   //延迟作为每一位数码管的显示时间,显然不符合要求,程序中4位数码管显示,其延时时间应控制在4.5ms左右,与定时计数器作为中断没有关系(因显示不是用定时计数器定时)
回复

使用道具 举报

5#
ID:213173 发表于 2020-2-6 06:27 | 只看该作者
数码管动态显示周期不宜大于20ms,否则会闪烁。4位数码管每位显示延时应不大于5ms,楼主使用10ms延时时间太长。
回复

使用道具 举报

6#
ID:332444 发表于 2020-2-6 07:23 | 只看该作者
数码管延时值调整试看
回复

使用道具 举报

7#
ID:587810 发表于 2020-2-6 09:11 来自手机 | 只看该作者
你可以试着改一下延时时间
回复

使用道具 举报

8#
ID:462827 发表于 2020-2-7 01:07 | 只看该作者
数码管动态扫描一般间隔不要太长,2ms左右就好,另外还需要消影。
回复

使用道具 举报

9#
ID:686778 发表于 2020-12-2 21:10 | 只看该作者
显示延时由delay(10)改为delay(1)就好了,不闪了。谢谢以上各位!
回复

使用道具 举报

10#
ID:853361 发表于 2020-12-2 21:18 | 只看该作者
delay(unsigned int ms)这个函数延时明显不够

评分

参与人数 1黑币 +20 收起 理由
admin + 20

查看全部评分

回复

使用道具 举报

11#
ID:782419 发表于 2020-12-3 09:44 | 只看该作者
多位数码管显示一般是动态刷新,你在显示函数中用延时的想法有问题!
建议在网上找一些关于动态数码管动态显示的教程参考学习学习。
回复

使用道具 举报

12#
ID:767811 发表于 2020-12-3 14:35 | 只看该作者
这种问题,我一般遇到的话会先检查数码管是不是选错了,例如共阴极用成了共阳极
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表