一、定时器/计数器T0
1、定时器/计数器的相关寄存器
2、定时器/计数器控制寄存器TCON
TCON格式如下:
3、定时器/计数器工作模式寄存器TMOD
模式选择:
二、配置相关寄存器
1、使用STC-ISP工具
2、配置寄存器
设置定时器模式(16位定时器)
配寄存器推荐使用按位操作:
需要清零的位与等于0,不清零的位与等于1
需要置1的位或等于1,不需要置一的位或等于0
TMOD &= 0xF0; //清零低四位、高四位不变
TMOD |= 0x01; //低四位的bit0置1
设置定时器初值
TL0=0x00; //低八位、需要计算
TH0=0xDC; //高八位、需要计算
89C52的晶振频率是 11.0592MHz
机器周期 = 12 x 时钟周期 =12 x ( 1 / 时钟频率 ) s = 1.085us
在 TH0 和 TL0 寄存器中计数 , 最多能计数2^16= 65536 ,累计计时大约 71ms
如何算出 10ms 定时器的初值?
10ms需要数 9216 下,就配置寄存器从 65536-9126=56320 ( 16 进制表示为 0xDC00)开始计数。这样TL0=0x00 ; TH0=0xDC
清除TF0标志
TF0 = 0;
不使用中断时,必须软件清零
定时器0开始计时
TRO = 1;
三、定时器控制LED
#include "reg52.h"
sbit led = P3^6;
void delay10ms()
{
//1. 配置定时器0工作模式为16位计数
TMOD = 0x01;
//2. 定10ms的初值
TL0=0x00;
TH0=0xDC;
//3. 开始计时
TR0 = 1;
TF0 = 0;
}
void main()
{
int cnt = 0;
led = 1;
delay10ms();
while(1){
if(TF0 == 1)//当最高位产生溢出时,由硬件置1
{
TF0 = 0;//不使用中断时,必须软件清零
cnt++; //统计溢出的次数
//重新给初值
TL0=0x00;
TH0=0xDC;
if(cnt == 100){//当溢出100次,经过了1s
cnt = 0; //cnt重新计数
led = !led;//每经过1s,翻转led的状态
}
}
}
}
四、定时器中断方式控制
1、中断寄存器
EA :总中断允许控制位。EA=1,CPU开放中断
ET0:T0的溢出中断允许位。ET0=1,允许T0中断
硬件内部设计逻辑如下图:
2、定时器中断控制LED
定时器中断控制LED1每秒亮灭一次,主函数里LED2每300ms亮灭一次
#include "reg52.h"
sbit led1 = P3^6;
sbit led2 = P3^7;
int cnt = 0;
void Time0Init()
{
//1. 配置定时器0工作模式为16位
TMOD = 0x01;
//2. 定10ms的初值
TL0 = 0x00;
TH0 = 0xDC;
//3. 开始计时
TR0 = 1;
TF0 = 0;
//4. 打开定时器0中断
ET0 = 1;
//5. 打开总中断EA
EA = 1;
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
led1 = 1;
Time0Init();
while(1){
led2 = 0;
Delay300ms();
led2 = 1;
Delay300ms();
}
}
void Time0Handler() interrupt 1
{
cnt++; //统计溢出的次数
//重新给初值
TL0=0x00;
TH0=0xDC;
if(cnt == 100){ //当溢出100次,经过了1s
cnt = 0;
led1 = !led1; //每经过1s,翻转led的状态
}
}
上一篇:【51单片机STC89C52】HC-SR04超声波模块测距
下一篇:【汇编】AT89C52点亮一盏LED灯(汇编语言)