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

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.mzph.cn/bicheng/68031.shtml

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

相关文章

LeetCode热题100-合并两个有序链表【JavaScript讲解】

题目: 题解: 我们目前已经知道两条链表都是有序链表,我们就可以通过迭代的方法实现上述问题。当list1和list2都不是空链表时,判断list1和list2哪个头节点的值更小,将较小的值添加到结果里,被添加到结果里的…

Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】

挑战:捕获大型水生哺乳动物(如鲸鱼)的数据,搭建全彩3D模型,用于水生野生动物的法医鉴定、研究和保护工作。 解决方案:Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…

HBuilderX打包ios保姆式教程

1、登录苹果开发者后台并登录已认证开发者账号ID Sign In - Apple 2、创建标识符(App ID)、证书,描述文件 3、首先创建标识符,用于新建App应用 3-1、App的话直接选择第一个App IDs,点击右上角继续 3-2、选择App&#x…

Android DataBinding 结合 ViewModel的使用

Android DataBinding 结合 ViewModel的使用 一、build.gradle引入对应的依赖 在build.gradle(app模块)里引入依赖,然后Sync Now一下: android {​viewBinding {enabled true}dataBinding {enabled true}} 完整的build.gradle代…

动植物基因表达调控

1, on and off状态 以及表达的量 2, 基因调控的生物学影响? 超过400多种细胞类型,数目上37万亿 不是所有的基因都表达 为什么多核真核细胞需要基因调控? 单个细胞往多个细胞逐渐进化的过程,形成复杂的…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看

【数据结构】树的定义

在计算机科学中,树(Tree)是一种重要的基础数据结构,广泛应用于许多领域,如文件系统的目录结构、数据库的索引、编译器的语法树、人工智能的决策树等。理解树的基本概念和术语,对于学习计算机科学及其相关技…

三个shell脚本

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 测试结果: 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 3、编写个shell脚本将/usr/local 日录…

读书笔记--共享服务中心建设原则

最近阅读了《企业IT架构转型之道》记录和思考如下,供大家学习参考。随着企业的数字化转型推进,很多企业开始从原来的SPA模式应用转变为平台技术应用,比如阿里巴巴的共享服务中心,传统企业的统一认证的share服务等等。可以说&#…

DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议

文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴(Event Storming)事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…

【C语言系列】函数递归

函数递归 一、递归是什么?1.1尾递归 二、递归的限制条件三、递归举例3.1举例一:求n的阶乘3.2举例二:顺序打印一个整数的每一位 四、递归与迭代4.1举例三:求第n个斐波那契数 五、拓展学习青蛙跳台问题 一、递归是什么? …

css盒子水平垂直居中

目录 1采用flex弹性布局: 2子绝父相margin:负值: 3.子绝父相margin:auto: 4子绝父相transform: 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接:文字水平垂直居中-CSDN博客 以下为盒子…

攻防世界 Web_php_wrong_nginx_config

​ 打开题目地址,显示为登录页面。尝试用御剑扫描一下,发现了admin页面,点进去显示如下 点开控制台,发现如下 isLogin参数为0。尝试抓包并该islogin参数为1,返回依旧不变。 再扫描,发现robots.txt&#xff…

HTML5实现好看的端午节网页源码

HTML5实现好看的端午节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 端午节由来界面1.4 端午节习俗界面1.5 端午节文化界面1.6 端午节美食界面1.7 端午节故事界面1.8 端午节民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 H…

net-http-transport 引发的句柄数(协程)泄漏问题

Reference 关于 Golang 中 http.Response.Body 未读取导致连接复用问题的一点研究https://manishrjain.com/must-close-golang-http-responsehttps://www.reddit.com/r/golang/comments/13fphyz/til_go_response_body_must_be_closed_even_if_you/?rdt35002https://medium.co…

关于husky8.0 与 4.0的配置

husky的场景使用很多,一般大多场景是在配置git commit 命令拦截hook, 校验 commit-msg 格式规范。以下环境默认:git > 2.27.0, node >14 1、安装huskey8.0.1 npm install --save-dev husky8.0.1 2、初始化配置文件 在package.json scripts 属性…

CV(9)--迁移学习

前言 仅记录学习过程,有问题欢迎讨论 fine-tuning 在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络 (例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也…

LS1046+XILINX XDMA PCIE调通

欢迎点赞收藏,欢迎私下讨论技术,分享技术 硬件平台 :NXP LS1046 XILINX FPGA 软件平台:LINUX 4.19.68 buildroot LS1046 PEX3 接 XILINX FPGA,linux使用designware的PCI主控制器。下载XILINX DMA驱动,解…

C语言gdb调试

目录 1.gdb介绍 2.设置断点 2.1.测试代码 2.2.设置函数断点 2.3.设置文件行号断点 2.4.设置条件断点 2.5.多线程调试 3.删除断点 3.1.删除指定断点 3.2.删除全部断点 4.查看变量信息 4.1.p命令 4.2.display命令 4.3.watch命令 5.coredump日志 6.总结 1.gdb介绍…

[程序设计]—代理模式

[程序设计]—代理模式👳 本文章记录学习于——52.面向切面:AOP-场景模拟_哔哩哔哩_bilibili 最近闲来无事,在学习Spring的源码: 后面慢慢更新源码系列blog,希望多多关注🙏🙏 目前已经总结的b…