我是靠谱客的博主 如意树叶,最近开发中收集的这篇文章主要介绍MCS-51单片机总结——No1.定时器/计数器应用8051单片机定时器/计数器的基本知识,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

8051单片机定时器/计数器的基本知识

概述:

51单片机内部集成了两个16位定时/计数器T0和T1,他们可以单独配置为定时器或计数器。
当它们被配置为定时器时,将按照预先设置好的长度运行一段时间后产生一个溢出中断;
当他们被配置为计数器时,在单片机的外部中断引脚上检测到一个脉冲信号后计数器将加1,如果达到预先设置好的事件数目,就将产生一个中断事件。
处于计数工作模式时, 加法计数器对芯片端子T0(P3.4)或T1(P3.5)上的输入脉冲进行计数;
处于定时器工作模式时,加法计数器对内部机器周期脉冲进行计数。

相关寄存器:

工作方式寄存器:TMOD(地址:0x89)

TMOD不支持位寻址,当单片机初始化后,TMOD的值为0x00。
TMOD的结构:

bitbit7bit6bit5bit4bit3bit2bit1bit0
nameGATEC/ T ‾ overline{T} TM1M0GATEC/ T ‾ overline{T} TM1M0

其中bit0-bit3对定时器0进行配置,bit4-bit7对定时器1进行配置
GATE位:定时/计数器的门控位
GATE=0时,定时/计数器的运行只受到控制寄存器TCON中的运行控制位TRx控制;
GATE=1时,定时/计数器的运行收到TRx和外部中断输入引脚上的电平双重控制。也就是定时器的启动由TRx和INTx共同控制,即TRx=1&&INTx=1时,定时/计数器方可运行。
C/ T ‾ overline{T} T位:定时方式、计数方式选择位
C/ T ‾ overline{T} T=0时,工作在计数状态下;
C/ T ‾ overline{T} T=1时,工作在定时状态下。

定时器/计数器0与定时器/计数器1只在工作方式选择位上有所差别,差别在定时器/计数器0有工作方式3,定时器/计数器1没有工作方式3,当定时器/计数器1的工作方式选择位配置为工作方式3时,定时器/计数器1停止工作。

M1M0工作方式含义
00013bit不带自动重装的计数器
01116bit不带自动重装的计数器
102自动重装的8bit计数器
113独立的两个8bit计数器

在工作方式2中,数据寄存器THx作为自动重装值自动赋值给数据寄存器TLx。

控制寄存器:TCON(地址:0x88)

TCON支持位寻址,用于控制定时器/计数器的启动与溢出。当单片机初始化后,TMOD的值为0x00。

TCON的结构:

bitbit7bit6bit5bit4bit3bit2bit1bit0
nameTF1TR1TF0TR0IE1IT1IE0IT0

TFx为定时器/计数器的溢出标志位。该位置位则说明单片机检测到了定时器/计数器的溢出,并且PC自动跳转到该中断向量入口,当单片机响应中断后,该位被硬件自动清除。该位由硬件写操作,软件读操作。
TRx为定时器/计数器启动控制位,当该位被置位时,启动定时器/计数器。该位由软件写操作,硬件读操作。
TCON的bit0-bit3为外部中断控制位。
T0数据寄存器:TH0、TL0
T1数据寄存器:TH1、TL1

关于数据寄存器的赋值:

1个计数周期等于1个机器周期
1个机器周期等于12个时钟周期
MCU主频: f o s c f_{osc} fosc
MCU计数周期: T c y T_{cy} Tcy
预设时间:t
定时器/计数器需要运行的次数:num

T c y T_{cy} Tcy= 12 f o s c frac{12}{f_{osc}} fosc12,num= t T c y frac{t}{T_{cy}} Tcyt= t ∗ f o s c 12 frac{t*f_{osc}}{12} 12tfosc

相关应用实例:
实例1:
定时器波形发生器

#include <AT89X52.h>

sbit Signal = P2 ^ 0;
//初始化定时计数器控制寄存器

Timer0_int(void) interrupt 1  using 1  	//定时器0中断服务子程序
{
	Signal = ~Signal;				    //P1.7引脚翻转
	TH0 = 0x1F;
	TL0 = 0x08;					        //重装初始化值
}

void main()																			  
{
  	TMOD = 0x00;						//定时/计数器的方式和控制寄存器
  										//不受外部中断控制,选择方式0:13bit定时/计数器,工作在定时方式
  	EA = 1;								//中断允许控制寄存器IE中的第7位bit7:EA中断允许总控制
  	ET0 = 1;							//中断允许控制寄存器IE中的第1位bit1:ET0定时器/计数器T0的溢出中断允许位
  	TH0 = 0x1F;							//这里是高8位与低5位:0001 1111	xxxx0 1000
  	TL0 = 0x08;					        //装入初始化值
  	TR0 = 1;
  	while(1)
  	{
  	}
}

实例2:

#include <AT89X52.h>
sbit Signal = P2 ^ 0;
//初始控制寄存器
//TL0中断服务子函数,使用通用工作寄存器组1
void Timer0(void) interrupt 1 using 1
{
	Signal = 0;
	TR0 = 0;						//停止定时器TL0
	TL0 = 0xCE;
}
//TH0中断服务子函数,占用定时计数器1的中断向量,使用通用工作寄存器组2
void Timer1(void) interrupt 3 using 2
{
	Signal = 1;
	TR0 = 1;						//启动定时器TL0
	TH0 = 0x38;							
}
main()
{
  	TMOD = 0x03;					//定时/计数器的方式和控制寄存器TMOD
  									//0000 0011 定时器1工作在模式0、定时器0工作在模式3 ,它们都工作在定时模式
  	EA = 1;
  	ET0 = 1;
  	ET1 = 1;
  	TH0 = 0x38;
  	TL0 = 0xCE;
  	Signal = 1;
  	TR0 = 1;
  	TR1 = 1;						//启动两个定时器
  	while(1)
  	{
  	}
}

实例3:
计数器模拟外部中断

#include <AT89X52.h>

sbit LED1 = P2^0;                               //外部LED驱动引脚定义

void Timer0(void) interrupt 1  using 1          //定时计数器0中断处理函数
{
   LED1 = ~LED1;                                //如果有中断,LED翻转
}

main()
{
  	TMOD = 0x06;								//定时/计数器的方式和控制寄存器
  												//0000 0110 定时计数器0 工作方式2 计数模式
  	TH0 = 0xFD;
  	TL0 = 0xFD;
 	EA = 1;                       
  	ET0 = 1;                     				//打开相应中断
  	TR0 = 1;
  	while(1)
  	{
  	}
}

最后

以上就是如意树叶为你收集整理的MCS-51单片机总结——No1.定时器/计数器应用8051单片机定时器/计数器的基本知识的全部内容,希望文章能够帮你解决MCS-51单片机总结——No1.定时器/计数器应用8051单片机定时器/计数器的基本知识所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部