標題: 關于51單片機的定時器T0、T1總結 [打印本頁]
作者: a1075511750 時間: 2017-12-26 23:13
標題: 關于51單片機的定時器T0、T1總結
這是我總結的51單片機的中斷定時器原理,之后會附上附件。第一次發帖,不足之處請多多包含!
我總結的文稿畫面很花,所以給上個參考,各位不習慣的話,請酌情選擇。
定時器.jpg (25.83 KB, 下載次數: 347)
下載附件
2017-12-26 22:53 上傳
參考.jpg (75.2 KB, 下載次數: 235)
下載附件
2017-12-26 23:12 上傳
目錄
一、原理:
1、對中斷和定時器進行初始化:
①定時器/計數器工作方式寄存器
②設定初值
③開啟中斷和定時器
2、設置中斷服務程序:
3、主函數:
二、各個定時器和工作方式:
方式0:
方式2:
方式3:
借鑒:郭天祥《新概念51單片機C語言教程》
一、原理:51單片機,擁有兩個定時器,用來中斷計數,分別是T0和T1。而52單片機和51單片機的定時器是一樣的,只是52比51多了一個定時器/計數器T2,它們的設置都大同小異,下面我來總結各個定時器的用法。
定時器T0與T1不同之處在于它們的工作方式3不同,方式0、1、2相同。
| | |
| | |
| | |
| | |
| | 方式3,僅適用于T0,分成兩個8位計數器, 當設置成T1時停止計數 |
首先我們看要使用定時器T0應該設置的東西:
1、對中斷寄存器和定時器進行初始化:初始化函數里的內容也可以寫在頭文件里,但是為了美觀和好查閱,就把它單獨寫出來,后面在頭文件里直接調用就行。那么應該要進行初始化的設置:
①設置定時器的工作方式單片機內,有其中一個特殊寄存器叫TMOD,這是用來設置定時器工作方式的寄存器,通過軟件,將其寄存器內的D0~D7位置0或1,從而達成對定時器的操作。
寄存器TMOD
| | |
| | | | | | | | |
| | C/  | | | | C/  | | |
如表格,這是定時器的工作方式寄存器TMOD,要更改定時器的工作方式,我們只用到M1、M2所以其他位一般置0,又因為我們使用的是T0的定時器,所以就有:
控制M1、M0將它們置1或0,即可達成操作控制方式的目的,然后轉換成16進制即方便查閱。
同理,使用定時器1時也是這么設置。注意,有時候也有使用兩個定時器T0、T1的時候,那么就是0001 0001兩個都是工作方式1。請大家舉一反三。
②設定初值先說說總值:
以方式1為例(之后會介紹其他方式):
方式1為16位的定時器/計數器,對定時器T0來說是分成兩個寄存器(可以形象地比作容器吧,網上有比我更形象的比喻,我就不多寫了,請自行查閱):TH0為高八位,TL0為低八位,組成了16位的定時器,當低位TL0計滿就向高位TH0移一個數,然后清零。
以12Mhz的晶振來說,機器周期是1us,計滿TH0、TL0就需要216-1個數,再來一個數就“溢出”產生中斷,一次溢出也就是65536us,約等于65.5ms,如果要定時50ms的話就要給他們裝一個預裝值(初值),總值-需要值=預裝值,
也就是65536-50000=15536,預裝后,定時器從預裝值開始加值,定時器溢出中斷后,會重新從預裝值開始加值加到50ms就再產生中斷,從而達到了定時的目的。如果要定時1s就可以讓定時器中斷1000ms/50ms=20次。
另外一點,TH0和TL0中應該裝入的總數是15536,然后把15536對256求模:15536/256=60裝入TH0中,把15536對256求余:15536%256=176裝入TL0中,因為這是兩個八位28*28的容器。
所以就有了
TH0=(65535-50000)/256
TL0=(65535-50000)%256
③開啟中斷和定時器關于中斷,需要用到中斷允許寄存器:
IE
定時器中斷需要的是:
總中斷EA:用來開啟全局中斷。
ET0、1、2:各個定時器中斷位。
使用中斷位只用將其置1就行,例如EA=1;ET0=1;
打開了中斷開關只是完成了一半,還需要定時器控制寄存器:
TCON
使用方法也是和中斷寄存器一樣,
定時器0運行控制位TR0:用來開啟定時器0.
把TR0置1,TR0=1;就開啟了定時器。
2、設置中斷服務程序:中斷服務程序:就是當計滿TH0、TL0時溢出申請中斷,然后單片機允許中斷時,所要發生的事情。允許后就自動跳轉到中斷服務程序,并執行。
在服務程序中,如果不裝入初值,那定時器中斷服務完成后,就會從0開始重新計時,所以要在中斷程序中重新計算并裝入初值。
然后給一個變量(變量的意義為中斷次數),變量+1,當中斷次數達到20次的時候(50ms*20次=1000ms=1s),次數清零,并且讓產生指令(例如讓二極管亮呀,讓I/O口發生什么事呀)。
3、主函數:由于有了初始化函數,所以直接調用即可(不然主函數很混亂)。
While(1);這段是為了等待函數發生,挺含糊的。
另外:一般中斷服務程序中不要寫過多的處理語句,否則程序會來不及執行代碼,下一次中斷又來襲,結果程序久而久之就亂套了。
所以while處可以改成:把if處理語句寫到while處。
附上完整程序:
二、各個定時器和工作方式:先來看看工作方式:
|
|
|
|
方式3,僅適用于T0,分成兩個8位計數器, 當設置成T1時停止計數 |
工作方式有四種:0、1、2、3。我們之前已經學習了方式1的工作方式,那么接下來就先來看看其他的工作方式:
方式0:方式0,的用法和方式1的用法一樣,但是值得注意的是:
方式0是13位的定時器,它的低位TL0是五位的,所以它的總值是28*25=8192。它能裝的值也不能那么多了,于是就裝入5ms:
TH0(8192-5000)/32;
TL0(8192-5000)%32;
32是5位寄存器的容量。
所以要中斷200次才能達到1s。
這個方式0可以用來做短時間中斷。
方式2:方式0和方式1,當計數溢出后,計數器變為0,所以要反復重新裝填初值,這會影響定時精度。但是方式2可以解決這個問題。
如圖,其中低位TL0是8位定時器,而TH0是常數緩沖器,當低位TL0溢出時,在溢出標志位TF0置1的同時,自動將高位TH0的常數重新裝入TL0中,讓TL0從初值開始重新計數,這樣就不用人為軟件重新裝入初值帶來的誤差,從而提高精度。
由于兩個是分開的,所以計算初值可以不用求余取模:
TL0=總值-要計數的個數;
TH0=總值-要計數的個數;
以11.0592MHz為晶振,那么機械周期為12x(1/11059200)≈1.085us,以計時1s為例,當要計250個數時耗時1.0851x250=271.275us,再來算計時1s要用多少次,即1000000/271.275≈3686次。
那么就是:
TL0=256-250=6;
TH0=256=250=6;
由于方式2是自動裝填,已經不用人為裝填了,所以:
中斷服務程序中只有一句num++
整個過程就是:
方式3:接下來介紹方式3,方式3不同于其他三個方式,它只能用于T0,也就是定時器0,和方式2差不多,也是把TL0、TH0分成兩個獨立的寄存器,但是TH0也參與計數,也就是兩個獨立的8位定時器/計數器。
普通的使用一樣,TL0計數溢出后置位TF0,并申請中斷,之后重裝。但是由于TL0占用了TR0和TF0,所以TH0只能占用定時器 T1的TR1和TF1。所以定時器T1一定不要用在有中斷的場合,當然,T1同樣可以正常工作在方式0、1、2下。通常這種情況,T1都被用來當做串行口的波特率發生器。
首先把T0、T1的中斷位和控制位打開:
然后分別給低位TL0和高位TH0設置中斷服務程序:
可以注意到interrupt后面的數值,這個是編譯器識別不同中斷的唯一符號:
52單片機的中斷級別
然后到主函數:
調用init();
可以看到if語句里面的符號是>=,為什么呢?因為當if語句的值到了時,主程序停止下來判斷num1==3686是否為真,當它還在判斷的時候,num2是還在走的,于是當主程序判斷好num1的時候再去判斷num2,為時已晚,num2這時可能已經是1844或者1845或者更高的數了,所以要變成>=。
完整的Word格式文檔51黑下載地址:
51定時器.docx
(148.84 KB, 下載次數: 669)
2017-12-26 23:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: 天使之淚雨揚 時間: 2017-12-27 11:09
這么好的帖子,都沒有人頂?樓主寫的非常不錯,分享精神值得學習!
作者: ffhhxx 時間: 2018-2-24 11:23
守著這個貼子研究了3個小時,終于搞懂了,看郭天祥視頻時要停下來研究一下這里再看視頻就順了,有部分重了,也有個別錯字,但絕對是好貼子
作者: endura82 時間: 2018-3-12 19:35
好貼子。我準備將51單片機兩個功能合并到一起,正遇到怎么合理用T0和T1。原來兩個功能的程序都用到TH0, TL0和TH1,TL1。不知道合并之后怎么實現,看起來T0和T1被重復利用了。
樓主大人能否幫忙解答一下?謝謝啦!
作者: JOESENTION 時間: 2018-3-15 23:53
贊一個,這個很有用,在單片機定時器上的邏輯很清晰,真是我需要的
作者: 564 時間: 2018-5-12 11:55
我也遇到了,你怎么解決的,大佬
作者: 847257243 時間: 2018-5-15 19:13
非常感謝樓主的分享 正在學這方面的知識!
作者: j2510666 時間: 2018-6-27 10:59
這么好的帖子,都沒有人頂?樓主寫的非常不錯,分享精神值得學習!
作者: wdliming 時間: 2018-8-4 17:00
郭天祥的資料上差不多啊~~~
作者: fpy135228 時間: 2018-8-21 08:35
好帖子,真的很不錯,值得分享
作者: lumingfei 時間: 2018-9-23 11:37
謝謝,正在努力學習
作者: 飛線 時間: 2018-9-27 09:04
總結的很到位,很有收益
作者: 一片到 時間: 2018-9-28 11:54
這個講得仔細,值得學習啊。
作者: stkh 時間: 2018-9-28 17:07
很有用,網頁保存了
作者: AIYLE520 時間: 2018-10-2 07:18
真是好帖子,新手專用,非常詳細!感謝樓主
作者: styleone 時間: 2018-11-28 17:32
實驗內容:正常情況下8個小燈按狀態點亮,時間間隔為1S。當按下控制按鈕后,低四位亮高四位滅,間隔為0.5S后,低四位滅高四位亮。
樓主,想請教你一個問題,對于這個要求,我想用T0定時器給流水燈計時,然后T1定時器用來給外部中斷那個0.5秒閃爍計時,我的外部中斷服務程序應該怎么寫?從流水燈轉化到中斷服務函數時是不是應該把流水燈初始化一遍?
希望樓主能指點一下
作者: 暗色貍 時間: 2018-12-10 23:02
正準備學習了解定時器相關知識
作者: QAZ1235888 時間: 2019-3-1 14:12
是真的真的很不錯,一定得鼓勵啊。
作者: qweo23 時間: 2019-3-20 11:46
51單片機定時器最全的資料
作者: sis620 時間: 2019-4-1 10:21
總結很到位的文章,贊
作者: assor 時間: 2019-4-3 15:45
厲害,總結的不錯
作者: 快樂眼淚 時間: 2019-4-3 20:19
正在努力學習中!好帖,收藏了
作者: lyw98 時間: 2019-4-18 19:58
帥,詳細易懂
作者: qinqin225599 時間: 2019-4-24 11:09
寫的是真的真的很不錯,值得得鼓勵。菜鳥正需要.
作者: huihui9925 時間: 2019-4-24 11:46
看了一會28*28沒搞懂,后面終于看懂了是2的8次方.
作者: q1065406715 時間: 2019-4-25 21:14
謝謝,正在努力學習
作者: univers 時間: 2019-4-26 06:26
郭老師的入門寶典
作者: 166864646883 時間: 2019-4-26 09:13
樓主有個小錯誤,在工作方式1的時候,因為是16位定時器,所以是低八位和高八位組成的,不應該是216-1,而是256-1
作者: uiop5 時間: 2019-4-26 10:50
下學習謝謝謝謝謝謝
作者: keyison 時間: 2019-5-25 21:19
寫的很好,收益很多
作者: xiaohaoshifu 時間: 2019-6-4 07:58
寫的很詳細。我正遇到怎么用T0和T1的使用問題。原來兩個功能的程序都用到TH0, TL0和TH1,TL1。不知道合并之后怎么實現,看起來T0和T1被重復利用了。
作者: 江西奉新 時間: 2019-6-7 09:26
現在正在學定時器
作者: hahatomato 時間: 2019-6-26 14:03
守著這個貼子研究了3個小時,終于搞懂了,看郭天祥視頻時要停下來研究一下這里再看視頻就順了,有部分重了,也有個別錯字,但絕對是好貼子
作者: 321331 時間: 2019-7-3 14:12
寫的很好,很詳細,贊
作者: 767103079 時間: 2019-7-25 11:29
剛接觸單片機3天,學到中斷這個知識點,感謝樓主分享的資料,讓新手能更懂定時器的各種工作方式
作者: 192141477 時間: 2019-8-17 11:57
之前一直沒理解,看了博主的帖子算是懂了定時器和中斷的原理。贊
作者: jndy 時間: 2019-10-17 22:48
非常好
作者: zbxiaowu 時間: 2019-10-18 21:50
謝謝,感謝分享
作者: zhangjianhu 時間: 2019-10-19 13:13
非常棒的定時器教程,反復開了好幾遍,一定要搞懂。
作者: wdliming 時間: 2019-11-14 12:40
很基礎~~
作者: 破音小跳蛙 時間: 2019-11-17 11:35
可以寫的簡單易懂
作者: hnnnj 時間: 2019-11-17 13:06
謝謝分享
作者: 荔枝陛下 時間: 2019-12-12 13:24
用方式1的時候 為什么TMOD=0x00啊 不應該是TMOD=0x01嗎
作者: 2983186218 時間: 2019-12-12 15:47
挺好的 初學很有用
作者: lindeijun1 時間: 2020-1-3 23:46
謝謝樓主分享!!!
作者: jovew 時間: 2020-1-5 09:57
總算是明白計時器 中斷的使用了,,
作者: kevintang 時間: 2020-2-2 22:42
不錯,是好貼子,謝謝分享。
作者: w1179benp 時間: 2020-3-13 19:09
挺好的 初學很有用
作者: 布吉島, 時間: 2020-3-14 08:09
謝謝樓主分享
作者: hbcqd 時間: 2020-3-14 16:42
看了這個之后,再看郭天祥的視頻就容易理解了,謝謝分享!
作者: ljj3166 時間: 2020-4-4 19:10
總結的很到位,很有收益
作者: Aureliano245 時間: 2020-4-4 20:34
樓主寫的不錯
作者: laputa1314 時間: 2020-4-14 14:06
哈哈,你以為寫的詳細我就能看懂了嗎?太天真了
作者: Crazy· 時間: 2020-4-14 17:19
看完你的帖子我舒服了兄弟
作者: pxh316 時間: 2020-4-25 16:39
謝謝樓上兄弟分享!
作者: 大華 時間: 2020-5-28 15:37
最近學習中斷和定時器,非常有幫助!
作者: xiaobaiyg 時間: 2020-8-4 15:40
該怎么表達我的感謝之情呢?一切盡在不言中!真心感謝!
作者: 大黃狗子246 時間: 2020-8-4 19:46
我覺得可以用中斷來實現時間間隔為一秒,用左移子程序實現流水效果
作者: ddsone 時間: 2020-8-5 18:59
超級詳細,贊一個,研究了半天搞好了定時器流水燈才看到這個
作者: 好奇先生1234 時間: 2020-8-6 16:10
溫故而知新(^o^)
作者: 肥仔喲 時間: 2020-8-11 01:08
真好,總算知道定時器怎么工作的了,卡這里好多天了
作者: 阡_陌 時間: 2020-8-12 12:03
樓主寫的條理清晰,總結的很好,很有用
作者: tangde8 時間: 2020-8-13 22:53
太好了,樓主的教程通俗易懂,看書一直都迷迷糊糊看不懂,不知道說的什么,你這個很詳細
作者: mirror. 時間: 2020-8-14 09:51
這么好的帖子,都沒有人頂?樓主寫的非常不錯,分享精神值得學習!
作者: xujuanliang 時間: 2021-3-15 16:23
非常感謝 寫的非常好
作者: 星空幻秋 時間: 2021-5-18 12:21
總結的很好
作者: caifei9280 時間: 2021-6-7 22:26
很優質的文章,我研究了2小時,樓主,還有更驕傲的嗎
作者: Dekia 時間: 2021-6-22 14:54
這兩天設計 正學這單片機 中斷 呢 弄了個按鍵計數 謝謝樓主
作者: blueskynj 時間: 2021-7-7 10:07
28*28建議改成2^8 * 2^8乘方的寫法,不然人看了不知道是什么意思,不知道這個28數字從何而來。
作者: lsg0280 時間: 2021-7-7 17:34
這篇文章非常好,讓正在學習定時器的我有所體會,謝謝。
作者: gain 時間: 2021-7-7 20:35
564 發表于 2018-5-12 11:55
我也遇到了,你怎么解決的,大佬
合理分配定時器T0和T1的優先級就可以了
作者: gain 時間: 2021-7-7 20:37
styleone 發表于 2018-11-28 17:32
實驗內容:正常情況下8個小燈按狀態點亮,時間間隔為1S。當按下控制按鈕后,低四位亮高四位滅,間隔為0.5S ...
只需要設置T1的中斷優先級高于T0即可
作者: 不能再吃了 時間: 2021-9-10 22:09
牛啊,這幾天學這個中斷程序,都看暈了,感覺很混亂都搞混了,不知道哪個是哪個,看了這篇帖子猶如醍醐灌頂
作者: herui2128 時間: 2021-9-13 17:24
3個定時器用過。但是T1當波特率發生器,T0當定時器就會出現問題,不知道是那個地方沒搞起。
作者: pq1972 時間: 2021-9-13 19:00
重點也是難點,謝謝學習
作者: hhwsljb 時間: 2021-10-19 15:27
這篇文字對定時器真是講得透徹
作者: rp_0825 時間: 2021-10-22 23:46
優秀的發帖者,總結的也很實用,非常感謝
作者: szkalwa 時間: 2021-10-23 16:49
定時中斷是難點,好多人卡在這里學不下去,感謝樓主這么詳細的解說,謝謝分享!
作者: dyx811 時間: 2021-10-23 22:33
終于搞懂定時器了。謝謝分享!
作者: 朱明輝 時間: 2021-10-24 10:19
51單片機還有個定時器2,再給講一講3個定時器同時中斷工作就更好了
作者: 豬八戒2179 時間: 2021-12-23 19:04
多謝---------------!
初學者。
作者: lsg0280 時間: 2021-12-24 17:14
仔細看完了,又復習了一次定時器的使用。謝謝。
作者: HAPPY3 時間: 2021-12-29 16:29
看了,有點明白,不明白的多看吧
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
蜜桃视频一区
|
中文字幕偷拍
|
97av在线视频
|
久久精品视频免费看
|
久久久九九
|
国产日本在线
|
一级做a视频
|
狠狠干综合|
成人在线一区二区
|
天天色天天干天天
|
久久性视频|
日本在线观看
|
亚洲天堂一区二区
|
成人精品影院
|
亚洲黄色三级
|
欧美在线日韩
|
国产精品一区二区三区四区五区
|
www.日韩
|
小日子的在线观看免费第8集
|
亚欧洲精品在线视频免费观看
|
欧美激情自拍
|
亚洲一区久久
|
91午夜精品亚洲一区二区三区
|
51成人做爰www免费看网站
|
精品欧美一区二区三区久久久
|
91久久久久国产一区二区
|
精品一区二区三区在线观看
|
99精品网站
|
日韩精品在线观看视频
|
欧美日韩视频
|
国产成人三级一区二区在线观看一
|
欧美一区二区三区的
|
久久精品久久久精品美女
|
午夜99|
国产精品欧美在线
|
高清乱码男女免费观看
|
高hnp失禁3p小公主
|
久青草视频|
玖玖伊人
|
97人人看
|
欧美日韩高清
|