欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機小白,定時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://m.raoushi.com/bbs/) Powered by Discuz! X3.1