《单片机定时器总结》—用最简洁的方式学会51单片机定时器。

☺定时器中断是单片机最重要的一个功能,一开始学的时候遇到了不少的问题,通过不断地学习解决了不少问题,其实学会之后也没有什么。在这里我整理了一下定时器的使用,就用51单片机来举例。像别的STC15等系列的单片机其实原理上差不多的,分享给大家希望能帮助大家。
定时器小练习: 《51单片机定时器小练习》—利用定时器实现方波发生器
.

定时器相关寄存器

  • 中断允许寄存器IE在这里插入图片描述

1.EA:cpu总中断允许控制位。EA=1,cpu开放中断。
2.ET0/ET1:定时器T0和定时器T1溢出中断允许位。ET0/ET1=1;允许中断。
3.EX0/EX1:外部中断0和外部中断1中断允许位。EX0/ET1=1;允许中断。

  • 控制寄存器TCON
    在这里插入图片描述

TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’,此时向CPU请求中断,一直保持到CPU响应中断时,才由硬件清‘0’。(TF1也可以由程序查询清“0”)

TR1:定时器T1的运行控制位,该位是由软件置位和清零。当GATE=0,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE=1,TR1=1且外部中断1输入位高电平时,才允许T1计数。

TF0:定时器/计数器T0溢出标志。T0被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’,此时向CPU请求中断,一直保持到CPU响应中断时,才由硬件清‘0’。(TF0也可以由程序查询清“0”)

TR0:定时器T0的运行控制位,该位是由软件置位和清零。当GATE=0,TR0=0时就允许T0开始计数,TR0=0时禁止T0计数。当GATE=1,TR0=1且外部中断0输入位高电平时,才允许T0计数。

  • TMOD寄存器
    在这里插入图片描述

其中低四位定义定时器/计数器T0,高四位定义定时器/计数器T1。

GATE——门控制。 GATE=1时,由外部中断引脚INT0、INT1和控制寄存器的TR0,TR1来启动定时器。

GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 Ⅱ,C/T——功能选择位

M0、M1——方式选择功能

由于有2位,因此有4种工作方式

M1M0 工作方式 计数器模式 TMOD(设置定时器模式)

0 0 方式0 13位计数器 TMOD=0x00

0 1 方式1 16位计数器 TMOD=0x01

1 0 方式2 自动重装8位计数器 TMOD=0x02

1 1 方式3 T0分为2个8位计数器,T1为波特率发生器 TMOD=0x03

定时器工作方式介绍

方式0:M1=0,M0=0 ,13位定时器/计数器

方式1:M1=0,M0=1 ,16位定时器/计数器

方式2:M1=1,M0=0 ,8位自动重载定时器

方式3:M1=0,M0=0 ,双8位定时器/计数器

定时器的初始值的计算

首先要明白单片机的机器周期,关于机器周期的介绍如下。
在这里插入图片描述
我们以单片机的晶振是12MHz为例,假设你要定时1ms,采用定时器0,方式1时,此时为16位定时,16位最大值为2的16次方,也就是65536。
由于12MHz的单片机其机器周期为1us。由于1ms=1000us。所以初始值的大小x=65536-1000=64536.然后把64536转换成16进制.
在这里插入图片描述
该定时器的初始化代码则为:

void Time0Init()
{
	TMOD=0X01;//设置定时器0方式为1.
	TL0 = 0x18;	//设置定时初值低四位
	TH0 = 0xFC;	//设置定时初值高四位
	TF0 = 0;
	TR0 = 1;
}

在这里给大家分享一款定时器计算的的小工具。
链接: 百度网盘.
提取码:gtgm
在这里插入图片描述

定时器中断的使用。

功能:使用定时器0计数,使led灯每隔一秒反转一次。
原理图:
在这里插入图片描述
程序:

#include"reg51.h"
sbit led=P1^0;
void Time0Init();
unsigned int tt;
int main()
{
	Time0Init();
	while(1);
}

void Time0Init()
{
	TMOD=0X01;
	TL0 = 0x18;	//设置定时初值
	TH0 = 0xFC;
	TF0 = 0;	
	TR0 = 1;
	ET0=1;//打开定时器中断
	EA=1;//打开总中断
}
void Time0() interrupt 1
{
	TL0 = 0x18;	//由于定时器工作方式选择的时16位。没有自动重载功能,所以每次溢出之后要手动进行一次初始化。
	TH0 = 0xFC;
	tt++;
	if(tt==1000)
	{
		tt=0;
		led=~led;
	}
}
发布了8 篇原创文章 · 获赞 13 · 访问量 1984

猜你喜欢

转载自blog.csdn.net/qq_46292418/article/details/105202596