單片機(jī)中定時器與計數(shù)器的區(qū)別
定時器實際上也是計數(shù)器,只是計數(shù)的是固定周期的脈沖
定時/計數(shù)器很容易理解的啊
定時器實際上也是工作在計數(shù)方式下,只是計數(shù)的是固定周期的脈沖,由于脈沖周期固定,由計數(shù)值可以計算時間,有定時功能
定時和計數(shù)只是觸發(fā)來源不同(時鐘信號和外部脈沖)其他方面是一樣的。
單片機(jī)里的寄存器可以看成一個個電子開關(guān),用來切換不同的功能、信號。
51里通過TMOD里的T/C 位切換計數(shù)信號的來源
當(dāng)T/C工作在定時器時,對振蕩源12分頻的脈沖計數(shù),即每個機(jī)器周期計數(shù)值加1,計數(shù)頻率為1/12fosc,當(dāng)晶振頻率6MHZ時,計數(shù)頻率為500KHz,每2us計數(shù)值加1;晶振12MHZ就是每1us加1 了。
當(dāng)T/C工作在計數(shù)器是,計數(shù)脈沖來自外部脈沖輸入管腳T0(P3.4)或T1(P3.5),當(dāng)T0或T1腳上負(fù)跳變時計數(shù)值加1 ,識別管腳負(fù)跳變需要2個機(jī)器周期,即24個振蕩周期。所以T0或T1腳輸入的可計數(shù)的外部脈沖的最高頻率為1/24fosc,當(dāng)晶振12MHZ時,最高計數(shù)頻率為500KHz,高于此頻率將計數(shù)出錯。
至于賦初值就是杯子原理了,由于51只能加計數(shù),且只能在杯子剛剛滿的那一刻發(fā)出中斷,觸發(fā)中斷程序,所以我們就往杯子里先放好一定的豆子,再來相應(yīng)數(shù)量的豆子就滿了,然后中斷程序就自動工作了。
注意:
定時和計數(shù)只是觸發(fā)來源不同(時鐘信號和外部脈沖)其他方面是一樣的。
假設(shè)我們要定時一定時間(100個機(jī)器周期),我們就置初值為(溢出值-100)就行了,假設(shè)我們要計件100個,實際上也是置初值為(溢出值-100),然后將輸入脈沖設(shè)為外部輸入就可以了
說:定時和計數(shù)只是觸發(fā)來源不同(時鐘信號和外部脈沖)其他方面是一樣的。
在中斷里置初值是為下一個循環(huán)作準(zhǔn)備,沒什么好說的,看需要定了。
由于定時計數(shù)器的值也可以隨時讀出來,所以我們也可以從0開始計數(shù),從而計算一段時間或一定脈沖的數(shù)量哦,這是照樣可以打開中斷,中斷時就說明已經(jīng)又計數(shù)了(定時器溢出值)個脈沖哦,在中斷里進(jìn)行溢出處理,就可以計算出遠(yuǎn)遠(yuǎn)大于(定時器溢出值)的數(shù)字了
此時也要注意一點:51讀數(shù)時除了T/C2的捕捉功能,直接讀TH和TL可是不斷變化的哦,具體的還是看書。當(dāng)你理解了定時計數(shù)器后,我們甚至還可以將計數(shù)值置為(溢出值-1),從而實現(xiàn)自動單步(定時模式)或作為外部中斷(計數(shù)模式)用哦,仔細(xì)想想吧,呵呵;-)
至于中斷中的需要保護(hù)現(xiàn)場的原因,是為了防止不小心修改了別的程序的參數(shù),從而影響別的程序的運行,所以要且只要保護(hù)中斷程序自己動過的數(shù)據(jù),將動過的那些存儲器在退出中斷時恢復(fù)到進(jìn)入時的狀態(tài),就不會影響被中斷的程序了。
匯編需要自己保存現(xiàn)場,反正程序就是自己編的嘛,一切盡在掌握中;
C的話編譯器會自動進(jìn)行覆蓋分析,自動保存需要保存的變量,一般應(yīng)用時盡可放心,當(dāng)然,如果你很了解編譯器做了什么,也可以嵌入?yún)R編天馬行空自由發(fā)揮啊,但新手可不建議這樣哦,還是交給編譯器吧。
其實這些可以說都是基礎(chǔ)知識啊,如果不明白肯定是你的書看的不夠仔細(xì)哦