定时器:计数信号来源(周期性)内部时钟脉冲;
计数器:计数信号来源(非周期性)外部输入信号。
16位 65535us
TH0 = 0xd8;或者 TH0 = (65535 - 10000) / 256;
TL0 = 0xef; 或者 TL0 = (65535 - 10000) % 256;
不能寻址:只能 一次性写给
中断号:
0 外部中断0:INT0
1 定时/计数器0:TF0
2 外部中断1:INT1
3 定时/计数器1:TF1
4 串口中断:R1/T1
利用定时/计数器T0的模式1实现间隔定时,每隔1秒L1指示灯闪烁一下,也就是点亮0.5秒,熄灭0.5秒;每隔10秒L8指示灯闪烁一下,即点亮5秒,熄灭5秒。
0.5S = 500ms (16位 65535us = 65.5ms)
定时一次50ms,定时10次。
#include "reg52.h"
sbit L1 = P0^0;
sbit L8 = P0^7;
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
void InitHC138()//选LED
{
HC138_C = 1;
HC138_B = 0;
HC138_A = 0;
}
//*****************************************************************
void InitTimer0()//初始化定时器0(中断)
{
TMOD = 0X01;
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;//定时50ms = 50000us
ET0 = 1;//打开定时器中断
EA = 1;//打开总中断
TR0 = 1;//启动定时器
}
unsigned char count = 0;
unsigned char count1 = 0;//设两个计数
void ServiceTimer0() interrupt 1//中断服务函数(中断号为1)
{
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;//没有自动重装功能,每次需赋初值
count++;//10次50ms
count1++;//100次50ms
if (count == 10)//0.5s = 500ms = 10*(50ms)定时10次
{
L1 = ~L1;
count = 0;
}
if (count1 == 100)//5s = 5000ms = 100*(50ms)定时100次
{
L8 = ~L8;
count1 = 0;
}
}
//*****************************************************************
void main()
{
InitHC138();
InitTimer0();
while(1)
{
}
}