单片机基础(六):单片机定时/控制器的控制接口

单片机定时/控制器的控制接口

定时/计数器编程的 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

原文地址:https://www.cnblogs.com/kafm/p/12721823.html