微控制器定時器與計數器的區別
在51微控制器的學習過程中,我們經常會發現中斷、計數器/定時器、串列埠是學習微控制器的難點,兩者的區別是什麼呢?下面就跟著小編一起來看看吧。
微控制器計數器與定時器的區別
計數器和定時器的本質是相同的,他們都是對微控制器中產生的脈衝進行計數,只不過計數器是微控制器外部觸發的脈衝,定時器是微控制器內部在晶振的觸發下產生的脈衝。當他們的脈衝間隔相同的時候,計數器和定時器就是一個概念。
在定時器和計數器中都有一個溢位的概念,那什麼是溢位了。呵呵,我們可以從一個生活小常識得到答案,當一個碗放在水龍頭下接水的時候,過了一會兒,碗的水滿了,就發生溢位。同樣的道理,假設水龍頭的水是一滴滴的往碗裡滴,那麼總有一滴水是導致碗中的水溢位的。在碗中溢位的水就浪費了,但是在微控制器的定時計數器中溢位將導致一次中斷,至於什麼是中斷我們下次再講,這裡只是初步的提下概念,中斷就是能夠打斷系統正常執行,而去執行中斷服務程式的過程,當服務程式執行完以後又自動回到被打斷的地方繼續執行。
在定時器計數器中,我們有個概念叫容量,就是最大計數量。方式0是2的13次方,方式1是2的13次方,方式2是2的8次方,方式3是2的8次方。把水滴比喻成脈衝,那麼導致碗中水溢位的最後一滴水的就是定時計數器的溢位的最後一個脈衝。
在各種微控制器書本中,在介紹定時計數器時都講到一個計數初值,那什麼是計數初值呢?在這裡我們還是假設水滴碗。假設第一百滴水能夠使碗中的水溢位,我們就知道這個碗的容量是100。問題1,我如何才能使碗接到10滴水就溢位呢?呵呵,我可以想象,如果拿一個空碗去接水,那麼還是得要100滴水才能溢位,但是如果我們拿一個已經裝有水的碗拿去接,那就不用100滴了。到此我們可以算出,要使10滴水讓碗中的水溢位,那麼碗中就先要裝90滴水。
在定時計數器中,這90滴水就是我們所謂的初始值。問題2,在一個車間我們如何利用微控制器對100件產品進行計件,並進行自動包裝呢?
我們可以利用計數器計數100,在中斷中執行一個自動包裝的動作就可以了。
在這裡計數初值有3個,假設有方式0:計數初值=8912***2的13次方***—100=8812。方式1:計數初值=65536***2的16次方***—100=65436。方式0:計數初值=256***2的8次方***—100=156。
根據所得的初始值,再將其轉換為16進位制或者2進位制,就可以進行計數或者定時了。當然要讓程式完全的執行起來還需要相應的暫存器進行設定。這些可以從各種微控制器教程中找到。
微控制器中定時器與計數器的區別
定時器實際上也是計數器,只是計數的是固定週期的脈衝
定時/計數器很容易理解的啊
定時器實際上也是工作在計數方式下,只是計數的是固定週期的脈衝,由於脈衝週期固定,由計數值可以計算時間,有定時功能
定時和計數只是觸發來源不同***時鐘訊號和外部脈衝***其他方面是一樣的。
微控制器裡的暫存器可以看成一個個電子開關,用來切換不同的功能、訊號。
51裡通過TMOD裡的T/C 位切換計數訊號的來源
當T/C工作在定時器時,對振盪源12分頻的脈衝計數,即每個機器週期計數值加1,計數頻率為1/12fosc,當晶振頻率6MHZ時,計數頻率為500KHz,每2us計數值加1;晶振12MHZ就是每1us加1 了。
當T/C工作在計數器是,計數脈衝來自外部脈衝輸入管腳T0***P3.4***或T1***P3.5***,當T0或T1腳上負跳變時計數值加1 ,識別管腳負跳變需要2個機器週期,即24個振盪週期。所以T0或T1腳輸入的可計數的外部脈衝的最高頻率為1/24fosc,當晶振12MHZ時,最高計數頻率為500KHz,高於此頻率將計數出錯。
至於賦初值就是杯子原理了,由於51只能加計數,且只能在杯子剛剛滿的那一刻發出中斷,觸發中斷程式,所以我們就往杯子裡先放好一定的豆子,再來相應數量的豆子就滿了,然後中斷程式就自動工作了。
注意:
定時和計數只是觸發來源不同***時鐘訊號和外部脈衝***其他方面是一樣的。
假設我們要定時一定時間***100個機器週期***,我們就置初值為***溢位值-100***就行了,假設我們要計件100個,實際上也是置初值為***溢位值-100***,然後將輸入脈衝設為外部輸入就可以了
所以說:定時和計數只是觸發來源不同***時鐘訊號和外部脈衝***其他方面是一樣的。
在中斷裡置初值是為下一個迴圈作準備,沒什麼好說的,看需要定了。
由於定時計數器的值也可以隨時讀出來,所以我們也可以從0開始計數,從而計算一段時間或一定脈衝的數量哦,這是照樣可以開啟中斷,中斷時就說明已經又計數了***定時器溢位值***個脈衝哦,在中斷裡進行溢位處理,就可以計算出遠遠大於***定時器溢位值***的數字了
此時也要注意一點:51讀數時除了T/C2的捕捉功能,直接讀TH和TL可是不斷變化的哦,具體的還是看書。當你理解了定時計數器後,我們甚至還可以將計數值置為***溢位值-1***,從而實現自動單步***定時模式***或作為外部中斷***計數模式***用哦,仔細想想吧,呵呵;-***
至於中斷中的需要保護現場的原因,是為了防止不小心修改了別的程式的引數,從而影響別的程式的執行,所以要且只要保護中斷程式自己動過的資料,將動過的那些儲存器在退出中斷時恢復到進入時的狀態,就不會影響被中斷的程式了。
彙編需要自己儲存現場,反正程式就是自己編的嘛,一切盡在掌握中;
C的話編譯器會自動進行覆蓋分析,自動儲存需要儲存的變數,一般應用時儘可放心,當然,如果你很瞭解編譯器做了什麼,也可以嵌入彙編天馬行空自由發揮啊,但新手可不建議這樣哦,還是交給編譯器吧。
其實這些可以說都是基礎知識啊,如果不明白肯定是你的書看的不夠仔細哦.
猜你喜歡