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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:956872 發表于 2021-9-6 21:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用單片機定時器做延時工作的時候,是不是得獨立一個定時器出來專門用于中斷++計數啊,該計時器中斷里不能有其它要做得事,是不是還得用最高優先級得模式才能保證計時得精準?我在想要定時器用的優先級低得話,高優先級中斷在跑中斷里得程序時,定時器計數就沒辦法++了。是不是這樣子?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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毫秒,完全不會影響定時器。
回復

使用道具 舉報

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

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

使用道具 舉報

6#
ID:956872 發表于 2021-9-7 08:05 | 只看該作者
Y_G_G 發表于 2021-9-6 22:33
不用呀,人為的啟動定時器就可以了
void timer0() interrupt
{

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

10#
ID:401564 發表于 2021-9-7 11:45 | 只看該作者
PEB188 發表于 2021-9-7 08:05
我指的是定時器的優先級,如果這個定時器做延時,優先級是最低的,是不是就會被其他高優先級的中斷打斷, ...

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

使用道具 舉報

11#
ID:514901 發表于 2021-9-7 17:54 | 只看該作者
如果要定時器延時準確的話,配置定時器為高優先級確實是需要的,且盡量減少定時器中斷里面的代碼量
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美国一级片在线观看 | www.日韩系列 | 日韩欧美二区 | 欧美精品 在线观看 | 日韩欧美一区二区三区四区 | 日韩中文在线 | 精品久久久久一区二区国产 | 成人网av | 久久久涩| 中文字幕第一页在线 | 欧美日韩成人在线 | 热久久久| 色综合一区二区三区 | 午夜小电影| 视频在线一区二区 | 中文一级片 | 国产精品成人一区二区三区 | 亚洲一区日韩 | 色婷婷亚洲| 精品视频在线免费观看 | 久久男人 | 成人免费大片黄在线播放 | 日韩av一区二区在线观看 | 最新国产精品 | 国产在线一区二 | 亚洲视频一区在线观看 | 国产精品视频免费看 | 亚洲国产成人精品久久久国产成人一区 | 成人二区 | 午夜电影一区 | 国产成人免费一区二区60岁 | 欧美亚洲一级 | 国产高清视频在线观看 | h片在线免费看 | 日韩亚洲视频 | 日韩中文字幕视频 | 亚洲精选久久 | 黄色片亚洲 | 欧美日韩久久 | 中文在线www | 国产一级特黄视频 |