定時(shí)工作方式2實(shí)現(xiàn)1s定時(shí)
定時(shí)器的幾種工作方式中,除0和前面的1類似都需要初始化計(jì)數(shù)值,然后開(kāi)始計(jì)數(shù),計(jì)數(shù)溢出后,需要再次控制計(jì)數(shù)的初值,但工作模式2不同于此,工作方式2將THx和TLx分開(kāi)處理,將初值存放在THx中,計(jì)數(shù)時(shí)只處理TLx的8位,所以計(jì)數(shù)最大值為2^8=256,方式2的另一個(gè)特點(diǎn)是,當(dāng)計(jì)數(shù)溢出后,不需要控制初值,而是會(huì)自動(dòng)將THx中的值做為計(jì)數(shù)初值重新開(kāi)始計(jì)數(shù)。用工作方式2,實(shí)現(xiàn)1s延時(shí)程序如下:
查詢方式
#include
sbit LED = P0^2;
unsigned int vT = 0;
void main()
{
LED = 0; // 初始亮燈
TMOD = 0x02; // 工作模式2 最大計(jì)數(shù)值256
TH0 = 0x06; // 從6開(kāi)始 256-6=250 * 1us = 0.25ms
TL0 = 0x06;
TR0 = 1; // 啟動(dòng)定時(shí)器0
while(1)
{
if (TF0 == 1) // 如果定時(shí)器計(jì)數(shù)溢出
{
TF0 = 0;
vT++;
if (vT == 4000) // 0.25ms * 4000 = 1000ms = 1s
{
LED = !LED;
vT = 0;
}
}
}
}
中斷方式
#include
sbit LED = P0^2;
unsigned int vT = 0;
void main()
{
LED = 0; // 初始亮
TMOD = 0x02; // 模式2
TH0 = 0x06; // 256-6=250 * 1us = 0.25ms
TL0 = 0x06;
ET0 = 1; // 定時(shí)器0中斷開(kāi)啟
EA = 1; // 總中斷開(kāi)
TR0 = 1; // 定時(shí)器0開(kāi)啟
while(1);
}
void MyInterrupt(void) interrupt 1 // 中斷服務(wù)程序
{
vT++;
if (vT == 4000) // 4000*0.25ms=1000ms=1s
{
LED = !LED;
vT = 0;
}
}