定时器
定时器原理
定时器的本质就是:每经过一个机器周期,加1
当晶振频率为11.0592MHz时,就等于11059200Hz
机器周期 = 12 * 时钟周期 = 12 * (1/时钟频率)秒 = 12 / 11059200 秒 = 1.085微秒
定时器编程
TF0:T0产生溢出时,硬件置1
TR0:定时器T0的运行控制位,由软件置0
想要特定时间比如1ms,可以从一个时间值开始,通过累加到爆表
想要特定大的时间,可以通过累加比如1ms,从而获得
#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)//当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成1
{
TF0 = 0;//不用中断,必须软件清零
cnt++; //统计爆表的次数
//重新给初值
TL0=0x00;
TH0=0xDC;
if(cnt == 100){//爆表100次,经过了1s
cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
led = !led;//每经过1s,翻转led的状态
}
}
}
}
中断
CPU
能响应定时器
0
中断的条件:需要配置
IE
寄存器的
bit1: ET0 bit7:EA
1. ET0
中断允许要置一
ET0 = 1
2. EA
总中断要置一
EA = 1
#include "reg52.h"
sbit led = P3^6;
sbit led1 = 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()
{
led = 1;
Time0Init();
while(1){
led1 = 0;
Delay300ms();
led1 = 1;
Delay300ms();
}
}
void Time0Handler() interrupt 1
{
cnt++; //统计爆表的次数
//重新给初值
TL0=0x00;
TH0=0xDC;
if(cnt == 100){//爆表100次,经过了1s
cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
led = !led;//每经过1s,翻转led的状态
}
}