❶ 單片機定時器與計數器的區別
在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的話編譯器會自動進行覆蓋分析,自動保存需要保存的變數,一般應用時盡可放心,當然,如果你很了解編譯器做了什麼,也可以嵌入匯編天馬行空自由發揮啊,但新手可不建議這樣哦,還是交給編譯器吧。
其實這些可以說都是基礎知識啊,如果不明白肯定是你的書看的不夠仔細哦.
猜你喜歡
1. 單片機的硬體結構是什麼
2. 10秒定時器電路設計
3. 單片機技術論文
4. 單片機的發聲原理
5. 單片機開題報告範文
6. 電子實習報告單片機
7. 單片機實訓報告範文3篇