定时器中断

2023-05-16

定时器简介

        介绍定时器之前,先说明几个CPU 时序的有关知识。

  • 振荡周期:为单片机提供定时信号的振荡源的周期
  • 状态周期:1 个状态周期 = 2 个振荡周期
  • 机器周期:1 个机器周期 = 6 个状态周期 = 12 个振荡周期。
  • 指令周期:完成 1 条指令所占用的全部时间,以机器周期为单位。

        以12MHz外接晶振为例(注意,Hz表示每秒钟周期性振动(振荡)的重复次数,每钟振动一次为1赫兹。单位换算:1THz=1*10^3GHz=1*10^6Mhz=1*10^9KHz=1*10^12Hz):

  • 振荡周期=1/12us;    //相当于1/12X10^6,所以此处单位为us
  • 状态周期=1/6us;
  • 机器周期=1us;     
  • 指令周期=1~4us    

        51 单片机有两组定时/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。定时/计数器的工作过程是自动完成的,不需要 CPU 的参与,它们相互独立,执行不同的任务,因此可以增加单片机的效率。

        定时/计数器根据 “机器内部的时钟” 或 “外部的脉冲信号” 对寄存器中的数据加 1,可以实现精确定时的作用。

定时器原理

        定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成。随着计数器的输入脉冲进行自加 1,即,每输入一个脉冲,计数器就自动加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位(TF0/TF1)置 1,向 CPU 发出中断请求(定时 /计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到; 如果工作于计数模式,则表示计数值已满。所以,由  “溢出时计数器的值”  减去 “计数初值”  才是加 1 计数器的计数值。

定时/计数器结构

        内部结构如下所示:

        图中的 T0 和 T1 引脚对应单片机 P3.4 和 P3.5 管脚。定时/ 计数器的工作由两个特殊功能寄存器控制。

TMOD:定时/计数器的工作方式寄存器,确定工作方式和功能

TCON:控制寄存器,控制 T0、T1 的启动和停止及设置溢出标志

工作方式寄存器TMOD

         工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于T0,高四位用于 T1。其格式如下:

76543210
字节地址:89HGATEC/TM1M0GATEC/TM1M0

        GATE: 门控位, GATE=0 时,用于控制定时器的启动是否受外部中断源信号的影响。使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;GATA=1 时,使 TR0 或 TR1 为 1,同时外部中断引脚 INT0或 INT1 也为高电平时,才能启动定时/计数器工作。即,此时定时器的启动条件,加上了 INT0或 INT1 也为高电平这一条件。

        C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。

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

定时/计数器工作方式设置表
M1M0工作方式说明
00方式013位定时/计数器
01方式116位定时/计数器
10方式28位自动重装定时/计数器
11方式3T0分成两个独立的8位定时/计数器;T1此方式停止计数

控制寄存器 TCON

        TCON 的低 4 位用于控制外部中断,已在前面介绍。TCON 的高 4 位用于控制定 时/计数器的启动和中断申请。其格式如下(0~3为外部中断相关位):

76543210
字节地址:88HTF1TR1TF0TR0                        

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

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

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

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

定时/计数器的工作方式

        这几种工作方式中应用较多的是方式 1 方式 2。定时器中通常使用定时器方式 1,串口通信中通常使用方式 2。

方式 0:

        方式 0 为 13 位计数,由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位组成。 TL0 的低 5 位溢出时,向 TH0 进位。TH0 溢出时,置位 TCON 中的 TF0 标志,向 CPU发出中断请求。其结构图如下所示:

         门控位 GATE 具有特殊的作用。

         当 GATE=0 时,经非门反相后,使或门输出为 1,此时仅由 TR0 控制与门的开启,与门输出 1 时,控制开关接通,计数开始;

         当 GATE=1 时,由外中断引脚信号控制或门的输出,此时控制与门的开启由 “外中断引脚信号INT0/1” 和 “TR0” 共同控制。当 TR0=1 时,若外中断引脚信号引脚为高电平,则启动计数,外中断引脚信号引脚为低电平,则停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。

         计数模式时,计数脉冲是 T0 引脚上的外部脉冲。计数初值X与计数个数N的关系为:X=2^13-N。

方式 1:

         方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了 16 位加 1 计数器。其结构图如下所示

          计数初值X与计数个数N的关系为:X=2^16-N。

方式 2:

          方式 2 为自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作较精确的脉冲信号发生器。其结构图如下所示:

方式 3:

          方式 3 只适用于定时/计数器 T0,定时器 T1 处于方式 3 时相当于 TR1=0, 停止计数。工作方式 3 将 T0 分成为两个独立的 8 位计数器 TL0 和 TH0。其 结构如下所示:

定时器配置

           使用定时器时,配置如下:

  • 对 TMOD 赋值,以确定 T0 和 T1 的工作方式
  • 根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。
  • 如果使用中断,则对 EA 赋值1,打开总中断开关。
  • 使 TR0 或 TR1 置位,启动定时/计数器定时或计数。

计算定时/计数 器初值

           机器周期是 CPU 完成一个基本操作所需要的时间。 其计算公式是:机器周期=1/单片机的时钟频率。单片机 “内部时钟频率” 是 “外部时钟频率” 的 12 分频,即,当外部晶振的频率输入到单片机里面的时候要进行 12 分频。

           以12MHZ 晶振为例,则单片机内部的时钟频率就是 12/12MHZ, 当使用 12MHZ 的外部晶振的时候,机器周期=1/1MHz=1us。

           假设使用定时/计数器 T0,需要定时 1ms。那么1ms/1us=1000,也就是要计数 1000 个,那么初值就等于:65535-1000+1 (因为计数器计数到 65536(2 的 16 次方)才溢出,所以后面要加 1),且65535-1000+1 =64536,转换为16进制:FC18H(H为后缀),所以初值为 TH0=0XFC,TL0=0X18。

           要实现很长时间的定时,比如定时 1 秒钟。可以通过初值设置定时 1ms,每当定时 1ms 结束后又重新赋初值,并且设定一个全局变量累计定时 1ms 的次数,当累计到 1000 次,表示已经定时 1 秒了。同理,当累计到 60000 次,表示已经定时 1 分钟了。这样就可以使用定时器来实现精确延时,替代之前的不精确的 delay 函数了。

           以定时器 0 为例,介绍配置定时器工作方式为1、设定 1ms 初值、开启定时器计数功能以及总中断的程序,如下所示:

void TIME0_INIT(void)
{
   TMOD |= 0X01;   //选择为定时器 0 模式,工作方式 1
   TH0 = 0XFC;     //给定时器赋初值,定时 1ms
   TL0 = 0X18;
   ET0 = 1;        //打开定时器 0 中断允许
   EA = 1;         //打开总中断
   TR0 = 1;        //T0 运行控制位置1,打开定时器0
}

           定时器 1 也是一样的的使用方法,只是将上述的 0 变为 1 即可。

void TIME1_INIT(void)
{
   TMOD |= 0X01;   //选择为定时器 1 模式,工作方式 1
   TH1 = 0XFC;     //给定时器赋初值,定时 1ms
   TL1 = 0X18;
   ET1 = 1;        //打开定时器 1 中断允许
   EA = 1;         //打开总中断
   TR1 = 1;        //T1 运行控制位置1,打开定时器1
}

硬件部分

        使用到硬件资源如下:

  1. LED 模块(LED 灯D1)
  2. 定时器 0

        定时器 0 属于 51 单片机内部资源,通过软件配置即可使用。

 软件部分        

        代码结构和逻辑很简单,首先定义控制 LED1 指示灯的管脚,然后定义定时器 0 中断配置函数 TIME1_INIT( ),然后进入 while 循环,在循环体内没有执行任何功能程序,知识等待定时器 0中断的产生。 当定时时间到达即会进入定时器 0 中断,在中断服务函数内,重新赋初值准备下次计数,并且定义一个静态变量来累计定时 1ms 次数,当变量等于 1000 时,表示定时时间达 1 秒,然后清零变量以及控制 LED 状态翻转,实现LED灯的亮灭。执行完成后退出中断,返回主函数,当时间到达又进入中断,如此循环。

         使用关键字 static 定义一个静态变量,能在每次进入或退出中断函数时,保存静态变量的值不变,这是C语言作用域相关的知识点,不理解可以网上去查看一些资料。

#include "reg52.h"

typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义LED1管脚
sbit LED1=P2^0;

void TIME0_INIT(void)
{
	TMOD|=0x01;//选择为定时器0模式,工作方式1
	TH0=0xFC;  //给定时器赋初值,定时1ms
	TL0=0x18;
 	ET0=1;//打开定时器0中断允许位
	TR0=1;//T0 运行控制位置1,打开定时器0
	EA=1;//打开总开关
}

void main()
{	
	TIME0_INIT();//定时器0中断配置
	
	while(1)
	{
	 	
	}		
}

void TIME0() interrupt 1 //定时器0中断函数
{
	static u16 i;  //定义静态变量
	TH0=0xFC;	   //重新赋定时/计数的器初值,使计数器计数 1000 个后再一次溢出
	TL0=0x18;
	i++;		   //每一次进入中断增加1,增加到1000,就表示定时1s了
	if(i==1000)
	{
	 	i=0;		//重新赋值为0,为1s的时间积累做准备
		LED1=!LED1;	//实现LED灯的亮灭
	}
}

现象     

         LED指示灯 D1 间隔 1 秒闪烁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定时器中断 的相关文章

  • 虚拟机Vmware安装Ubuntu系统

    vm虚拟机下载安装 安装位置可以任意选择 xff0c 但是路径中不要出现中文字符 两个选项都取消掉 点击许可证 激活码就是许可证选择一个复制即可 Ubuntu系统下载安装 Ubuntu系统可直接前往其官网进行下载 buntu 22 04 L
  • 深入理解JVM虚拟机

    文章目录 深入理解JVM虚拟机JDK1 8新特性 xff1a JVM架构图 xff1a 类装载器知识点 xff1a 类装载器 xff1a 双亲委派机制 xff1a 沙箱安全机制 xff1a Execution Engine执行引擎负责解释命
  • Linux基础指令详解

    目录 前言 Linux基本指令 1 ls指令 1 1 ls 1 2 ls l 1 3 ls a 1 4 ls d 1 5 绝对路径和相对路径 2 pwd指令 3 cd指令 4 touch指令 5 mkdir指令 6 rmdir指令和rm指令
  • aruco识别,python实现

    需要配置anaconda xff0c 用spyder进行python语言编辑 xff0c 实现对aruco码的编写 代码比较垃圾 xff0c 不喜勿喷 配置过程如下 xff1a 视觉系统的运行需要搭建视觉环境 xff0c 包括 xff0c
  • 关于使用HTTP上传文件到hdfs文件系统

    String tenantName 61 System getenv 34 OPENPALETTE NAMESPACE 34 String dataIntegrationServiceName 61 34 dataintegration m
  • 详解 FTP、FTPS 与 SFTP 的原理

    FTP FTPS 与 SFTP 简介 FTP FTP 即 文件传输协议 xff08 英语 xff1a File Transfer Protocol 的缩写 xff09 是一个用于计算机网络上在客户端和服务器之间进行文件传输的应用层协议 完整
  • 用函数调用,把在一个函数的内部改变另一个函数的变量(这个变量相对于第一个函数就是一个外部变量)

    include lt stdio h gt void add int p 指针是整数 xff0c 所以其类型是int整型 这里 p外部变量num的地址 xff0c 即 p 61 num p 43 43 指针变量在单独使用时记得要加括号表示一
  • keil5 C51版本安装及MDK5合并,搭建STM32开发环境(详细教程)

    keil5安装及MDK5合并 资源说明 已将文章中涉及到的所有软件安装包及注册机2032版都放置到百度网盘 xff0c 链接 xff1a 百度云盘链接 提取码 xff1a 0109 1 C51安装 首先在keil官网里下载软件安装包 xff
  • Jmeter性能测试(22)--内存溢出原因及解决方法

    jmeter是一个java开发的开源性能测试工具 xff0c 在性能测试中可支持模拟并发压测 xff0c 但有时候当模拟并发请求较大或者脚本运行时间较长时 xff0c 压力机会出现卡顿甚至报异常 内存溢出 xff0c 这里就介绍下如何解决内
  • Ubuntu16.04的安装教程

    Ubuntu16 04的安装 这里我们会介绍Ubuntu16 04的史诗级保姆教程 开始了 xff0c 车速有点快 xff0c 系好安全带 xff0c 发车了 xff01 1 打开浏览器 xff0c 找到Ubuntu的官网 2 单击 系统桌
  • 电脑触摸板无法使用,I2C HID设备异常处理。

    本人电脑 戴尔 Vostro3400 xff0c win10系统 xff0c 触摸板突然失灵 xff0c 客服让我更新BIOS驱动 xff0c 关闭电源选项的快速启动等等 好了一阵 xff0c 再一重启又失灵 经过无限次百度 xff0c 终
  • 自我简介,对软件工程课程的希望及个人目标

    我是一名桂林理工大学信息科学与工程学院软件工程本科大二年纪的学生 xff0c 热爱学习 xff0c 努力上进 xff0c 对未来充满希望 xff0c 很高兴能学习软件工程这门课程 我对这门课程的希望 xff1a 1 我希望通过学习软件工程这
  • 用HTML、CSS写一个酷炫的动态搜索框

    用HTML CSS写一个酷炫的动态搜索框 可伸展的动态搜索框 xff01 复制粘贴即可用 xff01 HTML部分 xff1a span class token doctype lt DOCTYPE html gt span span cl
  • 使用 curl/git 命令时出现 Failed to connect to XXX port 443: 拒绝连接

    文章目录 原因与过程解决办法 原因与过程 今天在linux下安装docker compose出现Failed connect to github com 443 拒绝连接 网上查了下说是DNS被污染 xff0c 改下host文件 解决办法
  • 【C++】30h速成C++从入门到精通(STL介绍、string类)

    STL简介 什么是STL STL standard template libaray 标准模板库 xff1a 是C 43 43 标准库的重要组成部分 xff0c 不仅是一个可复用的组件库 xff0c 而且是一个包罗数据结构与算法的软件框架
  • redis分布式锁

    1 Redis分布式锁最简单的实现 想要实现分布式锁 xff0c 必须要求 Redis 有 互斥 的能力 xff0c 我们可以使用 SETNX 命令 xff0c 这个命令表示SET if Not Exists xff0c 即如果 key 不
  • 网络边界安全

    防火墙 防火墙的分类 按物理特性划分 软件防火墙硬件防火墙 按性能划分 百兆级防火墙千兆级防火墙 按防火墙结构划分 单一主机防火墙路由集成防火墙分布式防火墙 按防火墙技术划分 包过滤防火墙应用代理防火墙状态检测防火墙 防火墙的功能 访问控制
  • 控制台报错--Module not found: Error: Can‘t resolve ‘core-js/fn/promise‘

    报错信息 xff1a 解决方法 xff1a 原因是vscode会自动导入 import resolve from 39 core js fn promise 39 这一行代码
  • 如何测量无人机电机和螺旋桨的效率?

    为什么要测试电机和螺旋桨 xff1f 首先要确认我们和最终用户的需求是什么 xff1f 因为它将帮助我们发现哪些内容需要优化 xff1a 是否希望增加无人机不间断航拍的续航时长 xff1f 是否希望增加无人机的净载荷 xff1f 是否需要加
  • Jmeter性能测试(23)--分布式测试

    关于jmeter的介绍和元件作用 xff0c 之前的博客介绍过 xff0c 很多其他同行的博客也够详细的 xff0c 这里不做介绍 xff0c 对jmeter不甚了解的可以参考之前的博客 xff1a jmeter xff1a 菜鸟入门到进阶

随机推荐

  • 无人机的电调及其工作原理是什么?

    电子速度控制器 ESC 是电力推进系统的重要硬件组成部分 它就像系统的大脑一样 xff0c 根据从油门控制器接收到的数据信号告诉电机以多快的转速运行 对于无人机和遥控车辆等小型场景应用 xff0c 该控制器的名称为 ESC xff0c 而对
  • 三自由度无人机飞手培训、PID调试、飞行教学、飞控算法验证、故障仿真平台

    无人机在研制过程中需要不断地进行飞行测试 xff0c 而测试的过程不是万无一失的 xff0c 飞行过程中发生任何错误都有可能会导致无人机的损毁或破坏 xff0c 更严重地甚至会造成外界伤害 基于此我们推出了无人机的三旋转自由度 3 DOF
  • shell脚本的执行

    标题 shell脚本的执行 概述 当shell脚本运行时 xff0c 首先会查找系统环境变量ENV xff0c 环境变量指定了环境文件 xff08 加载顺序 etc profile bash profile bashrc etc bashr
  • prometheus(普罗米修斯)

    prometheus 什么是普罗米修斯 xff1f Prometheus是一个开源系统监控和警报工具包 xff0c 最初是在 SoundCloud 上构建的 自2012年成立以来 xff0c 许多公司和组织都采用了Prometheus xf
  • 装机环境配置笔记

    装机过程中需要修改系统中的环境参数以及配置 xff01 xff01 xff01 http t csdn cn Ste4n xff08 记录在这里 xff09 运行环境配置文档 xff08 参考使用非必须 xff09 Notion The a
  • SDN系统方法 | 8. 网络虚拟化

    第8章 网络虚拟化 如第2章所述 xff0c 网络虚拟化和本书介绍的其他部分有所不同 xff0c 这是SDN第一个成功的商业用例 网络虚拟化可以在服务器上实现 xff0c 通常不需要物理网络中的交换机提供任何帮助 网络虚拟化可以实现为现有网
  • 算法设计与分析

    两个例子 调度问题与投资问题 例1 xff1a 调度问题 问题 有 n 项任务 xff0c 每项任务加工时间已知 从 0时刻开始陆续安排到一台机器上加工 每个任务的完成时间是从 0 时刻到任务加工截止的时间 求 总完成时间 xff08 所有
  • 偏航角、俯仰角、横滚角的理解

    最近研究IMU陀螺仪 xff0c 经过一早上的调试 xff0c 最后发现根本看不懂xyz三个角度的度数是怎么来的 xff0c 看了一些教程 xff0c 也觉得不够直观 xff0c 去了b站找了个视频 xff0c 发现讲解的还不错 xff0c
  • ubuntu20.04版本 安装ros1与px4、mavros、QGroundControl

    基于个人安装时的操作以及所浏览的链接 xff0c 仅供参考 文章目录 前言一 pandas是什么 xff1f 二 使用步骤 1 引入库2 读入数据总结 前言 使用ubuntu下载ros px4似乎是一件十分繁琐以及困难的事情 xff0c 但
  • ros中无人机基于话题<geographic_msgs/GeoPoseStamped.h>的指点飞行控制

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 话题认识二 完整代码总结 前言 本篇文章是作者在学习ros时根据自己的认识所写的代码 xff0c 主要是基于话题 lt
  • Jmeter性能测试(24)--dubbo接口测试

    一 Dubbo简介 dubbo是一个分布式服务框架 xff0c 致力于提供高性能和透明化的RPC远程服务调用方案 xff0c 以及SOA服务治理方案 其核心部分包含如下几点 xff1a 1 远程通讯 xff1a 提供对多种基于长连接的NIO
  • 自定义mavlink及收发测试(px4固件V1.11.0,QGC源码4.0)

    一 实现收 1 先定义uORB消息 a01 GPS msg uint64 timestamp time since system start microseconds uint64 lat Latitude uint64 lon Longi
  • 自定义mavlink及收发测试2(px4固件V1.11.0,QGC源码V4.0)

    一 1 下载安装一个mavlink文件或者在原文件上修改 安装步骤 xff08 包含mavlink generator xff09 可参照文章 PX4自定义Mavlink消息 xff08 一 xff09 px4发送 Sense97的博客 C
  • Ubuntu20.04 | 更新软件源 sudo apt-get update 出现错误

    之前使用了清华的官方源 清华大学开源软件镜像站 Tsinghua Open Source Mirror 错误提示 xff1a 忽略 1 https mirrors tuna tsinghua edu cn ubuntu focal InRe
  • PCB封装库的制作

    以下几个元件制作为例 xff1a 元件SMA封装 步骤 xff1a 1 创建PCB库文件 xff1a 单击 File 菜单 xff0c 选择 New 选项中的 Library 选项 xff0c 再选择 PCB Library xff0c 进
  • PCB板自动布线

    自动布线 步骤 xff1a 1 整体删除同层的走线 xff1a 打开PCB文件 xff0c 在层的选项卡中选择顶层 Top Layer xff0c 在 Edit 菜单下选择 Select 选项 xff0c 选择 All on Layer 选
  • 独立按键实验

    按键简介 按键是一种电子开关 xff0c 使用时 xff0c 按下按钮 xff0c 则开关接通 xff0c 松开手时 开关断开 开发板上使用的按键及内部简易图如下图所示 xff1a 按键管脚两端距离长的表示默认是导通状态 xff08 1 2
  • IO 扩展(串转并)-74HC595-16*16LED点阵实验

    51 单片机的IO 口非常有限 xff0c 有时候若想要连接更多外围设备 xff0c 需要通过 IO 扩展来实现 本文介绍一种 IO 口扩展方式 串转并 xff0c 使用的芯片是 74HC595 若有4个 74HC595 芯片 xff0c
  • LED 点阵实验~点亮一个点、数字、汉字、图

    LED 点阵简介 LED 点阵是由发光二极管排列组成的显示器件 xff0c 如下所示为8 8LED 点阵 xff1a 以 16 16LED 点阵为例 xff0c 其内部结构图如下所示 xff1a 16 16 点阵共由 256 个发光二极管组
  • 定时器中断

    定时器简介 介绍定时器之前 xff0c 先说明几个CPU 时序的有关知识 振荡周期 xff1a 为单片机提供定时信号的振荡源的周期状态周期 xff1a 1 个状态周期 61 2 个振荡周期机器周期 xff1a 1 个机器周期 61 6 个状