STC89C5X系列含有3個(gè)定時(shí)器:定時(shí)器0、定時(shí)器1捶朵、定時(shí)器2贤壁。51系列單片機(jī)一定有基本的2個(gè)定時(shí)器(定時(shí)器0和定時(shí)器1)悼枢,但不全有3個(gè)中斷埠忘,需要查看芯片手冊(cè)脾拆,通常使用的是基本的2個(gè)定時(shí)器:定時(shí)器0/1。
一莹妒、 定時(shí)器介紹
在介紹定時(shí)器之前名船,需要先了解以下內(nèi)容。
1.1旨怠、CPU時(shí)序的有關(guān)知識(shí)
① 振蕩周期:為單片機(jī)提供定時(shí)信號(hào)的振蕩源的周期(晶振周期或外加振蕩周期)渠驼;
② 狀態(tài)周期:2個(gè)振蕩周期為1個(gè)狀態(tài)周期,用S表示鉴腻。振蕩周期又稱為S周期或時(shí)鐘周期迷扇;
③ 機(jī)器周期:1個(gè)機(jī)器周期包含6個(gè)狀態(tài)周期,12個(gè)振蕩周期爽哎;
④ 指令周期:完成1條指令所占用的全部事件蜓席,以機(jī)器周期為單位。
即课锌。
比如厨内,外接晶振為12MHz時(shí),51單片機(jī)相關(guān)周期的具體值為:
振蕩周期=1/12us渺贤;
狀態(tài)周期=2x振蕩周期=1/6us雏胃;
機(jī)器周期=6x狀態(tài)周期=12x振蕩周期=1us;
指令周期=1 ~ 4us志鞍;
1.2瞭亮、學(xué)習(xí)定時(shí)器前需要明確幾點(diǎn)
① 51單片機(jī)有兩組定時(shí)器/計(jì)數(shù)器,因?yàn)榧瓤梢远〞r(shí)固棚,又可以計(jì)數(shù)统翩,故稱之為定時(shí)/計(jì)數(shù)器。
② 定時(shí)/計(jì)數(shù)器和單片機(jī)的CPU是相互獨(dú)立的玻孟,定時(shí)/計(jì)數(shù)器工作的過程是自動(dòng)完成的唆缴,不需要CPU參數(shù)。
③ 51單片機(jī)中的定時(shí)/計(jì)數(shù)器是根據(jù)機(jī)器內(nèi)部的時(shí)鐘或者外部的脈沖信號(hào)對(duì)寄存器中的數(shù)據(jù)加1.
有了定時(shí)/計(jì)數(shù)器之后黍翎,可以增加單片機(jī)的效率面徽,一些簡單的重復(fù)加1的工作可以交給定時(shí)/計(jì)數(shù)器處理,CPU轉(zhuǎn)去處理一些復(fù)雜的事情,同時(shí)可以實(shí)現(xiàn)精確定時(shí)作用趟紊。
1.3氮双、單片機(jī)定時(shí)器原理
STC89C5X單片機(jī)內(nèi)有兩個(gè)可編程的定時(shí)/計(jì)數(shù)器T0、T1和一個(gè)特殊功能寄存器T2霎匈。
定時(shí)/計(jì)數(shù)器的實(shí)質(zhì)是加1計(jì)數(shù)器(16位)戴差,由高8位和低8位兩個(gè)寄存器THx和TLx組成。它隨著計(jì)數(shù)器的輸入脈沖進(jìn)行自加1铛嘱,也就是每來一個(gè)脈沖暖释,計(jì)數(shù)器就自動(dòng)加1,當(dāng)加到計(jì)數(shù)器全為1時(shí)墨吓,再輸入一個(gè)脈沖就使計(jì)數(shù)器回零球匕,且計(jì)數(shù)器的溢出使相應(yīng)的中斷標(biāo)志位置1,向CPU發(fā)出中斷請(qǐng)求(定時(shí)/計(jì)數(shù)器中斷允許時(shí))帖烘。如果定時(shí)/計(jì)數(shù)器工作與定時(shí)模式亮曹,則表示定時(shí)時(shí)間已到;如果工作于計(jì)數(shù)模式秘症,則表示計(jì)數(shù)值已滿照卦。由溢出時(shí)計(jì)數(shù)器的值減去計(jì)數(shù)初值才是加1計(jì)數(shù)器的計(jì)數(shù)值。
1.4乡摹、51單片機(jī)定時(shí)/計(jì)數(shù)器結(jié)構(gòu)
51單片機(jī)定時(shí)/計(jì)數(shù)器內(nèi)部結(jié)構(gòu)如下:
上圖中的T0和T1引腳對(duì)應(yīng)的是單片機(jī)P3.4和P3.5管腳役耕。
51單片機(jī)定時(shí)/計(jì)數(shù)器的工作由兩個(gè)特殊功能寄存器控制。TMOD是定時(shí)/計(jì)數(shù)器的工作方式寄存器趟卸,確定工作方式和功能蹄葱;TCON是控制寄存器,控制T0锄列、T1的啟動(dòng)和停止及設(shè)置溢出標(biāo)志图云。
- 工作方式寄存器TMOD
工作方式寄存器TMOD用于設(shè)置定時(shí)/計(jì)數(shù)器的工作方式,低四位用于T0邻邮,高四位用于T1竣况。其格式如下:
- GATE是門控位,用于控制定時(shí)器的啟動(dòng)是否受外部中斷源信號(hào)的影響筒严。
- GATE=0時(shí)丹泉,只要用軟件使TCON中的TR0或TR1為1,就可以啟動(dòng)定時(shí)/計(jì)數(shù)器工作鸭蛙;
- GATE=1時(shí)摹恨,要用軟件使TR0或TR1為1,同時(shí)外部中斷引腳INT0/1也為高電平時(shí)娶视,才能啟動(dòng)定時(shí)/計(jì)數(shù)器工作晒哄。即此時(shí)定時(shí)器的啟動(dòng)條件睁宰,加上了INT0/1引腳為高電平這一條件。
- C/T:定時(shí)/計(jì)數(shù)模式選擇位寝凌。C/T=0為定時(shí)模式柒傻;C/T=1為計(jì)數(shù)模式。
- M1M0:工作方式設(shè)置位较木。定時(shí)/計(jì)數(shù)器有四種工作方式:
定時(shí)/計(jì)數(shù)器工作方式設(shè)置表
M1M0 | 工作方式 | 說明 |
---|---|---|
00 | 方式0 | 13位定時(shí)/計(jì)數(shù)器 |
01 | 方式1 | 16位定時(shí)/計(jì)數(shù)器 |
10 | 方式2 | 8位自動(dòng)重裝定時(shí)/計(jì)數(shù)器 |
11 | 方式3 | T0分成兩個(gè)獨(dú)立的8位定時(shí)/計(jì)數(shù)器红符;T1此方式停止計(jì)數(shù) |
- 控制寄存器TCON
TCON的低四位用于控制外部中斷,高四位用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)和中斷申請(qǐng)伐债。格式如下:
- TF1:T1溢出中斷請(qǐng)求標(biāo)志位预侯。T1計(jì)數(shù)溢出時(shí)由硬件自動(dòng)置TF1為1。CPU響應(yīng)中斷后TF1由硬件自動(dòng)清0泳赋。T1工作時(shí)雌桑,CPU可隨時(shí)查詢TF1的狀態(tài)。所以祖今,TF1可用作查詢測試的標(biāo)志。TF1也可以用軟件置1或清0拣技,同硬件置1或清0的效果一樣千诬。
- TR1:T1運(yùn)行控制位。TR1置1時(shí)膏斤,T1開始工作徐绑;TR1置0時(shí),T1停止工作莫辨。TR1由軟件置1或清0.所以傲茄,用軟件可控制定時(shí)/計(jì)數(shù)器的啟動(dòng)與停止。
- TF0:T0溢出中斷請(qǐng)求標(biāo)志位沮榜,其功能與TF1類似盘榨;
- TR0:T0運(yùn)行控制位,其功能與TR1類似蟆融。
1.5草巡、定時(shí)/計(jì)數(shù)器的工作方式
定時(shí)/計(jì)數(shù)器工作方式有四種:方式0(13位定時(shí)/計(jì)數(shù)器)、方式1(16位定時(shí)/計(jì)數(shù)器)型酥、方式2(8位自動(dòng)重裝定時(shí)/計(jì)數(shù)器)山憨、方式3(T0分成兩個(gè)獨(dú)立的8位定時(shí)/計(jì)數(shù)器,T1此方式停止計(jì)數(shù))弥喉。
- 方式0
方式0是13位計(jì)數(shù)郁竟,由TL0的低5位和TH0的8位組成。TL0的低5位溢出時(shí)向TH0進(jìn)位由境,TH0溢出時(shí)棚亩,置位TCON中的TF0標(biāo)志,向CPU發(fā)出中斷請(qǐng)求。結(jié)構(gòu)圖如下:
門控位GATE具有特殊的作用蔑舞。當(dāng)GATE=0時(shí)拒担,經(jīng)反相后使或門輸出為1,此時(shí)僅由TR0控制與門的開啟攻询,與門輸出1時(shí)从撼,控制開關(guān)接通,計(jì)數(shù)開始钧栖;
當(dāng)GATE=1時(shí)低零,由外中斷引腳信號(hào)控制或門的輸出,此時(shí)控制與門的開啟由外中斷引腳信號(hào)和TR0共同控制拯杠。當(dāng)TR0=1時(shí)掏婶,外中斷引腳信號(hào)引腳的高電平啟動(dòng)計(jì)數(shù),外中斷引腳信號(hào)引腳的低電平停止計(jì)數(shù)潭陪。這種方式常用來測量外中斷引腳上正脈沖的寬度雄妥。計(jì)數(shù)模式時(shí),計(jì)數(shù)脈沖是T0引腳上的外部脈沖依溯。計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:老厌。
- 方式1
方式1的計(jì)數(shù)位數(shù)是16位,由TL0作為低8位黎炉,TH0作為高8位枝秤,組成了16位加1計(jì)數(shù)器。其結(jié)構(gòu)圖如下:
計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:慷嗜。
- 方式2
方式2為自動(dòng)重裝初值的8位計(jì)數(shù)方式淀弹。工作方式2特別適合于用作較精確的脈沖信號(hào)發(fā)生器。其結(jié)構(gòu)圖如下所示:
計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:庆械。
- 方式3
方式3只適用于定時(shí)/計(jì)數(shù)器T0薇溃,定時(shí)器T1處于方式3時(shí)相當(dāng)于TR1=0,停止計(jì)數(shù)干奢。工作方式3將T0分成兩個(gè)8位計(jì)數(shù)器TL0和TH0痊焊。其結(jié)構(gòu)如下所示:
上面幾種工作方式中應(yīng)用較多的是方式1和方式2。定時(shí)器中通常使用定時(shí)器方式1忿峻,串口通信中通常使用方式2薄啥。
二、 定時(shí)器配置
使用定時(shí)器時(shí)逛尚,按照如下步驟配置使其工作垄惧,各步驟的順序可任意。
① 對(duì)TMOD賦值绰寞,以確定T0和T1的工作方式到逊,如果使用定時(shí)器0即對(duì)T0配置铣口,如果使用定時(shí)器1即對(duì)T1配置。
② 根據(jù)所要定時(shí)的時(shí)間計(jì)算初值觉壶,并將其寫入TH0脑题、TL0或TH1、TL1铜靶。
③ 如果使用中斷叔遂,則對(duì)EA賦值,開放定時(shí)器中斷争剿。
④ 使TR0或TR1置位已艰,啟動(dòng)定時(shí)/計(jì)數(shù)器定時(shí)或計(jì)數(shù)。
上面的步驟中有一個(gè)定時(shí)/計(jì)數(shù)器初值的計(jì)算蚕苇,接下來介紹下如何計(jì)算定時(shí)/計(jì)數(shù)器初值哩掺。
機(jī)器周期是CPU完成一個(gè)基本操作所需要的時(shí)間。其計(jì)算公式是:機(jī)器周期=1/單片機(jī)的時(shí)鐘頻率涩笤。
51單片機(jī)內(nèi)部時(shí)鐘頻率是外部時(shí)鐘的12分頻嚼吞,也就是說當(dāng)外部晶振的頻率輸入到單片機(jī)里面的時(shí)候要進(jìn)行12分頻。
比如使用的是12MH晶振辆它,那么單片機(jī)內(nèi)部的時(shí)鐘頻率是12/12MHz誊薄。當(dāng)使用12MHz的外部晶振的時(shí)候,機(jī)器周期=1/1MHz=1us锰茉。
那么要定時(shí)1ms的初值為多少?首先計(jì)數(shù)個(gè)數(shù)為1ms/1us=1000切心,即要計(jì)數(shù)1000個(gè)飒筑;計(jì)數(shù)初值=65535-1000+1=64536=FC18H(因?yàn)閷?shí)際上計(jì)數(shù)器計(jì)數(shù)要達(dá)到65536才溢出,所以后面加1)绽昏,初值即為THx=0xFC协屡,TLx=0x18。
直到了如何計(jì)算定時(shí)/計(jì)數(shù)器初值全谤,那么想定時(shí)多長時(shí)間都可以計(jì)算出來肤晓。由于定時(shí)計(jì)數(shù)器位數(shù)有限,不可能直接通過初值定時(shí)很長時(shí)間认然,如果要實(shí)現(xiàn)很長時(shí)間的定時(shí)补憾,比如定時(shí)1秒,可以通過初值設(shè)置定時(shí)1ms卷员,每當(dāng)定時(shí)1ms結(jié)束后又重新賦初值盈匾,并且設(shè)定一個(gè)全局變量累計(jì)定時(shí)1ms的次數(shù),當(dāng)累計(jì)到1000次表示已經(jīng)定時(shí)1秒了毕骡。需要其它定時(shí)時(shí)間類似操作削饵,這樣就可以使用定時(shí)器來實(shí)現(xiàn)精確延時(shí)代替之前的delay函數(shù)岩瘦。
示例,以定時(shí)器0為例配置定時(shí)器工作方式1窿撬、設(shè)定1ms初值启昧,開啟定時(shí)器計(jì)數(shù)功能及總中斷,如下:
void Timer0Init()
{
TMOD |= 0x01; // 選擇為定時(shí)器0模式劈伴,工作方式1密末,僅用TR0打開啟動(dòng)
TH0 = 0xFC; // 給定時(shí)器賦初值,定時(shí)1ms
TL0 = 0x18;
ET0 = 1; // 打開T0中斷允許位
EA = 1; // 打開總中斷
TR0 = 1; // 打開定時(shí)器
}
三宰啦、定時(shí)器使用示例
本示例實(shí)現(xiàn)的功能:通過定時(shí)器0中斷控制LED間隔1秒閃爍苏遥。在proteus中仿真,使用到的資源有:LED模塊和定時(shí)器0赡模。硬件電路很簡單田炭,只使用到LED模塊,定時(shí)器0屬于51單片機(jī)內(nèi)部資源漓柑,通過軟件配置即可使用教硫。proteus中設(shè)計(jì)LED模塊如下:
軟件實(shí)現(xiàn):
/*
實(shí)現(xiàn)功能:使用定時(shí)器0控制LED模塊間隔1秒亮滅
寄存器介紹:
TMOD 高四位用于T1,低四位用于T0辆布;
GATE=0表示僅TRx啟動(dòng)定時(shí)/計(jì)數(shù)器瞬矩,GATE=1表示外部中斷+TRx啟動(dòng)定時(shí)/計(jì)數(shù)器
C/T=0表示定時(shí)模式,C/T=1表示計(jì)數(shù)模式
M1M0表示工作方式
[2023-12-19] zoya
*/
#include "reg52.h"
#include "typedef.h"
#define GPIO_LED P2
/*************************************************************************
* 函數(shù)名: Timer0Init
* 函數(shù)功能: 定時(shí)器0初始化锋玲,選擇工作方式1景用,僅TR0打開啟動(dòng),定時(shí)1ms
* 輸入: void
* 輸出: void
**************************************************************************/
void Timer0Init()
{
// 1. 對(duì)TMOD賦值惭蹂,確定T0為工作方式1伞插,僅TR0打開啟動(dòng)
TMOD |= 0x01; // 低四位為 0001,GATE=0僅TR0啟動(dòng)盾碗,C/T=0定時(shí)模式媚污,M1M0=01工作方式1
// 2. 根據(jù)定時(shí)時(shí)間計(jì)算初值,賦初值
TH0 = 0xFC;
TL0 = 0x18;
// 3. 使用中斷廷雅,打開總中斷耗美,打開定時(shí)器中斷
EA=1;
ET0=1;
// 4. 置位TR0,啟動(dòng)定時(shí)
TR0=1;
}
void main()
{
Timer0Init(); // 外部中斷0初始化
while(1);
}
/*************************************************************************
* 函數(shù)名: Timer0
* 函數(shù)功能: 定時(shí)器0中斷服務(wù)函數(shù)航缀,
* 當(dāng)進(jìn)入該函數(shù)時(shí)表示定時(shí)時(shí)間已到商架,需要重新賦初值
* 輸入: void
* 輸出: void
**************************************************************************/
void Timer0() interrupt 1
{
static u16 i; // 統(tǒng)計(jì)定時(shí)1ms的次數(shù)
TH0 = 0xFC;
TL0 = 0x18;
i++;
if(1000 == i) // 如果定時(shí)1ms的次數(shù)達(dá)到了1000次表示過了1s
{
i=0;
GPIO_LED = ~GPIO_LED;
}
}
仿真結(jié)果: