51单片机定时器/计数器(定时器中断)

article/2025/10/10 19:32:15

51单片机定时器/计数器(中断系统:定时器中断)

实现功能

通过定时器终端控制LED灯 D1 间隔一秒闪烁

单片机型号:STC89C52

定时器介绍

1、51单片机定时器原理

在这里插入图片描述

定时器实质上就是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到定数器满时,再输入一个脉冲就使定时器回零,且定时器的溢出使相应的中断标志位置1,向CPU发出中断请求。如果定时器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

定时器由高8位和低8位两个寄存器 TH0/TH1和TL0/TH1 组成。

51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 是定时器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

2、工作方式寄存器 TMOD

在这里插入图片描述

51单片机有两个定时器,所以 TMOD 里面有两组。

GATE:是门控位, 一般默认GATE=0

C/T :定时/计数模式选择位。低电平为定时模式;高电平为计数模式。

M1 M0:工作方式设置位。定时/计数器有四种工作方式。

在这里插入图片描述

方式0

13位定时/计数器,由 TL0 的低5位(高3位未用)和 TH0 的8位组成。如果TL0 的低5位溢出会向 TH0 进位,TH0 溢出时,置位 TCON 中的 TF0 标志,向CPU发出中断请求。**(这里不自动重装载,所以在中断处理函数中需要重新赋值 TH0 和 TL0) **

在这里插入图片描述

方式1

16位定时/计数器,由 TL0 作为低8位,TH0 作为高8位,组成了16位加1计数器 。(这里不自动重装载,所以在中断处理函数中需要重新赋值TH0和TL0)

在这里插入图片描述

方式2

自动重装初值的8位计数方式。(这里自动重装载,所以在中断处理函数中不需要重新赋值TH0和TL0)

在这里插入图片描述

方式3

在这里插入图片描述

3、控制寄存器 TCON

在这里插入图片描述

TF1:T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

TR1:T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

TF0:T0溢出中断请求标志位,其功能与TF1类同。

TR0:T0运行控制位,其功能与TR1类同。

4、计数器初值计算

初值的计算与外部晶振有关,一般是12MHZ或者11.056MHZ。
计数器是每次到溢出了才会中断,所以要找到初值,保证初值到溢出的时间为你想定时的时间,即:溢出数字 - 初值 = 定时时间
如果用定时器 T0,并采用方式1(16位定时/计数器),定时1ms的初值是多少?
因为方式一16位定时器,所以最多可以计数到 216-1=65525;1ms/1us=1000,所以初值=65535-1000+1=64536=FC18
可以这样赋值:
TH0=0xFC
TL0=0x18;

如果定时的时间非常大,寄存器无法存储下时,例如1s,可以用一个循环,定时1ms,将定时的1ms循环1000遍就是1s了

硬件原理

在这里插入图片描述

中断系统就是当系统在进行一项工作时,需要终止这项工作,转而去执行另一项工作,当执行完成后再接着执行第一项工作。

如上图,STC89C52有两个外部中断(INT0INT1)、两个定时器中断(T0T1)、一个串口中断(RX/TX

以定时器中断 T0 讲解,T1 同理。

定时器中断 T0 中的 ET0T0 的中断允许,将其赋值为 1 ,则可以开启 T0 的中断允许。EA 是总中断 ,只有将其打开才能允许终端。IP 是控制终端的优先级的,这里不做介绍,使用默认优先级。T0 的管脚连在 P3^4T1 的管脚连接在 P3^5

中断标号为:

  • INT0 0
  • T0 1
  • INT1 2
  • T1 3
  • RX/TX 4

软件编写

定时器中断配置:

  • 对 TMOD 赋值,以确定 T0 和 T1 的工作方式

  • 根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1

  • 如果使用中断,则对 EA 赋值,开放定时器中断

  • 使 TR0 或 TR1 置位,启动定时/计数器定时或计数

首先将定时器中断配置好,再写出定时器中断需要执行的函数。在写定时器中断函数时需要用到关键字 interrupt ,再在后面写上中断标号。例如定时器中断 T0 的中断函数这样写 void Time0() interrupt 1 ,千万不要将中断标号写错了。

#include <REGX52.H>sbit LED=P2^0;void Time0_Init()
{TMOD|=0x01;    //选择为定时器0模式,工作方式1TH0=0xFC;      //给定时器赋初值,定时1msTL0=0x18;      ET0=1;         //打开定时器0中断允许EA=1;          //打开总中断TR0=1;         //打开定时器
}void Time0() interrupt 1   //定时器0中断函数
{static unsigned int i; //定义静态变量 i 如果不是静态变量会出现每次调用函数重复赋值为0;TH0=0xFC;    //再次给定时器赋初值 TL0=0x18;    //因为1ms时间到了,寄存器中的数被置0了,所以要重新赋值 1msi++;if(i==1000)   //将定时1ms循环1000遍,就是1s{i=0;LED=!LED;}
}void main()
{Time0_Init();     //定时器0中断配置while(1){}
}

http://chatgpt.dhexx.cn/article/UU6EVdVG.shtml

相关文章

定时器用法

在JavaScr中&#xff0c;定时器可以让我们在设定的时间间隔之后来执行代码&#xff0c;而不是在函数被调用后立即执行。而定时器分别有两种类型&#xff1a; 一次性定时器&#xff1a;仅在指定的延迟时间后触发一次。间隔性定时器&#xff1a;每隔一定的时间间隔就触发一次。 …

STM32定时器

目录 一 定时器的基本介绍 二 定时器的原理框图 1、定时器时钟 2 时基单元 3 捕获输入 4 PWM输出。 三 定时器的应用 1 定时器的基础定时计数功能 2 PWM比较输出 3 外部脉冲计数 a、外部触发输入&#xff08;ETR--外部时钟模式2&am…

SpringBoot定时器

SpringBoot定时器 1 介绍2 注解3 代码4 Cron表达式1. 格式2. 取值3. 特殊字符4. 经典案例 5 Cron既然那么麻烦就生成吧 1 介绍 定时器是一种控制任务延时调用&#xff0c;或者周期调用的技术。 作用&#xff1a;定时邮件、短信发送、更新数据、同步数据、检查数据库和缓存数据…

555定时器

555定时器 美国signetics公司1972年研制&#xff0c;取代机械式定时器&#xff0c;因为输入端有3个5k欧的电阻得名 电路结构 输入引脚 输出引脚 1.因为要接电容&#xff0c;电流较大&#xff0c;需要用oc门进行输出 2.需要接上拉电阻接vcc功能引脚 5号引脚对参考电压的影…

SysTick 定时器

11.1关于 SysTick 定时器 SysTick定时器(又名系统滴答定时器)是存在于Cortex-M3的一个定时器&#xff0c;只要是ARM Cotex-M系列内核的MCU都包含这个定时器。使用内核的SysTick定时器来实现延时&#xff0c;可以不占用系统定时器&#xff0c;节约资源。由于SysTick是在CPU核内…

JavaScript之定时器

定时器 一、 setTimeout() 定时器二、停止 setTimeout() 定时器三、setInterval() 定时器四、清除setInterval() 定时器五、电子时钟案例 在很多页面中&#xff0c;我们都可以看到一些倒计时或者和时间相关的效果&#xff0c;今天小熊将就JavaScript里面的倒计时做一概述。 首先…

STM32-通用定时器-定时器中断

1 STM32的定时器 STM32F103ZET6一共有8个定时器&#xff0c;其中分别为&#xff1a;高级定时器&#xff08;TIM1、TIM8&#xff09;&#xff1b;通用定时器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff09;&#xff1b;基本定时器&#xff08;TIM6、TIM7&#xff09;。 …

Python——定时器

1.定时器 Timer定时器源码实现&#xff0c;和自定义一个线程方式一样&#xff0c;都是继承Thread类&#xff0c;重写了run()方法&#xff0c;只是实现的功能是延时执行一个函数或方法。 &#xff08;1&#xff09;线程定时器(Timer)解释&#xff1a; Timer类是Thread的子类&a…

[JavaEE]定时器

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1.定时器的概念 2.标准库中的定时器 3.实现定时…

定时器的作用

一、简介。 在很多时候&#xff0c;我们设计网页时&#xff0c;为了某种表现形式&#xff0c;会使用到定时器这一功能&#xff0c;如&#xff1a;为了保证用户有仔细阅读我们的用户条款&#xff0c;我们会给确认按钮设置只有条款被打开&#xff0c;并超过5秒才允许点击。 二、…

定时器简介

文章目录 一.定时器基本介绍A.CPU时序B.定时器的原理 二.定时/计数器的相关寄存器A.定时器工作方式寄存器&#xff08;TMOD&#xff09;B.控制寄存器&#xff08;TCON&#xff09; 三.定时器的四种工作方式图解 一.定时器基本介绍 A.CPU时序 振荡周期&#xff1a;CPU外部晶振…

定时器基本常识

1.概念解读 1.1定时器和计数器&#xff0c;电路一样 1.2定时或者计数的本质就是让单片机某个部件数数 1.3当定时器用的时候&#xff0c;靠内部震荡电路数数 1.4当计数器用的时候&#xff0c;书外面的信号&#xff0c;读取针脚的数据 2.定时器怎么定时 定时器的本质原理&a…

定时器详解

1. 什么是定时器&#xff08;timer&#xff09; 定时器实际上就是Soc当中的一个内部外设。 &#xff08;1&#xff09;定时器与计数器 定时器常与计数器扯到一起&#xff0c;计数器也是soc当中的一个内部外设&#xff0c;计数器顾名思义是用来计数的&#xff0c;就和我们的秒…

定时器(Timer)

一、定时器是什么&#xff1f; 定时器类似于我们生活中的闹钟&#xff0c;可以设定一个时间来提醒我们。 而定时器是指定一个时间去执行一个任务&#xff0c;让程序去代替人工准时操作。 标准库中的定时器: Timer 方法作用void schedule(TimerTask task, long delay)指定dela…

STM32-定时器详解

目录 前言 一、定时器基本介绍 1. STM32定时器 2. 通用定时器功能和特点 3. 计数器模式 4. 定时器工作原理 a.定时器框图 b.时钟产生器部分 c.时基单元 d.输入捕获通道 e.输出比较通道&#xff08;PWM&#xff09; 二、定时器中断应用 1.内部时钟选择 2.计数器模式 …

typedef和#define

typedef是c语言中一个重要的关键字其作用是为一种数据类型定义了一个新的名字这里的类型包括&#xff08;int&#xff0c;char,double 等)和自定义数据类型&#xff0c;通俗一点来说就是为一种数据类型起一个别名 举个例子&#xff1a; 定义一个整型变量a并将其初始化为666&a…

typedef和define的区别、typedef的具体用法

typedef最核心的用法&#xff1a;给数据类型取别名&#xff0c;这个别名既可以是此数据类型的替换&#xff0c;也是指向此数据类型的指针。 具体用法&#xff08;对普通数据类型取别名&#xff09;&#xff1a; 对结构体数据类型取别名&#xff1a; typedef与define的区别&…

#define与typedef的区别

目录 &#xff08;1&#xff09;原理不同 &#xff08;2&#xff09;功能不同 &#xff08;3&#xff09;作用域不同 &#xff08;4&#xff09;对指针的操作不同 &#xff08;5&#xff09;补充 a.指针常量 b.常量指针 typedef和define都是替一个对象取一个别名&#x…

C语言中的typedef

C语言中的"typedef" 一、什么是typedef typedef是用于定义新的类型名&#xff0c;在编程中可以用typedef来定义新的类型名来代替已有的类型名 格式&#xff1a; typedef 已有类型名 新的类型名 通俗点说&#xff0c;就是为已有的类型取别名&#xff0c;例如 老鼠&am…

define 与typedef的区别

define 与typedef大体功能都是使用时给一个对象取一个别名&#xff0c;增强程序的可读性&#xff0c;但它们在使用时有以下几点区别&#xff1a; 1.定义不一样 define定义后面不用加分号&#xff0c;并且它的别名在对象的前面 typedef需要加分号&#xff0c;并且它的别后面替…