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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

一個(gè)關(guān)于單片機(jī)硬件延時(shí)的疑惑

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:518902 發(fā)表于 2021-11-21 21:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 laopihappy123 于 2021-11-22 20:21 編輯

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


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

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

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

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

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

使用道具 舉報(bào)

沙發(fā)
ID:690448 發(fā)表于 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
回復(fù)

使用道具 舉報(bào)

板凳
ID:161164 發(fā)表于 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
          }
}
回復(fù)

使用道具 舉報(bào)

地板
ID:276663 發(fā)表于 2021-11-22 01:36 | 只看該作者
看樣子,您還在單片機(jī)門檻上,沒有了解有時(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ù)制代碼

回復(fù)

使用道具 舉報(bào)

5#
ID:276663 發(fā)表于 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ù)制代碼
回復(fù)

使用道具 舉報(bào)

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

p.zip

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

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

9#
ID:891686 發(fā)表于 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í)(兩位)……以此類推。
回復(fù)

使用道具 舉報(bào)

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

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

11#
ID:88256 發(fā)表于 2021-11-22 09:16 | 只看該作者
所謂的軟件延時(shí),是利用它的循環(huán)、計(jì)數(shù)等特征完成的,因?yàn)樾枰烤帉懗绦騺磉_(dá)到目的,又需要有別于NE555、CD4060之類的方法,所以才有這種說法的,而單片機(jī)本身是不具有直接延時(shí)的功能,就是定時(shí)器延時(shí)也是需要編寫程序的,所以單片機(jī)是不具有硬件延時(shí)功能的。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

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

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

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

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线一区二区三区 | 国产小视频在线观看 | 亚洲国产成人精品久久 | 久久国产区 | 国产精品久久九九 | 亚洲精品久久久久久久久久吃药 | 亚洲国产日本 | 免费看爱爱视频 | 欧美久久一区二区 | 黄色一级电影在线观看 | 亚洲视频一区二区三区 | 伊人久久麻豆 | 欧美成年网站 | 久草视频2 | 国产精品日韩欧美一区二区三区 | 欧美性极品xxxx做受 | 亚洲精品一二三区 | 亚洲视频不卡 | 国产精品高潮呻吟久久 | 国产精品免费一区二区三区四区 | 97久久精品午夜一区二区 | 天天射网站 | 欧美在线 | 中文成人在线 | 亚洲激情一区二区三区 | 日韩在线免费视频 | 国产综合久久久久久鬼色 | 日本不卡一区二区三区在线观看 | 一区二区三区高清 | 精品无码三级在线观看视频 | 欧美久久视频 | 国产精品大全 | 欧美成人激情 | 亚洲午夜精品 | 九九导航 | 日韩成人中文字幕 | 在线观看免费黄色片 | 激情欧美日韩一区二区 | 99资源| 欧洲高清转码区一二区 | 激情久久av一区av二区av三区 |