在學習定時/計數器之前,我們先了解一下在單片機中什么是定時/計數器。
在51單片機中有兩個定時/計數器T0和T1,在其增強型的52單片機中有三個定時/計數器T0、T1和T2。
定時/計數器系統是單片機內部的一個獨立的硬件系統,其與CPU和晶振通過內部連接相互作用。當CPU開啟其功能后,定時計數器便在晶振的作用下開始獨立工作。
定時/計數器本質上是一個16位加1計數器,由高8位(TH0或TH1)和低8位(TL0或TL1)兩個寄存器組成。但是由于累加是在晶振的驅動下,所以可以當做計時器。通過設置相應的寄存器可以選擇啟用其定時功能或者計數功能。當計數器溢出則溢出標志位置1。
在此介紹其兩個特殊功能寄存器:TMOD-定時計數器工作模式寄存器和TCON-定時/計數器控制寄存器。
TMOD-定時/計數器工作模式寄存器 (不可位尋址)
TMOD用來確定定時/計數器的工作方式及功能選擇。
GATE-門控制位
(若GATE為0,則定時/計數器啟動和暫停只與相應TCON寄存器中的運行控制位有關;若GATE為1,則定時計數器啟動和暫停由相應TCON寄存器中的運行控制位和外部中斷引腳上的電平狀態共同控制)
C/T'-定時器模式和計數器模式選擇位
(為0定時器模式,為1計數器模式)
M1、M2-工作方式選擇位
工作方式1:THx和TLx兩個8位寄存器組合構成一個16位定時/計數器。THx存放高8位,TLx存放低8位。
工作方式2:THx存放初值,待TLx累加溢出時,THx內的初值自動重裝入TLx開始累加,循環往復。
介紹了應用較多兩種工作方式。
定時器的計算
定時/計數器本質上是一個16位加1計數器,在晶振的驅動下,每過一個機器周期(12個時鐘周期)就自行加1。因此加1則意味著時間過了12/fs,其中f為晶振頻率。假如我們應用定時器模式工作方式1。此模式下定時最長時間為((2^16-1)x12/f)s。本開發板上晶振為11.0592MHz,則最長定時時間約為71ms。所以當定時時間大于71ms時,我們可以迭代使其達到。
假如我們要定時100ms,我們可以定時50ms,再迭代2次。定時50ms要重裝初值,假如用T0。定時50ms約需要累加(0.05s/(12/f))=46083次。故需要將(65535-46083)=19452(0x4bfc)裝入TH0和TL0中。
TCON-定時/計數器控制寄存器 (可位尋址)
TF1-定時計數器1溢出標志位
(為1溢出申請中斷。中斷方式硬件自動清0,查詢方式需軟件清0)
TR1-定時計數器1運行控制位
(若GATE==1且INT1為高電平,TR1為1運行;若GATE==0,TR1為1運行;TR1需軟件清0關閉)
TF0-定時計數器0溢出標志位
(為1溢出申請中斷。中斷方式硬件自動清0,查詢方式需軟件清0)
TR0-定時計數器0運行控制位
(若GATE==1且INT0為高電平,TR0為1運行;若GATE==0,TR0為1運行;TR0需軟件清0關閉)
IE1-外部中斷1請求標志
(為1表明正在向CPU申請中斷,CPU轉向中斷服務程序后,硬件清0)
IT1-外部中斷1觸發方式選擇位
(為1為跳變沿觸發方式(負跳變),為0為低電平觸發方式)
IE0-外部中斷0請求標志
(為1表明正在向CPU申請中斷,CPU轉向中斷服務程序后,硬件清0)
IT0-外部中斷0觸發方式選擇位
(為1為跳變沿觸發方式(負跳變),為0為低電平觸發方式)
定時計數器應用
題目:定時/計數器1做計數器1,工作模式2,使用定時/計數器0做定時器0讓LED小燈100毫秒閃爍一次,計數器1記錄LED閃爍次數,并且用數碼管實時顯示計數數值。硬件需要將P1^0與P3^5連接起來,使計數器得到觸發。
查詢方式
查詢方式就是利用計數器計數溢出會使相應的溢出標志位置1來進行是否計數完成或計時完成。
1/*定時/計數器1做計數器1,工作模式2,使用定時器0讓LED小燈100毫秒閃爍一次,
2計數器1記錄LED閃爍次數,并且用數碼管實時顯示計數數值。*/
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 //自定義