定时器/计数器

*觉得有用有帮助的评论下,谢谢~

定时器/计数器

  • 定时器/计数器 和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。

工作原理

  • 定时器/计数器 实质上是一个 加1计数器。它随着计数器的输入脉冲进行加1,当计数器发生溢出时,则向CPU发出中断请求,如果是定时模式,则表示定时时间已到,计数模式,则表示所计数值已满。

结构

它由高8位和低8位两个寄存器THxTLx 组成。

TMOD是定时器/计数器的工作方式寄存器,即控制它的工作方式。

TCON是控制T0/T1的启动停止设置溢出标志

控制

  • 两个特殊功能寄存器

1、工作方式寄存器TMOD

注:TOMD不可位寻址

  • ①GATE :门控位,GATE=0 时,只需要TR0/TR11,就可使定时器/计数器工作;GATE=1 时,不仅要满足TR0/TR11 ,同时还需外部中断引脚 INT0/1 也为高电平,才能启动定时器/计数器工作。
  • ②C/T :定时/计数模式选择位。C/T=0 为定时模式;C/T=1 为计数模式。
  • ③M0M1 :工作方式设置位。
M1M0 工作方式 功能说明
00 方式0 兼容8048单片机的13位定时器,THx的8位和TLx的5位组成一个13位定时器。
01 方式1 THx和TLx组成的一个16位定时器/计数器
10 方式2 自动重装初值的8位定时器/计数器
10 方式3 定时器0:分成两个8位定时器/计数器。
定时器1:停止计数

2、控制寄存器TCON

  • 这些位在上次的中断系统中有写

工作方式

1、方式0

  • 由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

  • 这个模式51单片机一般很少用

2、方式1

由TL0作为低8位,TH0作为高8位,组成了16位加1计数器

计数范围是0~65535 ,溢出后,只要不重新赋值,则从0开始计数

3、方式2

  • 只有TLx做加1计数,计数范围是0~255 ,THx的值并不发生变化,而是保持原值,TLx溢出后,TFx就直接置1了,并且THx原先的值直接赋给TLx,然后TLx从新赋值的这个数字开始计数。(该功能可以用来产生串口的通信波特率,即适合做脉冲信号发生器)

4、方式3

  • 只适用于定时器/计数器T0,定时器T1处于方式3相当于TR1=0 ,停止计数

使用

  • 设置特殊功能寄存器TMOD,配置好工作模式
  • 设置计数寄存器THx和TLx的初值(初值之类的直接用软件计算吧)
  • 设置TCON,通过TRx置1来让定时器开始计数,还有中断开关EAETx
  • 判断TCON寄存器的TFx位,监测定时器溢出情况。

定时器0程序

#include "reg52.h"

typedef unsigned int u16;

sbit led=P2^0;	 //定义P20口是led

void Timer0Init()
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。(不影响其它位)TMOD=TMOD|0X01
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器			
}

void main()
{	
	Timer0Init();  //定时器0初始化
	while(1);		
}

void Timer0() interrupt 1   //定时器0中断程序
{
	static u16 i;//设置一个静态全局变量
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;
	i++;
	if(i==1000)
	{
		i=0;
		led=~led;	
	}	
}
  • 在51单片机中,应用较多的是方式1方式2,而要注意到是方式1在使用时,一定要记得重装初值 ,我刚开始时就是忘记重装初值,程序的效果老是不对

完成~

猜你喜欢

转载自blog.csdn.net/weixin_43616727/article/details/84339517