網上查了很多解釋關于51單片機硬體定時設定的文章,發現說的不是特别透徹,可能大家覺得一些類似基本感念的問題就不用澄清了,是以對于我這樣的入門小白了解起來有些障礙,這裡我把自己的了解解釋的細緻多一些,希望能給同道中人一些幫助。
說到定時前需要澄清幾個概念:震蕩周期,狀态周期,機器周期,指令周期。(學習什麼知識概念必須掌握清楚,否則就“糊”了!)
震蕩周期:(來自百度百科)在單片機系統中,定時器需要借助單片機内部提供的脈沖進行定時,此時,定時的依據是CPU提供的周期性振蕩,振蕩一次所需的時間稱為振蕩周期。單片機系統也可以通過外部晶體振蕩器(也被稱為晶振)提供振蕩進行工作。
對于震蕩周期的了解:計算機系統中通常需要同時處理多個任務,想要協調這些任務,就必須在制定一個時間基準。電影裡有這麼一個場景:在執行一項特殊任務前,特種部隊的每個成員需要“對表”,其實就是這個道理。因為這個時間基準是最基本的時間依據,是以它的周期是最短的,頻率是最快的(周期和頻率的概念請大家自行學習),同時也是最小的時間機關。為了産生這個震蕩周期的時間基準,人們使用兩種方法,一種是采用CPU内部的基礎電路(比如LC振蕩電路)實作,另外一種是采用晶體(石英)本身的實體特性實作,采用外部晶振比采用CPU内部基礎電路可以提供更加準确、穩定的時間基準。
實體名額:振蕩頻率 f_osc,機關MHz(兆赫茲),f 是英文 frequency(意為頻率)的首字母,osc是英文oscillation(意為震蕩)的首字母。 f_osc就指的是晶振的振蕩頻率,晶振做好後這個頻率就固定了。現實中,會根據需要制作擁有不同頻率的晶振,比如常用的有12MHz的晶振,還有11.0592MHz。
震蕩周期的計算:震蕩周期為震蕩頻率的倒數,例如晶振的 f_osc 為12MHz,震蕩周期
秒,可見是一個非常短的時間。
狀态周期:網上貌似沒有十分明确的解釋,這裡我也不瞎編了,參考其他部落客的解釋我了解是CPU執行一次動作所需的時間,比如CPU執行讀寄存器、寫寄存器這些動作時就要改變狀态,可以參考《彙編語言》中對微機執行指令的介紹。
記住一個狀态周期=2個震蕩周期。
機器周期:我了解是CPU執行一個“任務”所需的機關時間,可以對照狀态周期中解釋過的“動作”的概念,一個“任務”是由若幹次“動作”組成的。以51單片機為例,一個機器周期包括了6個狀态周期,即12個震蕩周期,此時會發現如果使用12MHz的晶振,機器周期就是1微秒(妙啊!)。其實晶振的設計是根據計算機硬體執行“任務”或者“動作”這些“固定”時間進行設計的。
指令周期:就是CPU執行一條指令所需要的的時間,即1~4個機器周期。
有了以上這些概念再說定時器的初值設定就會了解了。
說到定時器,也可以說是計數器,在硬體上就是一組8位或者16位的寄存器,既然位數是有限個,就存在計時的時候超出範圍的問題,被稱為“溢出”。由此這些寄存器之外又設定了一個單獨的記憶體空間來判斷計時器工作時是否超出範圍,這個單獨的記憶體空間被稱為“溢出标志寄存器”,溢出後“标志寄存器”由0變為1,計時器的各個位傳回0,就像一個人在操場上長跑,跑完一圈又回到原點,但是自己心裡數着已經跑過的圈數。
對于51單片機,當計時器溢出時,觸發中斷(中斷的概念請自行學習),執行中斷程式。正是這個機制,可以使我們對計算機設定一個我們需要的時間,在這個時間計時完畢後執行我們需要的一些任務,這些任務可以寫在中斷程式當中。
當使用8位計時器時,溢出的最大值為2的8次方,即256,就是說計時器從0開始計數,再回到0,一共數了256次。對于16位計時器來講,從0開始計數到溢出時一共數了65536次。以8位計時器為例,如果我們需要計時器計數10次後産生中斷,我們需要計時器從256-10=246開始計數,如果我們需要計時器計數100次後産生中斷,我們需要計時器從256-100=156開始計數,其中246和156就是這篇文章所要解釋的“初值”。是以如何設定初值,取決于我們想要計時器數過多少數,這個“數過多少數”就是我們需要的“計數次數”。對于16位寄存器,它是由“高8位寄存器”和“低8位寄存器”一起組成的,是以設定初值時需要分别設定這兩個寄存器。
如果我們把“計數次數”和“時間”建立起聯系,就可以實作真正的“計時”而不是“計數”了,51單片機的計時器每記一個數所需要的的時間就是一個機器周期!即1微秒(這裡用外部12MHz晶振,采用12分頻),是以對于8位計時器,從0開始經過256微秒後溢出,對于16位計時器,從0開始經過65536微秒後溢出。當我們需要1毫秒後計時器溢出而執行中斷時,采用16位寄存器進行的時間計算就是65536-1000=64536,初值就是64536。
以上是我對計時器與中斷機制的粗淺了解,如果有誤,請斧正。