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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91网站在线看 | av在线播放网 | 777777777亚洲妇女 | www.日韩| aaa大片免费观看 | 日本视频在线 | 91在线免费视频 | 99久久精品免费 | 国产二区av | 欧美日韩一区在线播放 | 亚洲h色 | 日本在线看片 | 欧美一区二区三区在线 | 在线精品亚洲欧美日韩国产 | 亚洲精品自在在线观看 | 久久久久久综合 | 亚洲精品乱码久久久久久久久久 | 欧美日韩在线综合 | 国产精品久久久久久久久久东京 | 亚洲欧美视频一区二区 | 久久中文字幕av | 波多野结衣亚洲 | 黄色一级特级片 | 日韩综合| 日韩精品一区二区三区中文在线 | 91黄在线观看 | 狠狠干网站 | 亚洲欧美国产精品久久 | 色婷婷综合久久久中字幕精品久久 | 免费黄色大片 | 日韩一区二区三区视频在线播放 | 999视频在线播放 | 四色成人av永久网址 | 国产精品中文字幕在线 | 91激情电影 | 国产欧美日韩一区 | 久久久久久国模大尺度人体 | 日本一区二区高清不卡 | 欧美色性| 超碰97人人人人人蜜桃 | 亚洲高清一区二区三区 |