标题: 单片机小白,定时1ms,数码管依旧闪烁怎么解决? [打印本页]

作者: dgjq    时间: 2020-3-30 19:51
标题: 单片机小白,定时1ms,数码管依旧闪烁怎么解决?
编程实现前五位数码管显示固定数字,后两位数码管循环显示数字0~99
定时为1ms,前四位一直闪烁
#include<reg51.h>
#include<intrins.h>
#define SEG1 P0//段码线
#define SEG2 P1//段码线
#define SEG3 P3//段码线
sbit S1=P2^0;//第1个数码管公共端  位选线
sbit S2=P2^1;//第2个数码管公共端  位选线
sbit S3=P2^2;//第3个数码管公共端  位选线
sbit S4=P2^3;//第4个数码管公共端  位选线
sbit S5=P2^4;//第5个数码管公共端  位选线
void Delayms(unsigned int c);/*延时函数*/


//unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x671};//显示0~F的值 共阴极
//0~F段码 //显示0~F的值 共阴极

unsigned char code DIG_CODE[16]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值         共阳极
//0~F段码 //显示0~F的值         共阳极
void main()
{
                int n;
                while(1)
                  for(n=0;n<=99;n++)
        {
          {       
                S1= 1;S2= 0;S3= 0;S4= 0;S5=0 ;//第1个数码管工作 第2/3/4/5个数码管不工作
                SEG1 = DIG_CODE[0];         //万位
                Delayms(1);
                S1= 0;S2= 1;S3= 0;S4= 0;S5=0; //第1/3/4/5个数码管不工作 第2个数码管工作
                SEG1 = DIG_CODE[6];        //千位
                Delayms(1);
                S1= 0;S2= 0;S3= 1;S4= 0;S5=0; //第1/2/4/5个数码管不工作 第3个数码管工作
                SEG1 = DIG_CODE[1]; //百位
                Delayms(1);
                S1= 0;S2= 0;S3= 0;S4= 1;S5=0; //第1/2/3/5个数码管不工作 第4个数码管工作
                SEG1 = DIG_CODE[2];         //十位
                Delayms(1);
                S1= 0;S2= 0;S3= 0;S4= 0;S5=1; //第1/2/3/4个数码管不工作 第5个数码管工作
                SEG1 = DIG_CODE[3];         //个位
                Delayms(1);       
                         SEG2=        DIG_CODE[n%100/10];
                         SEG3=        DIG_CODE[n%10];
                         Delayms(50);
                }
          
        }                               
}

void Delayms(unsigned int c)                //@12.000MHz
{
        unsigned char i, j;
        while(c--)
        {
                i = 2;
                j = 239;
                do
                {
                        while (--j);
                } while (--i);
        }
}


作者: csmyldl    时间: 2020-3-30 21:17
把延时程序改为用定时器延时2ms就好了,因为循环延时不准确
作者: chenalfe2013    时间: 2020-3-31 04:08
主要是Delayms(50);这个太长,导致最后一位显示时间长,前面的4位显示时间每位只有Delayms(1),就会引起闪烁。
把Delayms(50)去掉。Delayms(1);改大一点,可以改成Delayms(5);
作者: man1234567    时间: 2020-3-31 10:25
从硬件方面,将前几位信号锁存就不闪了,如果仅做样子可以直接短接;
从软件方面,显示同步延时,末两位多次显示相同内容后再加1以求效果。
作者: wulin    时间: 2020-3-31 13:34
void main()
{
        int n;
        while(1)
?????????
        for(n=0;n<=99;n++)
        {
                {       
作者: 起风了~    时间: 2020-3-31 18:53
delay函数的延时问题,建议把delay后面的数值慢慢调试,但是用delay函数的话延时1ms一般都不会很精确,可以采用定时中断定时1ms。
作者: www12www    时间: 2020-3-31 22:02
整体刷新频率低于50hz()肯定闪烁,即刷新周期大于20
ms肯定闪烁。
作者: dgjq    时间: 2020-4-1 07:38
chenalfe2013 发表于 2020-3-31 04:08
主要是Delayms(50);这个太长,导致最后一位显示时间长,前面的4位显示时间每位只有Delayms(1),就会引起闪 ...

把延时改小的话0~99循环太快就看不清了
作者: dgjq    时间: 2020-4-1 07:41
wulin 发表于 2020-3-31 13:34
void main()
{
        int n;

把for语句放在后面前四位闪一下就不亮了
作者: dgjq    时间: 2020-4-1 07:47
man1234567 发表于 2020-3-31 10:25
从硬件方面,将前几位信号锁存就不闪了,如果仅做样子可以直接短接;
从软件方面,显示同步延时,末两位多 ...

能给一下具体的程序吗?我刚刚开始学这门课,不太理解
作者: dgjq    时间: 2020-4-1 07:49
起风了~ 发表于 2020-3-31 18:53
delay函数的延时问题,建议把delay后面的数值慢慢调试,但是用delay函数的话延时1ms一般都不会很精确,可以 ...

定时中断怎么用?可以具体解释一下吗?我刚刚接触这门课,不太懂
作者: 一泓秋    时间: 2020-4-1 10:48
你这个for循坏加的目的是不是想快速扫描达到消隐的效果,结果是不是和你预想不一样,首先呐,循环不用那么多,你有几个数码管就用几个循环,然后加入你的段选位选信号,然后定时器产生1ms延时。建议写一个显示函数,不要在主程序里面写那么多。
作者: dgjq    时间: 2020-4-1 12:58
一泓秋 发表于 2020-4-1 10:48
你这个for循坏加的目的是不是想快速扫描达到消隐的效果,结果是不是和你预想不一样,首先呐,循环不用那么 ...

for循环是为了最后两位循环显示0~99,下面的那些是前五位固定数字的显示




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1