单片机定时/控制器的控制接口
定时/计数器编程的 5 个步骤
1.根据需求选择工作方式,确定方式控制字,写入TMOD寄存器
2.计算定时/计数器的计数值,求计数初值,写入初值寄存器
3.根据需要,开放定时/计数器的中断选项
4.设置定时/计数器控制寄存器TCON,启动定时器
5.等待定时时间到,用查询或中断方式作相应处理
定时/计数器的应用举例
利用定时器产生周期性动作的基本思想:
- 产生周期性的定时
- 定时时间到做相应处理
如 设系统时钟频率为12MHz,要求用定时/计数器T0实现从P1.0输出周期为500μs的方形波(即周期性高低电平切换)
分析:
从P1.0输出周期为500μs的方波,只需P1.0每250μs取反一次即可
当系统时钟为12MHz,振荡频率为(1/12M)s,即(1/12)μs,一个机器周期为12个振荡周期,所以一个机器周期为1μs,即计数一次为1μs,则计数值为250,选择计数方式2,计数初值为方式2的 256 - 250 = 6
工作方式2,方式控制字0x02,计数初值6,TH0 = TL0 = 0x06
代码实现
查询法:时刻查询TF的状态并在溢出时做处理
/*
*12MHz的晶振 使P1.0端口输出周期为500μs的方波
*/
#include<reg52.h>
sbit P1_0 = P1^0;
void main(){
TMOD = 0x02;
TH0 = TL0 = 0x06;
TR0 = 1;
for(;;){
if(TF0){//查询溢出状态
TF0 = 0; //归位
P1_0 = ~P1_0; //处理
}
}
}
中断法:溢出状态触发中断,并使用中断服务处理溢出
#include<reg52.h>
sbit P1_0 = P1^0;
void main(){
TMOD = 0x02;
TH0 = TL0 = 0x06;
EA = 1;//
ET0 = 1;//中断控制,详见该系列博客中断篇
TR0 = 1;
while(1);//使程序一直执行
}
//中断服务程序
void time0_int(void) interrupt 1 {
P1_0 = !P1_0;
}
长时间定时
一般晶振频率都以MHz为单位,机器周期就以μs为单位,这样短的周期有时无法满足需求,但我们可以用编程手段实现更长时间的计时,比如设置计数变量,每计时100μs就让计数变量加一,计数变量达到10000时就实现了1s单位的计时,这样就可以灵活适应需要
2019/3/3