51單片機有兩個內置定時器/計數器。
當記數脈沖來自于外部輸入時,為計算器。而來自于系統(tǒng)時鐘時,為定時器。
定時器0有四種模式。定時器1支持三種模式,可以被用來產生波特率。
PCON寄存器里的SMOD0位表示每12時鐘或者每6時鐘產生一次計數脈沖。
bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
TF0和TF1為定時器溢出位、TR0和TR1為運行控制位、其他位用于外部中斷。
TR0和TR1:
分別控制定時器0和1的運行,該位置1時才允許定時器計數,清0時停止計數。
TF0和TF1
定時器溢出后自動置1,在系統(tǒng)響應定時器中斷后清0,也可以由軟件手工清0。
bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
高四位用于控制定時器1,低四位用于控制定時器0
GATE:
該位置1時,定時器的運行有額外的條件,當外部中斷輸入引腳為為高電平時,才能繼續(xù)計數。
C/T:
該位置1時,T0和T1做計數器用。置0時,做定時器。
M1、M0:
用于指定定時器工作模式。
M1 = 0;M0 = 0;時,定時器運行模式為0,此模式是為了兼容8048單片機。
M1 = 0;M0 = 1;時,定時器運行模式為1,16位定時器。
M1 = 1;M0 = 0;時,定時器運行模式為1,8位自動重裝定時器。
M1 = 1;M0 = 1;時,定時器運行模式為1,雙8位定時器,定時器1不支持此模式。
1.4 計算定時時長假設當前設置為12系統(tǒng)時鐘產生一個計數脈沖。
8位定時器從運行到溢出的時間為(系統(tǒng)時鐘 X 12)X(256 - 定時器初值)。
16位定時器從運行到溢出的時間為 (系統(tǒng)時鐘 X 12) X (65536 - 定時器初值)。
波特率為定時器1的溢出速率/32。
二、編程示例2.1 定時一秒#include <8051.h>
#define FOSC 12000000L
#define T50MS (65536-FOSC/12/20000)
volatile unsigned char count = 0;
void timer0_isr __interrupt (1)
{
TL0 = T50MS;
TH0 = T50MS>>8;
if (count-- == 0) {
count == 20;
P1 = ~P1;
}
}
void main()
{
TMOD = 0x01;
TL0 = T50MS;
TH0 = T50MS >> 8;
TR0 = 1;
ET0 = 1;
EA = 1;
while(1);
}
#include <8051.h>
#define FOSC 12000000L
#define BAUD 9600
void uart_init(void)
{
...
TL1 = (65536-(FOSC/384/BAUD));
TH1 = (65536-(FOSC/384/BAUD)) >> 8;
...
}