【单片机】C51中的定时/计数器介绍
C51定時器和計數(shù)器
開發(fā)板:普中51-單核-A2;
仿真軟件:proteus;
開發(fā)環(huán)境:Keil4;
參考資料:開發(fā)板所附視頻;
如有錯誤,感謝指正。如有侵權請聯(lián)系博主。
定時器原理
與CPU時序有關的知識
- 振蕩周期:為單片機提供定時信號的振蕩源的周期(晶振周期或外加振蕩周期);
- 狀態(tài)周期:2個振蕩周期為1個狀態(tài)周期,用S表示。振蕩周期又稱為S周期或時鐘周期;
- 機器周期:1個機器周期含有6個狀態(tài)周期等于12個震蕩周期;
- 指令周期:完成1條指令所占用的全部時間,它以機器周期為單位;
T機器周期=6?T狀態(tài)周期=12?T振蕩周期T_{機器周期} = 6*T_{狀態(tài)周期} = 12*T_{振蕩周期}T機器周期?=6?T狀態(tài)周期?=12?T振蕩周期?
若振蕩周期為12MHz,那么T振蕩周期=1/12usT_{振蕩周期} = 1/12usT振蕩周期?=1/12us,T機器周期=12?T振蕩周期=1usT_{機器周期} = 12*T_{振蕩周期}=1usT機器周期?=12?T振蕩周期?=1us。指令周期通常是14us1~4us1?4us.
- 51單片機有兩組定時器/計數(shù)器。既可以定時,又可以計數(shù)。
- 定時器/計數(shù)器和單片機的CPU是相互獨立的,定時器/計數(shù)器工作的過程是自動完成的,不需要CPU參與。
- 51單片機中的定時器/計數(shù)器是根據(jù)機器內(nèi)部的始終或者外部的脈沖信號對寄存器中的數(shù)據(jù)加1.
- 有了定時器/計數(shù)器之后,可以增加單片機的效率,一些簡單重復加1的工作可以交給定時器/計數(shù)器處理。CPU去處理一些復雜的事情,同時可以實現(xiàn)精確的定時作用。
定時器/計數(shù)器的工作原理
定時器/計數(shù)器實質(zhì)是一個加1計數(shù)器。隨著計數(shù)器的輸入脈沖進行自加1,即每來一個脈沖,計數(shù)器就自動加1,當計數(shù)器全部為1時,再輸入一個脈沖就是計數(shù)器回零。且計數(shù)器的溢出使響應的中斷標志位置1,向CPU發(fā)出中斷請求(定時器/計數(shù)器中斷允許時)。
如果定時器/計數(shù)器工作于定時模式,則表示定時時間已到;如果工作于計數(shù)模式,則表示計數(shù)值已滿。
由溢出時計數(shù)器的值減去計數(shù)初值是加1計數(shù)器的計數(shù)值。
51單片機定時器結(jié)構(gòu)
定時器/計數(shù)器的實質(zhì)是加1計數(shù)器(16位),由高8位和低8位兩個寄存器THx和TLx組成。
- TMOD是定時器/計數(shù)器的工作方式寄存器,用以確定工作方式和功能;
- TCON是控制寄存器,控制T0、T1的啟動和停止及設置溢出標志。
TMOD工作方式寄存器
TMOD低四位用于T0,高四位用于T1。
| 字節(jié)地址:89H89H89H | GATEGATEGATE | C/T ̄C/\overline{T}C/T | M1M1M1 | M0M0M0 | GATEGATEGATE | C/T ̄C/\overline{T}C/T | M1M1M1 | M0M0M0 | TMODTMODTMOD |
- GATEGATEGATE:門控位,用于控制定時器的啟動是否受外部中斷源信號的影響
- GATE=0GATE=0GATE=0時,只要軟件使TCON種的TR0或TR1為1,就可以啟動定時器/計數(shù)器;
- GATE=1GATE=1GATE=1時,要用軟件TR0或TR1為1,同時外部中斷引腳INT0/1也為高電平時,才能啟動定時器/計數(shù)器工作,即此時定時器的啟動工作加上了INT0/INT1引腳為高電平這一條件。
- C/T ̄C/\overline{T}C/T:定時/計數(shù)器模式選擇位
- C/T ̄=0C/\overline{T}=0C/T=0,為定時模式;
- C/T ̄=1C/\overline{T}=1C/T=1,為計數(shù)模式;
- M1M0M1M0M1M0,工作方式設置位,有4種工作方式,經(jīng)常使用方式1和方式2
| 00 | 方式0 | 13位定時/計數(shù)器 |
| 01 | 方式1 | 16位定時/計數(shù)器 |
| 10 | 方式2 | 8位自動重裝定時/計數(shù)器 |
| 11 | 方式3 | T0分成兩個獨立的8位定時/計數(shù)器,T1此方式停止計數(shù) |
TCON控制寄存器
TCON低四位控制外部中斷,TCON高4位控制定時/計數(shù)器的啟動和中斷的申請。
| 字節(jié)地址:88H88H88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 | TCON |
- TF1(TCON.7):T1溢出中斷請求標志位,T1計數(shù)溢出時由硬件自動置為1,CPU響應中斷后TF1由硬件自動清0.T1工作時,CPU可隨時查詢TF1的狀態(tài),可以用TF1作為查詢測試的標志。TF1也可以用軟件置1或清0,同硬件置1或清0效果一樣。
- TR1(TCON.6):T1運行控制位,軟件置1或清0,軟件可控制定時/計數(shù)器的啟動于停止
- TR1=1,T1開始工作;
- TR1=0,T1停止工作;
- TF0:與TF1類似
- TR0:與TR1類似
定時/計數(shù)器的工作方式
方式0
方式0為13位計數(shù),由TL的低5位和TH的8位組成。
定時器模式時:N=t/TcyN=t/T_{cy}N=t/Tcy?;定時器的初值可以采用計數(shù)個數(shù)直接取補法獲得;
計數(shù)初值計算公式:X=213?NX=2^{13}-NX=213?N,計數(shù)模式時,技術脈沖是T0引腳上的外部脈沖。
GATE決定是否由外部中斷源信號觸發(fā)。
方式1
方式1為16位計數(shù),由TL的8位和TH的8位組成。
計數(shù)初值計算公式:X=216?NX=2^{16}-NX=216?N。
方式2
方式2為自動重裝初值的8位計數(shù)方式。計數(shù)初值計算公式:X=28?NX=2^{8}-NX=28?N。
適合用于精確的脈沖信號發(fā)生器。
方式3
方式3只適用于定時/計數(shù)器T0,定時器T1處于方式3相當于TR=0,停止計數(shù)。
方式3將T0分為兩個獨立的8位計數(shù)器TL0和TH0。
使用定時器
初始化程序應該完成如下
- 對TMOD賦值,確定T0和T1的工作方式;
- 計算初值,并將其寫入TH0、TL0或TH1、TL1。
- 中斷方式時,需要對總中斷EA置1,開放定時器中斷;
- 使TR0或TR1置位,啟動定時/計數(shù)器定時或計數(shù)。
計數(shù)器初值計算
定時1ms的初值計算:1ms/1us=10001ms/1us=10001ms/1us=1000,即累計1000個數(shù),初值 = 65535-1000+1(實際上計數(shù)器計數(shù)到65536時才溢出,所以加1)。
1us1us1us是假設晶振頻率是12MHz,那么機器周期就為1us1us1us。
示例
/* 使用定時器0實現(xiàn)LED間隔一秒亮-滅 精確時間 */ #include "reg52.h"typedef unsigned char u8; typedef unsigned int u16;sbit LED=P2^0; // D1// 定時器0初始化 void Timer0Init() {// 1. TMOD賦值,確定T0和T1的工作方式// M1M0=01表示使用方式1,// C/T=0表示使用定時模式,// GATE=0表示僅使用TCON控制TMOD |= 0x01; // 置M0=1// 2. 計算初值,定時1ms, 65535-1000+1TH0 = 0xFC;TL0 = 0x18; // 3. 開啟中斷ET0=1; // 中斷允許位置1EA=1; // 打開總中斷//4. 打開定時功能TR0=1; }void Timer1Init() {// 1. TMOD賦值,確定T0和T1的工作方式// M1M0=01表示使用方式1,// C/T=0表示使用定時模式,// GATE=0表示僅使用TCON控制TMOD |= 0x10; // 置M0=1// 2. 計算初值,定時1ms, 65535-1000+1TH1 = 0xFC;TL1 = 0x18; // 3. 開啟中斷ET1=1; // 中斷允許位置1EA=1; // 打開總中斷//4. 打開定時功能TR1=1; }void main() {Timer1Init();while(1); }// 定時器0中斷函數(shù) void Timer0() interrupt 1 {static u16 i=0;// 重新裝載初值TH0 TL0TH0 = 0xFC;TL0 = 0x18;i++;if(i==1000) // 表示1s了{i=0; // 清零iLED = ~LED;} }// 定時器1中斷函數(shù) void Timer1() interrupt 3 {static u16 i=0;// 重新裝載初值TH1 TL1TH1 = 0xFC;TL1 = 0x18;i++;if(i==1000) // 表示已經(jīng)1s{i=0; // 清零iLED = ~LED;} }結(jié)果顯示:
總結(jié)
以上是生活随笔為你收集整理的【单片机】C51中的定时/计数器介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java dsa算法_DSA算法
- 下一篇: Android P wakeup 亮屏流