在學(xué)習(xí)定時(shí)/計(jì)數(shù)器之前,我們先了解一下在單片機(jī)中什么是定時(shí)/計(jì)數(shù)器。
在51單片機(jī)中有兩個(gè)定時(shí)/計(jì)數(shù)器T0和T1,在其增強(qiáng)型的52單片機(jī)中有三個(gè)定時(shí)/計(jì)數(shù)器T0、T1和T2。
定時(shí)/計(jì)數(shù)器系統(tǒng)是單片機(jī)內(nèi)部的一個(gè)獨(dú)立的硬件系統(tǒng),其與CPU和晶振通過內(nèi)部連接相互作用。當(dāng)CPU開啟其功能后,定時(shí)計(jì)數(shù)器便在晶振的作用下開始獨(dú)立工作。
定時(shí)/計(jì)數(shù)器本質(zhì)上是一個(gè)16位加1計(jì)數(shù)器,由高8位(TH0或TH1)和低8位(TL0或TL1)兩個(gè)寄存器組成。但是由于累加是在晶振的驅(qū)動(dòng)下,所以可以當(dāng)做計(jì)時(shí)器。通過設(shè)置相應(yīng)的寄存器可以選擇啟用其定時(shí)功能或者計(jì)數(shù)功能。當(dāng)計(jì)數(shù)器溢出則溢出標(biāo)志位置1。
在此介紹其兩個(gè)特殊功能寄存器:TMOD-定時(shí)計(jì)數(shù)器工作模式寄存器和TCON-定時(shí)/計(jì)數(shù)器控制寄存器。
TMOD-定時(shí)/計(jì)數(shù)器工作模式寄存器 (不可位尋址)
TMOD用來(lái)確定定時(shí)/計(jì)數(shù)器的工作方式及功能選擇。
GATE-門控制位
(若GATE為0,則定時(shí)/計(jì)數(shù)器啟動(dòng)和暫停只與相應(yīng)TCON寄存器中的運(yùn)行控制位有關(guān);若GATE為1,則定時(shí)計(jì)數(shù)器啟動(dòng)和暫停由相應(yīng)TCON寄存器中的運(yùn)行控制位和外部中斷引腳上的電平狀態(tài)共同控制)
C/T'-定時(shí)器模式和計(jì)數(shù)器模式選擇位
(為0定時(shí)器模式,為1計(jì)數(shù)器模式)
M1、M2-工作方式選擇位
工作方式1:THx和TLx兩個(gè)8位寄存器組合構(gòu)成一個(gè)16位定時(shí)/計(jì)數(shù)器。THx存放高8位,TLx存放低8位。
工作方式2:THx存放初值,待TLx累加溢出時(shí),THx內(nèi)的初值自動(dòng)重裝入TLx開始累加,循環(huán)往復(fù)。
介紹了應(yīng)用較多兩種工作方式。
定時(shí)器的計(jì)算
定時(shí)/計(jì)數(shù)器本質(zhì)上是一個(gè)16位加1計(jì)數(shù)器,在晶振的驅(qū)動(dòng)下,每過一個(gè)機(jī)器周期(12個(gè)時(shí)鐘周期)就自行加1。因此加1則意味著時(shí)間過了12/fs,其中f為晶振頻率。假如我們應(yīng)用定時(shí)器模式工作方式1。此模式下定時(shí)最長(zhǎng)時(shí)間為((2^16-1)x12/f)s。本開發(fā)板上晶振為11.0592MHz,則最長(zhǎng)定時(shí)時(shí)間約為71ms。所以當(dāng)定時(shí)時(shí)間大于71ms時(shí),我們可以迭代使其達(dá)到。
假如我們要定時(shí)100ms,我們可以定時(shí)50ms,再迭代2次。定時(shí)50ms要重裝初值,假如用T0。定時(shí)50ms約需要累加(0.05s/(12/f))=46083次。故需要將(65535-46083)=19452(0x4bfc)裝入TH0和TL0中。
TCON-定時(shí)/計(jì)數(shù)器控制寄存器 (可位尋址)
TF1-定時(shí)計(jì)數(shù)器1溢出標(biāo)志位
(為1溢出申請(qǐng)中斷。中斷方式硬件自動(dòng)清0,查詢方式需軟件清0)
TR1-定時(shí)計(jì)數(shù)器1運(yùn)行控制位
(若GATE==1且INT1為高電平,TR1為1運(yùn)行;若GATE==0,TR1為1運(yùn)行;TR1需軟件清0關(guān)閉)
TF0-定時(shí)計(jì)數(shù)器0溢出標(biāo)志位
(為1溢出申請(qǐng)中斷。中斷方式硬件自動(dòng)清0,查詢方式需軟件清0)
TR0-定時(shí)計(jì)數(shù)器0運(yùn)行控制位
(若GATE==1且INT0為高電平,TR0為1運(yùn)行;若GATE==0,TR0為1運(yùn)行;TR0需軟件清0關(guān)閉)
IE1-外部中斷1請(qǐng)求標(biāo)志
(為1表明正在向CPU申請(qǐng)中斷,CPU轉(zhuǎn)向中斷服務(wù)程序后,硬件清0)
IT1-外部中斷1觸發(fā)方式選擇位
(為1為跳變沿觸發(fā)方式(負(fù)跳變),為0為低電平觸發(fā)方式)
IE0-外部中斷0請(qǐng)求標(biāo)志
(為1表明正在向CPU申請(qǐng)中斷,CPU轉(zhuǎn)向中斷服務(wù)程序后,硬件清0)
IT0-外部中斷0觸發(fā)方式選擇位
(為1為跳變沿觸發(fā)方式(負(fù)跳變),為0為低電平觸發(fā)方式)
定時(shí)計(jì)數(shù)器應(yīng)用
題目:定時(shí)/計(jì)數(shù)器1做計(jì)數(shù)器1,工作模式2,使用定時(shí)/計(jì)數(shù)器0做定時(shí)器0讓LED小燈100毫秒閃爍一次,計(jì)數(shù)器1記錄LED閃爍次數(shù),并且用數(shù)碼管實(shí)時(shí)顯示計(jì)數(shù)數(shù)值。硬件需要將P1^0與P3^5連接起來(lái),使計(jì)數(shù)器得到觸發(fā)。
查詢方式
查詢方式就是利用計(jì)數(shù)器計(jì)數(shù)溢出會(huì)使相應(yīng)的溢出標(biāo)志位置1來(lái)進(jìn)行是否計(jì)數(shù)完成或計(jì)時(shí)完成。
1/*定時(shí)/計(jì)數(shù)器1做計(jì)數(shù)器1,工作模式2,使用定時(shí)器0讓LED小燈100毫秒閃爍一次,
2計(jì)數(shù)器1記錄LED閃爍次數(shù),并且用數(shù)碼管實(shí)時(shí)顯示計(jì)數(shù)數(shù)值。*/
3#include < reg52.h >
4#define uchar unsigned char
5#define uint unsigned int
6
7sbit we = P2^7;
8sbit du = P2^6;
9sbit LED = P1^0;
10
11uchar code leddata[]={
12
13 0x3F, //"0"
14 0x06, //"1"
15 0x5B, //"2"
16 0x4F, //"3"
17 0x66, //"4"
18 0x6D, //"5"
19 0x7D, //"6"
20 0x07, //"7"
21 0x7F, //"8"
22 0x6F, //"9"
23 0x77, //"A"
24 0x7C, //"B"
25 0x39, //"C"
26 0x5E, //"D"
27 0x79, //"E"
28 0x71, //"F"
29 0x76, //"H"
30 0x38, //"L"
31 0x37, //"n"
32 0x3E, //"u"
33 0x73, //"P"
34 0x5C, //"o"
35 0x40, //"-"
36 0x00, //熄滅
37 0x00 //自定義