(以51单片机为例)
晶振—>定时器周期—>机器周期
晶振:11.592MHZ
定时器周期=1/11.592MHZ = 0.09(us)
机器周期=12或6个定时器周期(看芯片手册),以12为例,机器周期=定时器周期*12=1.08(us)
单片机以机器周期为最小单位来工作
一个机器周期完成机器会计“1”
定时器的工作原理:通过机器周期来数数,一个机器周期计“1”耗时1.08us
定时器寄存器:
主要关注位:起始位,溢出标志位,定时器(0/1/2),工作模式
起始位(TL0;TH0):用于告诉单片机开始数数了
溢出标志位(TF0):用于告诉单片机,数完一轮了
定时器:选择哪个定时器来工作
工作模式(TMOD):用多少位来计算,例如两位就是数4下(00,01,10,11),一般用8位或者16位,以八位位基础,16位计数的话有低八位和高八位
以16位计数为例
2的16次方=65536
机器周期计数一次花费时间1.08us,
1.08*65536可算出这个寄存器跑一轮花费时间70ms
配置流程:
选择定时器
选择工作模式
开始位,给初值(高八位,低八位)
溢出标志位
溢出之后的动作
示例代码:
#include "reg52.h"
sbit led = P3^6;
void main()
{
int cnt = 0;
led = 1;
//1. 配置定时器0工作模式位16位计时
TMOD = 0x01;
//2. 给初值,定一个10ms出来
TL0=0x00;//TL0中的0代表第0个定时器,以下同此
TH0=0xDC;
//3. 开始计时
TR0 = 1;//该位置1才能开始计时
TF0 = 0;
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的状态
}
}
}
}