51單片機(jī)(三)——定時(shí)器/計(jì)數(shù)器
掃描二維碼
隨時(shí)隨地手機(jī)看文章
51單片機(jī)有兩個(gè)內(nèi)置定時(shí)器/計(jì)數(shù)器。
當(dāng)記數(shù)脈沖來(lái)自于外部輸入時(shí),為計(jì)算器。而來(lái)自于系統(tǒng)時(shí)鐘時(shí),為定時(shí)器。
定時(shí)器0有四種模式。定時(shí)器1支持三種模式,可以被用來(lái)產(chǎn)生波特率。
PCON寄存器里的SMOD0位表示每12時(shí)鐘或者每6時(shí)鐘產(chǎn)生一次計(jì)數(shù)脈沖。
bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
TF0和TF1為定時(shí)器溢出位、TR0和TR1為運(yùn)行控制位、其他位用于外部中斷。
TR0和TR1:
分別控制定時(shí)器0和1的運(yùn)行,該位置1時(shí)才允許定時(shí)器計(jì)數(shù),清0時(shí)停止計(jì)數(shù)。
TF0和TF1
定時(shí)器溢出后自動(dòng)置1,在系統(tǒng)響應(yīng)定時(shí)器中斷后清0,也可以由軟件手工清0。
bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
高四位用于控制定時(shí)器1,低四位用于控制定時(shí)器0
GATE:
該位置1時(shí),定時(shí)器的運(yùn)行有額外的條件,當(dāng)外部中斷輸入引腳為為高電平時(shí),才能繼續(xù)計(jì)數(shù)。
C/T:
該位置1時(shí),T0和T1做計(jì)數(shù)器用。置0時(shí),做定時(shí)器。
M1、M0:
用于指定定時(shí)器工作模式。
M1 = 0;M0 = 0;時(shí),定時(shí)器運(yùn)行模式為0,此模式是為了兼容8048單片機(jī)。
M1 = 0;M0 = 1;時(shí),定時(shí)器運(yùn)行模式為1,16位定時(shí)器。
M1 = 1;M0 = 0;時(shí),定時(shí)器運(yùn)行模式為1,8位自動(dòng)重裝定時(shí)器。
M1 = 1;M0 = 1;時(shí),定時(shí)器運(yùn)行模式為1,雙8位定時(shí)器,定時(shí)器1不支持此模式。
1.4 計(jì)算定時(shí)時(shí)長(zhǎng)假設(shè)當(dāng)前設(shè)置為12系統(tǒng)時(shí)鐘產(chǎn)生一個(gè)計(jì)數(shù)脈沖。
8位定時(shí)器從運(yùn)行到溢出的時(shí)間為(系統(tǒng)時(shí)鐘 X 12)X(256 - 定時(shí)器初值)。
16位定時(shí)器從運(yùn)行到溢出的時(shí)間為 (系統(tǒng)時(shí)鐘 X 12) X (65536 - 定時(shí)器初值)。
波特率為定時(shí)器1的溢出速率/32。
二、編程示例2.1 定時(shí)一秒#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;
...
}