51单片机——定时器中断(重点)

news2025/4/8 12:37:41

STC89C5X含有3个定时器:定时器0、定时器1、定时器2

注意:51系列单片机一定有基本的2个定时器(定时器0和定时器1),但不全有3个中断,需要查看芯片手册,通常我们使用的是基本的2个定时器:定时器0/1

1、定时器介绍

CPU时序的有关知识:

        ①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。

        ②状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。

        ③机器周期:1个机器周期含6个状态周期,12个振荡周期。

        ④指令周期:完成1条指令所占用的全部时间,它以机器周期为单位

eg:外接晶振为12MHz时,51单片机相关周期的具体值为:振荡周期=1/12us;状态周期=1/6us; 机器周期=1us;指令周期=1-4us;

注意:

        ①51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。

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

         ③51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1

2、单片机定时器原理

STC89C5X单片机内有两个可编程的定时/计数器T0、T1和一个特殊功能定时器T2

定时/计数器的实质是加1计数器(16 位),由高8位和低8位的两个寄存器THxTLx组成。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时 /计数器中断允许时)

如果定时/计数器工作于定时模式,则表示定时时间已到; 如果工作于计数模式,则表示计数值已满

可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值

3、单片机定时/计数器结构 T0 T1

(1)51单片机均有的5个中断来介绍,其内部结构框图如下所示: 

        T0对应的是P3.4口的附加功能,TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断,中断号为1

        T1对应的是P3.5口的附加功能,TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断,中断号为3

(2)51 单片机定时器/计数器内部结构如下所示:

TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志 

3.1 工作方式寄存器 TMOD

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

(1)GATE:门控位。

        GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;

        GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。

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

(3)M1M0:工作方式设置位。定时/计数器有四种工作方式

3.1.1 方式0(了解)

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

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

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

        当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。

        当TR0=1时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。

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

3.1.2 方式1(用于定时器)

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

 

与方式0的运行模式一样

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

3.1.3 方式2(用于串口)

方式2为自动重装初值的8位计数方式。工作方式2特别适合于用作较精确的脉冲信号发生器

 

与方式0的运行模式一样

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

3.1.4 方式3(了解)

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

  

与方式0的运行模式一样 

3.2 控制寄存器 TCON

TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请

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

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

(3)TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。

(4)TR0(TCON.4):T0运行控制位,其功能与TR1类同。

 4、定时器配置

(1)对TMOD赋值,以确定T0和T1的工作方式,如果使用定时器0即对T0配 置,如果使用定时器1即对T1配置

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

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

(4)使TR0或TR1置位,启动定时/计数器定时或计数

eg:以定时器0为例介绍配置定时器工作方式1、设定1ms初值 

void time0_init(){
    TMOD|=0x01;  //工作方式1|:为了不干扰定时器1
    TH0=0XFC;  //给定时器赋初值,定时1ms
    TL0=0X18;
    EA=1;  //打开总中断开关
    ET0=1;  //打开定时器0的中断允许
    TR0=1;  //打开定时器

TH0=0XFC和TL0=0X18是通过51定时器计算软件得到的

5、软件设计

要实现的功能是:通过定时器0中断控制D1指示灯间隔1秒闪烁

#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LED1=P2^0;
//初始化定时器0中断,使用工作方式1
void time0_init(){
    TMOD|=0x01;  //|:为了不干扰定时器1
    TH0=0XFC;  //给定时器赋初值,定时1ms
    TL0=0X18;
    EA=1;  //打开总中断开关
    ET0=1;  //打开定时器0的中断允许
    TR0=1;  //打开定时器
}
void main(){
    time0_init();
    while(1){
        
    }
}
//定时器中断服务函数
void time0() interrupt 1{
    static u16 i=0;  //一定要加static关键字
    TH0=0XFC;  //给定时器赋初值,定时1ms
    TL0=0X18;
    i++;
    if(i==1000){  //计时1s
        i=0;
        LED1=!LED1;
    }
}

为什么要使用关键字static将i定义为静态变量呢?

我们希望每次进入中断函数时,i保存的是上次累加值,使用了static关键字,就可以让变量i实现这种功能,即不会每次进入中断函数后被初始化为0。假如去掉static关键字,那么变量i就是一个局部变量,每次进入中断函数后,变量i初始值都是0, 也就是说它的值永远也不会递增到1000,从而实现不了1s定时。可以这样理解, 使用了static关键字就相当于将i变成了一个全局变量功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI,点击按钮后,会变成为一个监听按钮。旁边会有音符飞入这个监听按钮,最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码

对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”

2024年,在高阶智驾进入快速上车的同时,座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示,2024年1-10月,中国市场(不含进出口)乘用…

【技术支持】安卓无线adb调试连接方式

Android 10 及更低版本,需要借助 USB 手机和电脑需连接在同一 WiFi 下;手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices可以查看到手机);设置手机的监听adb tcpip 5555;拔掉 USB 线…

Dependency check 通过Maven构建时,配置Mysql数据库遇到的三个坑

使用过Dependency check的同学,一定会遇到这个问题—— 每次执行依赖扫描时,由于网络问题会导致NVD下载种子数据的过程中的种种失败,不仅浪费了大量时间,还会因为下载文件的不完整性直接导致依赖检测的失败。所以我在使用Dependen…

uniApp通过xgplayer(西瓜播放器)接入视频实时监控

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

【OJ刷题】同向双指针问题

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…

Ubuntu中使用miniconda安装R和R包devtools

安装devtools环境包 sudo apt-get install gfortran -y sudo apt-get install build-essential -y sudo apt-get install libxt-dev -y sudo apt-get install libcurl4-openssl-dev -y sudo apt-get install libxml2.6-dev -y sudo apt-get install libssl-dev -y sudo apt-g…

《分布式光纤测温:解锁楼宇安全的 “高精度密码”》

在楼宇建筑中,因其内部空间庞大,各类电器设施众多,如何以一种既高效又稳定,兼具低成本与高覆盖特性的方式,为那些关键线路节点开展温度监测,是目前在安全监测领域一项重点研究项目,而无锡布里渊…

git撤回提交、删除远端某版本、合并指定版本的更改

撤回提交 vscode的举例 一、只提交了还未推送的情况下 1.撤回最后一次提交,把最后一次提交的更改放到暂存区 git reset --soft HEAD~12.撤回最后一次提交,把最后一次提交的更改放到工作区 git reset --mixed HEAD~13.撤回最后一次提交,不…

【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程

前言 🌟🌟本期讲解关于spring aop的入门介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…

开源CMS建站系统的安全优势有哪些?

近年来,用户们用开源CMS系统搭建网站的比例也越来越高,它为用户提供了便捷的网站建设解决方案。其中,亿坊CMS建站系统更因安全方面备受用户欢迎,下面带大家一起全面地了解一下。 一、什么是开源CMS? 开源CMS指的是那…

基于单片机的客车载客状况自动检测系统(论文+源码)

1系统整体设计 本课题为客车载客状况自动检测系统,在此以STM32单片机为核心控制器,结合压力传感器、红外传感器、蜂鸣器、语音提示模块、继电器、液晶等构成整个客车载客状况自动检测系统,整个系统架构如图2.1所示,在此通过两个红…

CDP集成Hudi实战-Hive

[〇]关于本文 本文测试一下使用Hive和Hudi的集成 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]部署Jar包 1-部署hudi-hive-sync-bundle-1.0.0.jar文件 [rootcdp73-1 ~]# for i in $(se…

网络安全 基础入门-概念名词

域名相关 域名 域名和IP地址相互映射,这样不用去记住能够被机器直接读取的IP地址数串 域名系统(DNS) 它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。 1. 如果是自动获取dns,就向上查询&#xff…

Rust语言使用iced实现简单GUI页面

使用cargo新建一个rust项目 cargo new gui_demo cd gui_demo 编辑Cargo.toml文件 ,添加iced依赖 [package] name "gui_demo" version "0.1.0" edition "2021"[dependencies] iced "0.4.2" 编辑src/main.rs文件: u…

深度学习领域创新黑马!频域特征融合新突破

最近,FreqFusion引起了广泛关注,这是一种创新的频率感知特征融合方法,可以提升数据处理的准确性和效率,尤其在语义分割、目标检测、实例分割和全景分割等任务中表现卓越。 通过结合频域分析与特征融合技术,FreqFusion…

毕业项目推荐:基于yolov8/yolov5的草莓病害检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

鸿蒙开发(29)弹性布局 (Flex)

概述 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。常用于页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等。 容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方…

“深入浅出”系列之C++:(3)网络编程

通过网络编程实现基于网络的应用程序&#xff0c;实现计算机之间的通信和数据交换。 套接字(Socket)&#xff1a;套接字是网络编程中用于通信的一种抽象概念。在C中使用<sys/socket.h>头文件中定义的套接字函数来创建和操作套接字。目的是开发采用套接字通信的C/S网络应用…

高等数学学习笔记 ☞ 一元函数微分的基础知识

1. 微分的定义 &#xff08;1&#xff09;定义&#xff1a;设函数在点的某领域内有定义&#xff0c;取附近的点&#xff0c;对应的函数值分别为和&#xff0c; 令&#xff0c;若可以表示成&#xff0c;则称函数在点是可微的。 【 若函数在点是可微的&#xff0c;则可以表达为】…