【51單片機(jī)系列】C51中的定時(shí)計(jì)數(shù)器

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ī)器周期為單位。

T_{機(jī)器周期} = 6T_{狀態(tài)周期} = 12T_{振蕩周期}课锌。

比如厨内,外接晶振為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)如下:

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)志图云。

  1. 工作方式寄存器TMOD

工作方式寄存器TMOD用于設(shè)置定時(shí)/計(jì)數(shù)器的工作方式,低四位用于T0邻邮,高四位用于T1竣况。其格式如下:

定時(shí)計(jì)數(shù)器工作方式寄存器TMOD
  • 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ù)
  1. 控制寄存器TCON

TCON的低四位用于控制外部中斷,高四位用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)和中斷申請(qǐng)伐债。格式如下:

定時(shí)計(jì)數(shù)器控制寄存器TCON
  • 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ù))弥喉。

  1. 方式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)圖如下:

方式0結(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)系為:X=2^{13} -N老厌。

  1. 方式1

方式1的計(jì)數(shù)位數(shù)是16位,由TL0作為低8位黎炉,TH0作為高8位枝秤,組成了16位加1計(jì)數(shù)器。其結(jié)構(gòu)圖如下:

方式1結(jié)構(gòu)圖

計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:X=2^{16} -N慷嗜。

  1. 方式2

方式2為自動(dòng)重裝初值的8位計(jì)數(shù)方式淀弹。工作方式2特別適合于用作較精確的脈沖信號(hào)發(fā)生器。其結(jié)構(gòu)圖如下所示:

方式2結(jié)構(gòu)圖

計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:X=2^8 - N庆械。

  1. 方式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)如下所示:

方式3結(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模塊如下:

preotus設(shè)計(jì)使用定時(shí)器0控制LED模塊實(shí)現(xiàn)亮滅

軟件實(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é)果:

定時(shí)器0控制LED模塊亮滅
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谬盐,隨后出現(xiàn)的幾起案子甸私,更是在濱河造成了極大的恐慌,老刑警劉巖飞傀,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皇型,死亡現(xiàn)場離奇詭異诬烹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弃鸦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門绞吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唬格,你說我怎么就攤上這事家破。” “怎么了购岗?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵汰聋,是天一觀的道長。 經(jīng)常有香客問我喊积,道長烹困,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任乾吻,我火速辦了婚禮髓梅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绎签。我一直安慰自己枯饿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布诡必。 她就那樣靜靜地躺著奢方,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爸舒。 梳的紋絲不亂的頭發(fā)上袱巨,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音碳抄,去河邊找鬼。 笑死场绿,一個(gè)胖子當(dāng)著我的面吹牛剖效,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焰盗,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼璧尸,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了熬拒?” 一聲冷哼從身側(cè)響起爷光,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澎粟,沒想到半個(gè)月后蛀序,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢瞪,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年徐裸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遣鼓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡重贺,死狀恐怖骑祟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情气笙,我是刑警寧澤次企,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站潜圃,受9級(jí)特大地震影響缸棵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秉犹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一蛉谜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崇堵,春花似錦型诚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赏廓,卻和暖如春涵紊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幔摸。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工摸柄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人既忆。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓驱负,卻偏偏與公主長得像,于是被迫代替她去往敵國和親患雇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跃脊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容