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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3409|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

stc單片機怎么用定時器寫有參延時器?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72649 發(fā)表于 2021-10-7 08:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
怎么用stc單片機寫有參延時子程序,可以調(diào)用單位為秒的延時,miao(s),調(diào)用時可以1-n秒。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:624769 發(fā)表于 2021-10-7 15:52 | 只看該作者
首先,針對你的標(biāo)題, 延時,不要用定時器。

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

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

使用道具 舉報

板凳
ID:624769 發(fā)表于 2021-10-7 16:14 | 只看該作者
居然忘了正事……
帶參延時程序?qū)懛ǎ?br />
首先,用STC-ISP自帶的的 延時程序生成器 生成出 5微秒延時子程序,delay5us();  1毫秒延時子程序,delay1ms();
然后,制作如下兩個帶參子程序:
void  delay_us(unsigned char i)      // 這里一定要用char 不然精準(zhǔn)度會差很多
{
        while(i--)   delay5us();
}

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

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

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

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

回復(fù)

使用道具 舉報

地板
ID:161164 發(fā)表于 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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

5#
ID:881715 發(fā)表于 2021-10-7 17:08 來自觸屏版 | 只看該作者
188610329 發(fā)表于 2021-10-7 15:52
首先,針對你的標(biāo)題, 延時,不要用定時器。

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

老師為什么有參數(shù)不會很精準(zhǔn)
回復(fù)

使用道具 舉報

6#
ID:624769 發(fā)表于 2021-10-7 17:16 | 只看該作者
創(chuàng)造生活 發(fā)表于 2021-10-7 17:08
老師為什么有參數(shù)不會很精準(zhǔn)

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

而這些,都是占用時鐘數(shù)的,你要精準(zhǔn)的話,要把這些時間都算上去,而這些可能就要超過1微秒的時間了,你說你延時 2微秒,光這些準(zhǔn)備時間就1~2 微秒了,你的核心延時程序怎么寫法才能精準(zhǔn)?所以,沒有10微秒以上延時,是非常不建議傳參延時的。
回復(fù)

使用道具 舉報

7#
ID:951974 發(fā)表于 2022-12-21 14:55 | 只看該作者
188610329 發(fā)表于 2021-10-7 15:52
首先,針對你的標(biāo)題, 延時,不要用定時器。

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

簡直是胡說八道啊,,應(yīng)該是能不用延時就不用延時,延時就是在浪費CPU,一直在做無用功。所以最好一個延時都不用。這樣才能增強實時性。
回復(fù)

使用道具 舉報

8#
ID:1034262 發(fā)表于 2022-12-23 11:30 | 只看該作者
樓主,STC官方例子就有定時器0~4的用法。舉個例子:
#define         MAIN_Fosc                24000000UL        //定義主時鐘

//========================================================================
// 函數(shù): u8        Timer0_Config(u32 time)
// 描述: timer0初始化函數(shù).
// 參數(shù): time: 時間us.
// 返回: 0: 初始化正確, 1: 重裝值過大, 初始化錯誤.
// 版本: V1.0, 2018-3-5
//========================================================================
u8        Timer0_Config(u32 time)        //time值是時間(單位us)
{
        TR0 = 0;        //停止計數(shù)
        TMOD &= 0xf0;
       
        time = (u32)(((float)MAIN_Fosc * (float)time)/1000000UL);        //重裝的是時間(us), 計算所需要的系統(tǒng)時鐘數(shù).
        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;        //高優(yōu)先級中斷
        TMOD = (TMOD & ~0x03) | 0;        //工作模式, 0: 16位自動重裝, 1: 16位定時/計數(shù), 2: 8位自動重裝, 3: 16位自動重裝, 不可屏蔽中斷
        TR0 = 1;        //開始運行
        return 0;
}

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

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

回復(fù)

使用道具 舉報

9#
ID:308903 發(fā)表于 2023-1-3 10:02 | 只看該作者
用 ISP自帶的
回復(fù)

使用道具 舉報

10#
ID:1060350 發(fā)表于 2023-1-4 21:40 | 只看該作者
編寫一段關(guān)于延時的函數(shù),主要利用for循環(huán),代碼如下: 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++);     }  }
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 性欧美精品一区二区三区在线播放 | 成人免费视频网站在线观看 | 精品视频一区二区三区四区 | 亚洲精品乱码久久久久久9色 | 阿v视频在线观看 | 91在线视频观看 | 久久久久国产精品 | 一区二区三区成人 | 亚洲最新在线 | 农村真人裸体丰满少妇毛片 | 美女黄色在线观看 | 精品视频一区二区在线观看 | 亚洲精品久久久一区二区三区 | 自拍视频国产 | 久久久夜| cao在线| 亚洲有码转帖 | 少妇特黄a一区二区三区88av | 久久久久久久久久久丰满 | 久久这里只有精品首页 | 99精品国自产在线 | 亚洲视频在线看 | 亚洲欧美在线观看视频 | 久久天天躁狠狠躁夜夜躁2014 | 日韩欧美中文在线 | 99精品视频一区二区三区 | 五月婷婷亚洲 | 欧美高清性xxxxhdvideosex | 99精品欧美 | 午夜精品一区二区三区在线观看 | 中文字幕不卡一区 | 日韩一级欧美一级 | 一区不卡在线观看 | 中文在线a在线 | 美女视频h | 欧美中文字幕一区二区三区 | 91av在线视频观看 | 国产精品久久久久久久免费大片 | 日本中文字幕一区 | 亚洲在线观看视频 | 国产成人jvid在线播放 |