久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 定時器中斷的計時問題 [打印本頁]

作者: xzf586    時間: 2017-9-24 19:26
標題: 定時器中斷的計時問題
定時器中斷的計時問題
前些天看到一個定時器中斷的計時問題,那里面采用的答案似乎是,中斷執行以后才開始再次計時,對此不敢茍同,考慮以下程序,0.1秒表計時
#include<reg52.h>

unsignedchar code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//
unsignedchar code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedchar miao=0;

voidDelayUs2x(unsigned char t)//大致延時(2*t+5)us

{  
    while(--t);
}

voidDelayMs(unsigned int t)//大致延時1mS

{   
    while(t--)
    {         
         DelayUs2x(245);
         DelayUs2x(245);
    }
}


/*------------------------------------------------
顯示函數,用于動態掃描數碼管
------------------------------------------------*/
voidDisplay(unsigned char dat)
{
    P1=0xff;
    P0=DuanMa[dat%10];
    P1=0x7f;
    DelayMs(3);

    P1=0xff;
    P0=DuanMa[(dat/10)%10]|0x80;
    P1=0xbf;
    DelayMs(3);

    P1=0xff;
    P0=DuanMa[(dat/100)%10];
    P1=0xdf;
    DelayMs(3);

}

/*------------------------------------------------
                  主函數

------------------------------------------------*/
voidmain (void)
{        
    TMOD |= 0x01;                              
    TH0=(65536-2000)/256;                 
    TL0=(65536-2000)%256;   //2ms定時

    EA=1;            
    ET0=1;         
    TR0=1;                             

    while (1)        
    {         
         Display(miao);
    }
}



/*------------------------------------------------
                定時器中斷子程序

------------------------------------------------*/
voidTimer0_isr(void) interrupt 1
{
    static unsigned char count=0;
    TH0=(65536-2000)/256;                 //重新賦值 2ms

    TL0=(65536-2000)%256;
    count++;
    if(count==50)
    {
          miao++;
          count=0;
    }
//    DelayMs(1);   
}

1:定時器是2MS定時,中斷里面的 延時1ms DelayMs(1),去掉與加上,對計時沒有影響
2:將中斷程序改成
voidTimer0_isr(void) interrupt 1
{
    static unsigned char count=0;
   
    count++;
    if(count==50)
    {
          miao++;
          count=0;
    }
    DelayMs(1);   
TH0=(65536-2000)/256;                 //重新賦值 2ms

    TL0=(65536-2000)%256;
}
影響結果很大!
為了再次驗證樓主的想法,干脆將中斷程序改為
voidTimer0_isr(void) interrupt 1
{
    static unsigned char count=0;
    //TH0=(65536-2000)/256;                 //重新賦值 2ms

    //TL0=(65536-2000)%256;
    count++;
    if(count==50)
    {
          miao++;
          count=0;
    }
    DelayMs(1);   
}
去掉重新賦值,計時依然,但是慢了許多!
結論:
1:定時計數滿了以后,模式1就是到達65536,溢出標志TF0在進入中斷服務程序后,自動清零,開始下一次中斷計時,計時是從中斷服務程序的第一條語句開始

2:正因為1,所以進入中斷后,首先是給定時器賦值,否則其從0開始計時,所以賦值的位置不對,結果差異很大

3:在中斷服務程序中是不會再次進入此中斷,上面DelayMs(1)延時1MS沒有影響,但是一旦改成延時2ms,結果就亂了套,因此中斷服務的運行時間不能超過定時器的定時時間,除非關閉中斷,最后再開啟中斷

以上是個人想法!


作者: xzf586    時間: 2017-9-24 19:30
從上面可以看出,使用定時器定時也會有誤差,誤差的來源是:1主程序任務的保存時間,2是定時器初值的賦值時間
作者: ahshmj    時間: 2017-9-25 20:09
65535+1=0
65535=0xffff
0xffff+1=0x10000
由于只有16位,只能顯示0x0000.

定時器根據需要設置初值,初值+延時時間=65535,如果不重新裝載初值,就會從零開始。

重裝初值應在中斷函數的最前面,如果延時1ms再裝初值,每次中斷就會延長1ms。
作者: karolyte    時間: 2020-6-30 16:04
您好,我現在有個程序,定時器設置的定時時間是1ms,中斷服務的運行時間是570us,沒有超過定時時間,但是實際運行時發現沒有按照設定的定時時間進入中斷,它自己70ms進入一次中斷,目前不知道是什么原因造成的
作者: long...    時間: 2020-6-30 16:29
很好,一下就說中了要點




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 成人性生交大片免费看中文带字幕 | 伊人性伊人情综合网 | 久久中文字幕电影 | 亚洲国产精品久久久久婷婷老年 | 中文字幕欧美一区 | 久久久久久久网 | 亚洲欧洲国产视频 | 中文字字幕在线中文乱码范文 | 青青久草 | 91精品国产综合久久久久久丝袜 | 欧美精品在线播放 | 午夜久久久 | 日本不卡一区二区三区 | 国产视频久久 | 中文字幕亚洲精品在线观看 | 激情av在线| 国产精品激情 | 日日操av | 欧美成人一区二免费视频软件 | 免费毛片在线 | 欧美老妇交乱视频 | 精品一区二区三区四区在线 | 精品网站999www | 亚洲先锋影音 | 精品国产一区二区在线 | 国产高清视频在线观看 | 日韩视频在线一区 | 久久久91精品国产一区二区精品 | 欧美三区在线观看 | 成人视屏在线观看 | 999久久| 免费精品国产 | 人成在线 | 99久久婷婷国产亚洲终合精品 | 99精品免费视频 | re久久 | 狠狠久 | 日韩成人在线观看 | 久久精品a| 欧美视频网| 嫩草黄色影院 |