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

標題: stc單片機怎么用定時器寫有參延時器? [打印本頁]

作者: hjx5548    時間: 2021-10-7 08:26
標題: stc單片機怎么用定時器寫有參延時器?
怎么用stc單片機寫有參延時子程序,可以調用單位為秒的延時,miao(s),調用時可以1-n秒。

作者: 188610329    時間: 2021-10-7 15:52
首先,針對你的標題, 延時,不要用定時器。

其次,如果沒有必要不要用有參延時子程序,一旦有參,就不會精準。(建議)

延時子程序,需要牽涉到  系統主頻,以及你的編譯軟件(尤其是STC的單片機),其實精準的延時最好用匯編寫,尤其是STC的單片機,理由下面會講。
主頻就不說了,應該能理解,下面將延時子程序的時間計算。
延時主要就是讓程序在某地反復做一些沒意義的事情,延緩下一步操作開始的時間,常用的方法是:
while(--i);          編譯的時候,一般會轉成匯編    DJNZ   R7,$     或者 DJNZ    07,$
R7, 是寄存器地址,  07 是直接地址,  在STC不同型號下 這個操作的時鐘數是不同的。
比如  STC89 , 這個操作是 24個時鐘 相當于 2個NOP
STC 15 系列, 如果 DJNZ R7  那么是 4個時鐘,即 4個NOP,  DJNZ 07 那么就是5個時鐘,即5個NOP
STC 8 系列, 則是 3個時鐘, 最后0的時候 2個時鐘, 即 3或 2 個NOP
現在發現 要 計算延時時間的復雜程度了吧? 不同的型號的STC 要寫不同的延時函數,
這還只是 針對 while(--i); 的, 如果你 調皮 用 for 來寫延時函數, 好要牽涉到  DEC 或者 INC 還要牽涉到 CJNE 這些匯編代碼的時鐘周期。所以,如果你會匯編,可以考慮 用匯編寫 延時 ,然后 PUBLIC 讓C程序調用,這樣比較精準。  如果不會, 那么建議,延時的時間種類不多的話,就用STC的ISP軟件自帶的延時計算,做幾個延時子函數,會更好一點。

作者: 188610329    時間: 2021-10-7 16:14
居然忘了正事……
帶參延時程序寫法:

首先,用STC-ISP自帶的的 延時程序生成器 生成出 5微秒延時子程序,delay5us();  1毫秒延時子程序,delay1ms();
然后,制作如下兩個帶參子程序:
void  delay_us(unsigned char i)      // 這里一定要用char 不然精準度會差很多
{
        while(i--)   delay5us();
}

void  delay_ms(unsigned char i)      // 這里一定要用char 不然精準度會差很多
{
        while(i--)   delay1ms();
}

那么,主程序中只要:
delay_ms(10);         //就是延時10毫秒

delay_us(10);      //就是延時50微秒

切記,作為基準的延時子函數,盡量不要小于4微秒,不然精準度會差很多,傳參在微秒級別必須用單字節(char) , 毫秒級別的,可以酌情雙字節。


作者: lkc8210    時間: 2021-10-7 16:44
  1. void Miao(u8 Sec)
  2. {
  3.         while(Sec)
  4.         {
  5.                 if(!u16_Delayms_Pre)//在一微秒定時器中減一,直到零
  6.                 {u16_Delayms_Pre = 1000;
  7.                         Sec--;
  8.                 }
  9.         }
  10. }
復制代碼

作者: 創造生活    時間: 2021-10-7 17:08
188610329 發表于 2021-10-7 15:52
首先,針對你的標題, 延時,不要用定時器。

其次,如果沒有必要不要用有參延時子程序,一旦有參,就不 ...

老師為什么有參數不會很精準
作者: 188610329    時間: 2021-10-7 17:16
創造生活 發表于 2021-10-7 17:08
老師為什么有參數不會很精準

傳參牽涉到很多 代碼, 比如:
PUSH  07
MOV  R7,#10
CALL delay
POP  07

而這些,都是占用時鐘數的,你要精準的話,要把這些時間都算上去,而這些可能就要超過1微秒的時間了,你說你延時 2微秒,光這些準備時間就1~2 微秒了,你的核心延時程序怎么寫法才能精準?所以,沒有10微秒以上延時,是非常不建議傳參延時的。
作者: 1588848    時間: 2022-12-21 14:55
188610329 發表于 2021-10-7 15:52
首先,針對你的標題, 延時,不要用定時器。

其次,如果沒有必要不要用有參延時子程序,一旦有參,就不 ...

簡直是胡說八道啊,,應該是能不用延時就不用延時,延時就是在浪費CPU,一直在做無用功。所以最好一個延時都不用。這樣才能增強實時性。
作者: coody_sz    時間: 2022-12-23 11:30
樓主,STC官方例子就有定時器0~4的用法。舉個例子:
#define         MAIN_Fosc                24000000UL        //定義主時鐘

//========================================================================
// 函數: u8        Timer0_Config(u32 time)
// 描述: timer0初始化函數.
// 參數: time: 時間us.
// 返回: 0: 初始化正確, 1: 重裝值過大, 初始化錯誤.
// 版本: V1.0, 2018-3-5
//========================================================================
u8        Timer0_Config(u32 time)        //time值是時間(單位us)
{
        TR0 = 0;        //停止計數
        TMOD &= 0xf0;
       
        time = (u32)(((float)MAIN_Fosc * (float)time)/1000000UL);        //重裝的是時間(us), 計算所需要的系統時鐘數.
        if(time >= (65536UL * 12))        return 1;        //值過大, 返回錯誤
        if(time < 65536UL)        AUXR |= 0x80;                //1T mode
        else
        {
                AUXR &= ~0x80;        //12T mode
                time = time / 12;
        }
        time = 65536UL - time;
        TH0 = (u8)(time >> 8);
        TL0 = (u8)(time);

        ET0 = 1;        //允許中斷
//        PT0 = 1;        //高優先級中斷
        TMOD = (TMOD & ~0x03) | 0;        //工作模式, 0: 16位自動重裝, 1: 16位定時/計數, 2: 8位自動重裝, 3: 16位自動重裝, 不可屏蔽中斷
        TR0 = 1;        //開始運行
        return 0;
}

初始化調用:
        Timer0_Config(10000);        //定時時間 us

//========================================================================
// 函數: void timer0_ISR (void) interrupt TIMER0_VECTOR
// 描述:  timer0中斷函數.
// 參數: none.
// 返回: none.
// 版本: V1.0, 2016-5-12
//========================================================================
void timer0_ISR (void) interrupt TIMER0_VECTOR
{
   P32 = ~P32;
}


作者: 1261867136qq    時間: 2023-1-3 10:02
用 ISP自帶的
作者: Monster_51    時間: 2023-1-4 21:40
編寫一段關于延時的函數,主要利用for循環,代碼如下: void delay_ms(unsigned int ms) { unsigned int i; unsigned char j;     for(i=0;i<ms;i++)     {         for(j=0;j<200;j++);         for(j=0;j<102;j++);     }  }




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1