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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2843|回復: 10
收起左側

單片機定時器用作延時的問題

[復制鏈接]
ID:956872 發表于 2021-9-6 21:56 | 顯示全部樓層 |閱讀模式
用單片機定時器做延時工作的時候,是不是得獨立一個定時器出來專門用于中斷++計數啊,該計時器中斷里不能有其它要做得事,是不是還得用最高優先級得模式才能保證計時得精準?我在想要定時器用的優先級低得話,高優先級中斷在跑中斷里得程序時,定時器計數就沒辦法++了。是不是這樣子?
回復

使用道具 舉報

ID:401564 發表于 2021-9-6 22:33 | 顯示全部樓層
不用呀,人為的啟動定時器就可以了
void timer0() interrupt
{
        Time++;    //Time為全局變量,使用Time的時候先歸零
        TH0=(65535-1000)/256; //
        TL0=(65535-1000)%256; //
        TR0=1;

其它要語句;
;
;
;
}
回復

使用道具 舉報

ID:451718 發表于 2021-9-6 22:46 | 顯示全部樓層
思路是對的,理解有問題。你這個問題很難幾句話說清楚, 因為,不同品牌的單片機,定時器中斷的機制都有差別。 把握一個原則, 周期短的中斷,優先級靠前,資源占用盡量少。  如:定時器0做1毫秒周期的中斷,優先級設為最高。 里面只放一個操作systick++,最多再放一個 if(systick%1000==0)sec++
回復

使用道具 舉報

ID:624769 發表于 2021-9-6 23:10 | 顯示全部樓層
用單片機定時器做延時工作的時候,
=> 定時器是用來計時的,不要用來做延時, 類似 While(!TF0); 這樣的操作,還不如Delay 函數,因為定時器也是靠的內部時鐘,你延時函數也是內部時鐘,精準度上其實一樣的。而你用While(!TF0); 這樣的操作的話,其實和延時函數卡死單片機性質是一樣的,還多占用一個定時器。

是不是得獨立一個定時器出來專門用于中斷++計數啊,該計時器中斷里不能有其它要做得事,是不是還得用最高優先級得模式才能保證計時得精準?
=> 定時器,只要是自動重載,不管你定時器里面做多少事,都能保證精準。如果不是自動重載,只要進入中斷后,先重置TH0,TL0, 再做其它事情,也能確保精準。

我在想要定時器用的優先級低得話,高優先級中斷在跑中斷里得程序時,定時器計數就沒辦法++了。是不是這樣子?
=> 定時器計數的話,如果你的定時器有自動重載功能的話,完全不需要高優先級,你會反復計數,說明定時器定個幾毫秒完全不夠你用,所以,只需要最低優先級,等時間到了,定時器會置位TF0,并且開始新的一輪計時,等到你那邊空下來,就會跳到中斷里,繼續+1,只要你其它中斷,卡的時間不會超過定時器新的一次溢出,就沒有任何影響。就好像我需要定時器每31.25毫秒中斷計數一次, 32 次1秒。1920次一分鐘的計數,就是用的最低中斷,其他中斷執行最多0.02毫秒,完全不會影響定時器。
回復

使用道具 舉報

ID:956872 發表于 2021-9-7 08:01 | 顯示全部樓層
188610329 發表于 2021-9-6 23:10
用單片機定時器做延時工作的時候,
=> 定時器是用來計時的,不要用來做延時, 類似 While(!TF0); 這樣的操作 ...

定時器里的程序不能超過一次溢出時間,應該就是我理解的 更高級中斷里跑程序太長的話會影響低級定時器進中斷了(前提是低優先級的定時器的溢出中斷時間比高優先級里的程序時間短),造成定時計數不準的問題了。還有就是有多個中斷,定時器的優先級太低的話應該也有問題。
回復

使用道具 舉報

ID:956872 發表于 2021-9-7 08:05 | 顯示全部樓層
Y_G_G 發表于 2021-9-6 22:33
不用呀,人為的啟動定時器就可以了
void timer0() interrupt
{

我指的是定時器的優先級,如果這個定時器做延時,優先級是最低的,是不是就會被其他高優先級的中斷打斷,即便這定時器時間溢出了,還得等其他高優先級中斷里的程序跑完才輪到這個定時器進中斷,這樣是不是就造成了計數不準的問題
回復

使用道具 舉報

ID:956872 發表于 2021-9-7 08:08 | 顯示全部樓層
robinsonlin 發表于 2021-9-6 22:46
思路是對的,理解有問題。你這個問題很難幾句話說清楚, 因為,不同品牌的單片機,定時器中斷的機制都有差 ...

剛接觸51單片機,也不知道其它單片機的差別。但我對這51單片機的運行時序理解,用定時器做低延時要保證延時每次時間都一致的話,就不能讓其時間溢出進中斷的時候被其它中斷打斷
回復

使用道具 舉報

ID:451718 發表于 2021-9-7 11:07 | 顯示全部樓層
PEB188 發表于 2021-9-7 08:08
剛接觸51單片機,也不知道其它單片機的差別。但我對這51單片機的運行時序理解,用定時器做低延時要保證延 ...

我曾經專門做過51的定時器實驗,結果很有意思。  思路在這里,你不妨自己嘗試一下, 或許會有所感悟。http://m.raoushi.com/bbs/dpj-207735-1.html
回復

使用道具 舉報

ID:451718 發表于 2021-9-7 11:14 | 顯示全部樓層
188610329 發表于 2021-9-6 23:10
用單片機定時器做延時工作的時候,
=> 定時器是用來計時的,不要用來做延時, 類似 While(!TF0); 這樣的操作 ...

用定時器做延遲是一個非常好的思路,但不是你所理解的while(!TF0) 。 一個流暢的程序結構,應盡量慎用delay函數。
回復

使用道具 舉報

ID:401564 發表于 2021-9-7 11:45 | 顯示全部樓層
PEB188 發表于 2021-9-7 08:05
我指的是定時器的優先級,如果這個定時器做延時,優先級是最低的,是不是就會被其他高優先級的中斷打斷, ...

在定時器中斷中進行Time++
通過判斷Time的大小來檢測延時時間到了沒有,到了就執行,不到就跳過,而不是等待
至于中斷優先等級什么的,不需要考慮
在所有的中斷中不要有長時間的延時,不要在中斷中有等待while()之類的,在中斷中進行一些簡單的操作就可以,比如++,或者置位標志位之類,長時間的操作在中斷以外進行
你所擔心時間不準確,其實是不用管的,幾十條指令也就幾十uS的執行時間,對于一般mS級延時是沒有什么影響的
如果你想精確到幾個時鐘的延時,用C是真的很難的
一般來說,1mS或者以上的延時,用定時器來做的話,你只要不在其它中斷中有延時,等待之類的,基本是不用考慮被高等級中斷打斷的
回復

使用道具 舉報

ID:514901 發表于 2021-9-7 17:54 | 顯示全部樓層
如果要定時器延時準確的話,配置定時器為高優先級確實是需要的,且盡量減少定時器中斷里面的代碼量
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表