4.定时器

原理

  1. 时钟源:定时器是内部时钟源(晶振),计数器是外部
  2. 计时长度:对应TH TL计数器初值寄存器(高八位,低八位)
  3. 对应的中断触发函数
中断源中断处理函数
Timer0Timer0_Routine(void) interrupt 1
Timer1Timer1_Routine(void) interrupt 3
Timer2Timer2_Routine(void) interrupt 5

相关寄存器

TCON:定时器控制寄存器

只需用到:TF0、TF1、TR0、TR1

定时器/计数器

定时器/计数器运行控制位(代码):TR0、TR1

中断触发标志位(内部):TF0、TF1

定时器中断分析

TMOD:定时器模式寄存器

两个定时器/计数器(任选一个即可):T0(TL0\TH0)T1(TL1\TH1)

工作模式:

  • 模式0(13位定时器/计数器)
  • 模式1(16位定时器/计数器)
  • 模式2(8位自动重装初值)
  • 模式3(两个8位定时器/计数器)

我们学的是定时器,计数器是外部计数,则0.7、0.3地址是计数器的置0,C/T:置0为定时器,模式(M1、M0)这里我们选01(16位定时器,不自动重装初值)

如果不会自动重装载寄存器(不会自动赋初值)则要触发中断处理函数时重新手动赋初值

工作模式

定时器计算初值

TL0\TH0、TL1\TH1

需要定时的时间带入公式,求出x
初值计算方式

中断允许寄存器

    总中断允许控制位:EA

    ET0:定时/计数器T0的溢出中断允许位,ET1:定时/计数器T1的溢出中断允许位,ET2:定时/计数器T2的溢出中断允许位

    需要外部、定时器、串口那个则赋值那个为1

允许寄存器分析

代码编写

每1s翻转LED灯状态

  • 模式选择(定时器0;工作模式1)
  • 定时器初值(10ms)
  • 打开定时器T0运行控制位
  • 打开定时器0中断允许位
  • 打开总中断允许控制位
  • 编写中断服务函数
  • 当溢出时,触发中断,执行中断函数,执行完之后,回到主函数继续执行
#include <reg52.h>
sbit LED1 = P1^0;		//定义LED灯
int count;			//由于51单片机没办法定时1s,只能通过计数达到效果
void main()
{
	TMOD = 0x01;		//配置定时器工作模式:使用定时器0,使用16位定时器模式(不自动重装初值)
	//定时10ms,给寄存器赋初值
	TL0 = 0x00;
	TH0 = 0xDC;
	TR0 = 1;		//打开定时器T0运行控制位
	ET0 = 1;		//打开定时器0中断允许位
	EA = 1;			//打开总中断允许控制位
	while(1)
	{
		//大于99时则取反LED状态
		if(count > 99)
		{
			count = 0;
			LED1 = ~LED1;
		}
	}
}
//定时中断处理函数
Timer0_Routine(void)      interrupt 1
{
	//触发中断函数,需要重新给定时器赋初值
	TL0 = 0x00;
	TH0 = 0xDC;
	count++;
}

效果展示:

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星仔_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值