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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3089|回復: 15
打印 上一主題 下一主題
收起左側

一個關于單片機硬件延時的疑惑

  [復制鏈接]
跳轉到指定樓層
樓主
ID:518902 發表于 2021-11-21 21:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 laopihappy123 于 2021-11-22 20:21 編輯

關于單片機的定時,在我剛剛學習的時候,都是用軟件實現的.但在軟件進行延時的過程中,cpu時間被白白浪費了,此時能利用cpu的只有中斷.


隨著使用的深入,我越發覺得軟件定時這是不是個好方法,雖然它很簡單.

隨后我對硬件定時進行了了解,發現替代的方法有個用定時器來搞的:
在定時器中斷里設置一個標志位,每當定時器運行到設定的時間,就將該位置置位(定時短)或+1(定時時間較長),然后用外部程序去查詢這個標志位,做判斷.

但是我又有了個疑惑,對于后者,假如我要定時30毫秒,定時器溢出時間為1ms,標志位用8位無符號
那到了240的時候,240+30=14 ,溢出了~ 這個怎么處理?
難道我把最大閾值設定為225么? 那假如我有多個不同的延時需要進行處理呢?.... 沒辦法呀~ 難道要設置最大延時限制值么?...

讓人很是摸不著頭腦,求大家幫助一下我呀~

---------------分割線---------------
一天后更新,感謝大家的回復與指教,我看了感覺無地自容.....愧對壇齡,愧對老師....
大家的回復我都有好好看,我會好好學習的,謝謝大家
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:690448 發表于 2021-11-21 23:53 | 只看該作者
標志位可以隨時清零。
等到了30ms 執行操作后,順便清零標志位,



可以設置多個變量 例如 flag_300ms = 0;  上面每次到30ms 就加一;
然后大循環里面判斷flag_300ms ==9,執行操作,清零  flag_300ms
回復

使用道具 舉報

板凳
ID:161164 發表于 2021-11-22 01:30 | 只看該作者
標志位用完要清零
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
          }
}
回復

使用道具 舉報

地板
ID:276663 發表于 2021-11-22 01:36 | 只看該作者
看樣子,您還在單片機門檻上,沒有了解有時間片輪,RTX-Tiny系統
  1. unsigned short TimeMs;//全局變量 short 65536一般夠用了

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

  4. void TIM0_Int (void) interrupt 1
  5. {
  6.   if(TimeMs>0)//如果有延時
  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. }
復制代碼

回復

使用道具 舉報

5#
ID:276663 發表于 2021-11-22 01:44 | 只看該作者
還有
  1. unsigned short TimeMs;//全局變量 short 65536一般夠用了
  2. unsigned short Systick;//全局變量 short 65536一般夠用了

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

  5. void TIM0_Int (void) interrupt 1
  6. {
  7.   if(TimeMs>0)//如果有延時
  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. }
復制代碼
回復

使用道具 舉報

6#
ID:276663 發表于 2021-11-22 01:45 | 只看該作者
附上代碼

p.zip

647 Bytes, 下載次數: 6

回復

使用道具 舉報

7#
ID:883242 發表于 2021-11-22 02:49 | 只看該作者
沒有任何規定讓你必須要用8位標志,255不夠用換16位數據好了。
回復

使用道具 舉報

8#
ID:213173 發表于 2021-11-22 04:56 | 只看該作者
用軟件延時的時間長度是無限值,定時器溢出時間為1ms,定時30毫秒只要計數30。使用后清0,怎么會溢出?240+30的算法又從何談起?樓主提這個問題明顯與壇齡不符。
回復

使用道具 舉報

9#
ID:891686 發表于 2021-11-22 08:12 | 只看該作者
定時器溢出時間為1ms,另外用一個變量做(加法或減法)計數器。計數到 30 ms 時,計數大器復位并執行相應的操作。

多個定時的情形,最容易理解的是實時時鐘。定時器溢出時間為1ms,然后設置多個計數器變量:秒(兩位)、分(兩位)、時(兩位)……以此類推。
回復

使用道具 舉報

10#
ID:57657 發表于 2021-11-22 08:54 | 只看該作者
無論是什么程序,至少開啟一個定時器中斷(通常為1mS),如果沒有打開就是新人寫的,按鍵消抖、流水燈、數碼管動態掃描、延時任意毫秒什么,一心多用,全部交給定時器中斷實現。
軟件延時少用或不用,一般只有驅動DS18B20、WS2812B等芯片才使用,其他代碼幾乎沒有,誤差不好計算且會被中斷打亂,如果大量使用就是亂成一鍋粥。

評分

參與人數 1黑幣 +7 收起 理由
laopihappy123 + 7 回帖助人

查看全部評分

回復

使用道具 舉報

11#
ID:88256 發表于 2021-11-22 09:16 | 只看該作者
所謂的軟件延時,是利用它的循環、計數等特征完成的,因為需要靠編寫程序來達到目的,又需要有別于NE555、CD4060之類的方法,所以才有這種說法的,而單片機本身是不具有直接延時的功能,就是定時器延時也是需要編寫程序的,所以單片機是不具有硬件延時功能的。
回復

使用道具 舉報

12#
ID:367934 發表于 2021-11-22 09:25 | 只看該作者
解決閥值問題。使用合適的進制就行。比如說定時器中斷為1ms,我可以設置100進1,變量i滿100使j+1,這樣就可以,j=10為1秒,再設置一個變量y,J設置為60進1。以此類推就可以。也不會導致變量溢出。
對于延時的使用,硬件延時和軟件延時沒有那個好那個不好的說法,只要合不合適用的問題。如果定時器多當然使用硬件延時,如果定時器少你用來做延時那你其他的就不夠用。軟件延時調試合適了也可以達到比較好的精準度。
回復

使用道具 舉報

13#
ID:160500 發表于 2021-11-22 09:59 | 只看該作者
這個問題不在于溢出,而是你定義的這個變量類型,如果是8位的就是最大255ms,如果程序在這個時間內不能處理,那就會造成定時不準。對于溢出,直接拋棄就好。另外,8位無符號數240+30=14,不是=15
回復

使用道具 舉報

14#
ID:983385 發表于 2021-11-22 12:42 | 只看該作者
對于延時的使用,硬件延時和軟件延時沒有那個好那個不好的說法,只要合不合適用的問題。如果定時器多當然使用硬件延時,如果定時器少你用來做延時那你其他的就不夠用。軟件延時調試合適了也可以達到比較好的精準度。
回復

使用道具 舉報

15#
ID:624769 發表于 2021-11-22 13:27 | 只看該作者
先強調一個定義, 至少目前你在玩的單片機, 是不存在硬件延時的。
在給你區分兩個概念, 延時,和定時。
延時: 啥也不干(表面上,其實干的很歡),等消磨一定時間后再繼續下一步。
定時: 先干別的,等到時間了再干指定的事情。

延時的實現: 通常有兩種方式,
一、通過延時函數,進行累加或者累減,達到消耗時間的目的,達成延時目的,常見用法有:delay(50); 等。
二、通過定時器延時,利用判斷定時器標志來達到消耗時間的目的,常見用法有: while(!TF0); 這里我們可以看到,在定時器延時的情況下,其實單片機也是在不停的判斷 TF0 的狀態,繁忙程度和用延時函數沒有什么區別,無非是又搭上一個定時器而已。

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

二,通過計數方式定期執行對時間精度幾乎沒有要求的程序。
比如,在主程序中,有些項目是每次循環都要執行的有些不是,還是拿時鐘舉例子吧,在主循環體內,平時通過RTC芯片,獲取時間。但是為了精度定期要聯網校對時間,這個定期,對時間要求不高,我們可以每循環65536次,執行一次網絡對時,那么一般會聲明一個u16的變量,Adjusttime_Count,然后這么在主函數中寫:
if(--Adjusttime_Count ==0) { 需要執行的語句 }
這樣也就達到了,定期執行的目的。

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

最后再強調一下: 用定時器來“延時”是毫無意義的。僅僅增加了“功耗”。

評分

參與人數 1黑幣 +9 收起 理由
laopihappy123 + 9 樂于助人,謝謝啦

查看全部評分

回復

使用道具 舉報

16#
ID:57657 發表于 2021-11-22 16:11 | 只看該作者
比如某游樂設施,一邊數碼管精準計秒、流水燈的同時控制蜂鳴器放音樂和按鍵識別處理等,都離不開 定時器中斷 。
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.日日夜夜 | 大象视频一区二区 | av在线播放一区二区 | 国产精品九九九 | 日本视频在线播放 | 久久精品99国产精品 | av免费看在线 | 亚洲天堂影院 | 欧美日批 | 色噜噜色综合 | 欧美成人精品一区二区男人看 | 国产第一页在线观看 | 成人在线视频网址 | 91久久久久久久久久久 | 欧美日本韩国一区二区 | 国产精品永久免费视频 | 中文区中文字幕免费看 | 一级黄色录像毛片 | 亚洲成人一级片 | 成人乱人乱一区二区三区软件 | 婷婷在线视频 | 一区二区免费在线 | 国产精品久久av | 中文字幕亚洲一区 | h在线免费观看 | 色婷婷激情综合 | 综合网伊人 | av网站免费观看 | 91精品国产综合久久精品 | 日韩午夜电影在线观看 | 国产亚洲成av人在线观看导航 | 国产一区二区三区色淫影院 | 亚洲精品三级 | 久久日韩精品 | 亚洲二区在线 | 亚洲一区久久 | 久久精品国产一区二区电影 | 国产午夜精品福利 | 91在线观看视频 | 欧美激情黄色 | 国产特一级黄色片 |