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

標(biāo)題: 一個(gè)關(guān)于單片機(jī)硬件延時(shí)的疑惑 [打印本頁(yè)]

作者: laopihappy123    時(shí)間: 2021-11-21 21:54
標(biāo)題: 一個(gè)關(guān)于單片機(jī)硬件延時(shí)的疑惑
本帖最后由 laopihappy123 于 2021-11-22 20:21 編輯

關(guān)于單片機(jī)的定時(shí),在我剛剛學(xué)習(xí)的時(shí)候,都是用軟件實(shí)現(xiàn)的.但在軟件進(jìn)行延時(shí)的過(guò)程中,cpu時(shí)間被白白浪費(fèi)了,此時(shí)能利用cpu的只有中斷.


隨著使用的深入,我越發(fā)覺(jué)得軟件定時(shí)這是不是個(gè)好方法,雖然它很簡(jiǎn)單.

隨后我對(duì)硬件定時(shí)進(jìn)行了了解,發(fā)現(xiàn)替代的方法有個(gè)用定時(shí)器來(lái)搞的:
在定時(shí)器中斷里設(shè)置一個(gè)標(biāo)志位,每當(dāng)定時(shí)器運(yùn)行到設(shè)定的時(shí)間,就將該位置置位(定時(shí)短)或+1(定時(shí)時(shí)間較長(zhǎng)),然后用外部程序去查詢這個(gè)標(biāo)志位,做判斷.

但是我又有了個(gè)疑惑,對(duì)于后者,假如我要定時(shí)30毫秒,定時(shí)器溢出時(shí)間為1ms,標(biāo)志位用8位無(wú)符號(hào)
那到了240的時(shí)候,240+30=14 ,溢出了~ 這個(gè)怎么處理?
難道我把最大閾值設(shè)定為225么? 那假如我有多個(gè)不同的延時(shí)需要進(jìn)行處理呢?.... 沒(méi)辦法呀~ 難道要設(shè)置最大延時(shí)限制值么?...

讓人很是摸不著頭腦,求大家?guī)椭幌挛已絶

---------------分割線---------------
一天后更新,感謝大家的回復(fù)與指教,我看了感覺(jué)無(wú)地自容.....愧對(duì)壇齡,愧對(duì)老師....
大家的回復(fù)我都有好好看,我會(huì)好好學(xué)習(xí)的,謝謝大家

作者: my808    時(shí)間: 2021-11-21 23:53
標(biāo)志位可以隨時(shí)清零。
等到了30ms 執(zhí)行操作后,順便清零標(biāo)志位,



可以設(shè)置多個(gè)變量 例如 flag_300ms = 0;  上面每次到30ms 就加一;
然后大循環(huán)里面判斷flag_300ms ==9,執(zhí)行操作,清零  flag_300ms
作者: lkc8210    時(shí)間: 2021-11-22 01:30
標(biāo)志位用完要清零
void timer0_int (void) interrupt 1  //1ms
{
        if(!TMR_01_DN)
          if(++TMR_01_OT>30)
            {
               TMR_01_DN = 1;
               TMR_01_OT = 0;  //clear count
            }
}
void main()
{
        if(TMR_01_DN)
          {TMR_01_DN = 0;  //clear flag
            //your code
          }
}
作者: IdeaMing    時(shí)間: 2021-11-22 01:36
看樣子,您還在單片機(jī)門檻上,沒(méi)有了解有時(shí)間片輪,RTX-Tiny系統(tǒng)
  1. unsigned short TimeMs;//全局變量 short 65536一般夠用了

  2. void TIM0_Init(void)                //設(shè)置定時(shí)器1毫秒一個(gè)中斷,代碼省略
  3. {}

  4. void TIM0_Int (void) interrupt 1
  5. {
  6.   if(TimeMs>0)//如果有延時(shí)
  7.       TimeMs--;
  8. }

  9. void Delay(unsigned short t)//short 65536一般夠用了
  10. {
  11.         TimeMs = t;
  12.         while(TimeMs);
  13. }

  14. void main(void)
  15. {
  16.         while(1)
  17.         {
  18.                 P1^0 = 0X00;

  19.                 Delay(1000);
  20.                
  21.                 P1^0 = 0XFF;

  22.                 Delay(1000);
  23.         }
  24. }
復(fù)制代碼


作者: IdeaMing    時(shí)間: 2021-11-22 01:44
還有
  1. unsigned short TimeMs;//全局變量 short 65536一般夠用了
  2. unsigned short Systick;//全局變量 short 65536一般夠用了

  3. void TIM0_Init(void)                //設(shè)置定時(shí)器1毫秒一個(gè)中斷,代碼省略
  4. {}

  5. void TIM0_Int (void) interrupt 1
  6. {
  7.   if(TimeMs>0)//如果有延時(shí)
  8.       TimeMs--;
  9.   Systick++;
  10. }

  11. void Delay(unsigned short t)//short 65536一般夠用了
  12. {
  13.         TimeMs = t;
  14.         while(TimeMs);
  15. }

  16. void Delay2(unsigned short t)//short 65536一般夠用了
  17. {
  18.         unsigned short start;

  19.         start = Systick;
  20.         while((Systick-start) < t);
  21. }

  22. void main(void)
  23. {
  24.         while(1)
  25.         {
  26.                 P1^0 = 0X00;

  27.                 Delay(1000);
  28.                
  29.                 P1^0 = 0XFF;

  30.                 Delay(1000);
  31.         }
  32. }
復(fù)制代碼

作者: IdeaMing    時(shí)間: 2021-11-22 01:45
附上代碼

p.zip

647 Bytes, 下載次數(shù): 6


作者: Hephaestus    時(shí)間: 2021-11-22 02:49
沒(méi)有任何規(guī)定讓你必須要用8位標(biāo)志,255不夠用換16位數(shù)據(jù)好了。
作者: wulin    時(shí)間: 2021-11-22 04:56
用軟件延時(shí)的時(shí)間長(zhǎng)度是無(wú)限值,定時(shí)器溢出時(shí)間為1ms,定時(shí)30毫秒只要計(jì)數(shù)30。使用后清0,怎么會(huì)溢出?240+30的算法又從何談起?樓主提這個(gè)問(wèn)題明顯與壇齡不符。
作者: Jack315    時(shí)間: 2021-11-22 08:12
定時(shí)器溢出時(shí)間為1ms,另外用一個(gè)變量做(加法或減法)計(jì)數(shù)器。計(jì)數(shù)到 30 ms 時(shí),計(jì)數(shù)大器復(fù)位并執(zhí)行相應(yīng)的操作。

多個(gè)定時(shí)的情形,最容易理解的是實(shí)時(shí)時(shí)鐘。定時(shí)器溢出時(shí)間為1ms,然后設(shè)置多個(gè)計(jì)數(shù)器變量:秒(兩位)、分(兩位)、時(shí)(兩位)……以此類推。
作者: npn    時(shí)間: 2021-11-22 08:54
無(wú)論是什么程序,至少開(kāi)啟一個(gè)定時(shí)器中斷(通常為1mS),如果沒(méi)有打開(kāi)就是新人寫的,按鍵消抖、流水燈、數(shù)碼管動(dòng)態(tài)掃描、延時(shí)任意毫秒什么,一心多用,全部交給定時(shí)器中斷實(shí)現(xiàn)。
軟件延時(shí)少用或不用,一般只有驅(qū)動(dòng)DS18B20、WS2812B等芯片才使用,其他代碼幾乎沒(méi)有,誤差不好計(jì)算且會(huì)被中斷打亂,如果大量使用就是亂成一鍋粥。
作者: hhdsdy    時(shí)間: 2021-11-22 09:16
所謂的軟件延時(shí),是利用它的循環(huán)、計(jì)數(shù)等特征完成的,因?yàn)樾枰烤帉懗绦騺?lái)達(dá)到目的,又需要有別于NE555、CD4060之類的方法,所以才有這種說(shuō)法的,而單片機(jī)本身是不具有直接延時(shí)的功能,就是定時(shí)器延時(shí)也是需要編寫程序的,所以單片機(jī)是不具有硬件延時(shí)功能的。
作者: 適得府君書(shū)    時(shí)間: 2021-11-22 09:25
解決閥值問(wèn)題。使用合適的進(jìn)制就行。比如說(shuō)定時(shí)器中斷為1ms,我可以設(shè)置100進(jìn)1,變量i滿100使j+1,這樣就可以,j=10為1秒,再設(shè)置一個(gè)變量y,J設(shè)置為60進(jìn)1。以此類推就可以。也不會(huì)導(dǎo)致變量溢出。
對(duì)于延時(shí)的使用,硬件延時(shí)和軟件延時(shí)沒(méi)有那個(gè)好那個(gè)不好的說(shuō)法,只要合不合適用的問(wèn)題。如果定時(shí)器多當(dāng)然使用硬件延時(shí),如果定時(shí)器少你用來(lái)做延時(shí)那你其他的就不夠用。軟件延時(shí)調(diào)試合適了也可以達(dá)到比較好的精準(zhǔn)度。
作者: liuzx66    時(shí)間: 2021-11-22 09:59
這個(gè)問(wèn)題不在于溢出,而是你定義的這個(gè)變量類型,如果是8位的就是最大255ms,如果程序在這個(gè)時(shí)間內(nèi)不能處理,那就會(huì)造成定時(shí)不準(zhǔn)。對(duì)于溢出,直接拋棄就好。另外,8位無(wú)符號(hào)數(shù)240+30=14,不是=15
作者: wodiaonimade111    時(shí)間: 2021-11-22 12:42
對(duì)于延時(shí)的使用,硬件延時(shí)和軟件延時(shí)沒(méi)有那個(gè)好那個(gè)不好的說(shuō)法,只要合不合適用的問(wèn)題。如果定時(shí)器多當(dāng)然使用硬件延時(shí),如果定時(shí)器少你用來(lái)做延時(shí)那你其他的就不夠用。軟件延時(shí)調(diào)試合適了也可以達(dá)到比較好的精準(zhǔn)度。
作者: 188610329    時(shí)間: 2021-11-22 13:27
先強(qiáng)調(diào)一個(gè)定義, 至少目前你在玩的單片機(jī), 是不存在硬件延時(shí)的。
在給你區(qū)分兩個(gè)概念, 延時(shí),和定時(shí)。
延時(shí): 啥也不干(表面上,其實(shí)干的很歡),等消磨一定時(shí)間后再繼續(xù)下一步。
定時(shí): 先干別的,等到時(shí)間了再干指定的事情。

延時(shí)的實(shí)現(xiàn): 通常有兩種方式,
一、通過(guò)延時(shí)函數(shù),進(jìn)行累加或者累減,達(dá)到消耗時(shí)間的目的,達(dá)成延時(shí)目的,常見(jiàn)用法有:delay(50); 等。
二、通過(guò)定時(shí)器延時(shí),利用判斷定時(shí)器標(biāo)志來(lái)達(dá)到消耗時(shí)間的目的,常見(jiàn)用法有: while(!TF0); 這里我們可以看到,在定時(shí)器延時(shí)的情況下,其實(shí)單片機(jī)也是在不停的判斷 TF0 的狀態(tài),繁忙程度和用延時(shí)函數(shù)沒(méi)有什么區(qū)別,無(wú)非是又搭上一個(gè)定時(shí)器而已。

定時(shí)的實(shí)現(xiàn): 通常也有兩種方式
一、通過(guò)定時(shí)器實(shí)現(xiàn), 通過(guò)定時(shí)器實(shí)現(xiàn)對(duì)精度要求比較高的,需要定期執(zhí)行的程序。通過(guò)這也分兩種。
1) 精度要求極高,這一類的,我們會(huì)直接在定時(shí)器中斷里面執(zhí)行,比如每10微秒讀取一次比較器的狀態(tài)位這種,
2) 精度要求不高,只是隔一段時(shí)間需要執(zhí)行一下,比如每0.5秒讀取一次RTC的時(shí)間,那么,我們通常在定時(shí)器中斷里面設(shè)置一個(gè)標(biāo)志為,比如: GetTime_Flag = 1;  然后主程序里面,通過(guò)判斷標(biāo)志位決定是否執(zhí)行, if(GetTime_Flag) {GetTime_Flag = 0; 其他執(zhí)行語(yǔ)句;  }

二,通過(guò)計(jì)數(shù)方式定期執(zhí)行對(duì)時(shí)間精度幾乎沒(méi)有要求的程序。
比如,在主程序中,有些項(xiàng)目是每次循環(huán)都要執(zhí)行的有些不是,還是拿時(shí)鐘舉例子吧,在主循環(huán)體內(nèi),平時(shí)通過(guò)RTC芯片,獲取時(shí)間。但是為了精度定期要聯(lián)網(wǎng)校對(duì)時(shí)間,這個(gè)定期,對(duì)時(shí)間要求不高,我們可以每循環(huán)65536次,執(zhí)行一次網(wǎng)絡(luò)對(duì)時(shí),那么一般會(huì)聲明一個(gè)u16的變量,Adjusttime_Count,然后這么在主函數(shù)中寫:
if(--Adjusttime_Count ==0) { 需要執(zhí)行的語(yǔ)句 }
這樣也就達(dá)到了,定期執(zhí)行的目的。

所以,認(rèn)清自己的目的,選擇合適的方式是最重要的。

最后再?gòu)?qiáng)調(diào)一下: 用定時(shí)器來(lái)“延時(shí)”是毫無(wú)意義的。僅僅增加了“功耗”。

作者: npn    時(shí)間: 2021-11-22 16:11
比如某游樂(lè)設(shè)施,一邊數(shù)碼管精準(zhǔn)計(jì)秒、流水燈的同時(shí)控制蜂鳴器放音樂(lè)和按鍵識(shí)別處理等,都離不開(kāi) 定時(shí)器中斷 。




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