51单片机入门:定时器与中断系统

定时器的介绍

定时器:51单片机的定时器属于单片机的内部资源,其电路的设计连接和运转均在单片机内部完成。根据单片机内部的时钟或者外部的脉冲信号对寄存器中的数据加1,定时器实质就是加1计数器。因为又可以定时又可以计数,又称之为定时/计数器

作用:在写程序时经常会用到延时代码,比如用循环来实现延时(即让CPU不断进行记数)。但CPU在记数(执行延时)的时候做不了其他的事情,且这种延时是不精确的。因此需要一个工具来帮助CPU进行记数,而这个工具便是定时器。

例如你想在十分钟后做某事,如果身边没有任何工具,你就要自己数600秒,而在你数数时无法分心做其他事。但如果身边有个闹钟,就能定一个10分钟的闹钟,而在这10分钟内你可以做别的事情。

需要注意的是定时器大部分使用情况要搭配中断系统

与定时器相关的寄存器:TH1、TL1、TH0、TL0、TMOD、TCON。

与中断相关的寄存器:IE、IP。


定时与计数

定时功能:通过内部或外接的晶振(即SYSclk),对内部寄存器中的值进行递增计数,当计数到预设值时,定时器会产生一个中断请求信号,通知CPU进行相应处理。(相当于闹钟响了提醒你该做事情了,即定时作用)

计数功能:主要通过外部引脚(T0 Pin/T1 Pin)来实现,只有当外部事件发生时才会产生一个脉冲信号,触发内部寄存器进行加1操作。(它不像定时功能一样以固定的频率递增计数)


定时器资源

以STC89C52为例,其定时器个数为3个(T0、T1、T2),T0、T1与传统的51单片机兼容,T2是此型号单片机增加的资源。

 注意:定时器的资源和单片机的型号关联在一起,不同型号可能含有不同的定时器个数和操作方式。但一般来说,T0、T1的操作是所有51单片机共有的。


CPU时序

指令周期:CPU每取出一条指令并执行这条指令,都要完成一系列的操作,这一系列操作所需要的时间称为指令周期。

机器周期(CPU周期):在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。

时钟周期:时钟周期T又称为振荡周期,由单片机片内振荡电路OSC产生,常定义为时钟脉冲频率的倒数,是时序中最小的时间单位。例如,若某单片机时钟频率为1MHz,则它的时钟周期T应为1μs。

三种周期的关系:指令周期由若干(通常1~4)个机器周期组成,而机器周期又包含若干(通常为12)个时钟周期。

状态周期:每个状态周期为时钟周期的两倍。

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


定时器工作模式

对于STC89C52的T1和T0均有四种工作模式:

模式013位定时器/计数器
模式116位定时器/计时器
模式28位自动重装模式
模式3两个8位计数器

 其中模式1最为常用,故只介绍模式1。模式1的内部连接如下所示,可分为三个部分:

298285e3eec04e9a8660bdae2fd175b1.jpeg

SYSclk:系统时钟,即晶振频率,通常为12MHz或11.0592MHz。

进位规则:模式1下,T0的定时器配置为16位定时/计数器,由TL0和TH0的8位(共16位)构成。当TL0的8位溢出时向TH0的8位进位 ,TH0技术溢出时,向TCON中的溢出标志为TF0进位(TF0由0变1)。

对于TL、TH可设置初始值来决定计数时间

//定时为1ms
TL0 = 0x66;		//设置定时初值  64535%256+1
//当计数到65535时还需再来一个脉冲才会产生溢出,故1ms的计数初值为64536
TH0 = 0xFC;		//设置定时初值  64535/256

计数速率:STC89C52系列的单片机的定时器有两种计数速率(分频):一种是12T模式,每12个时钟加1,与传统8051单片机相同;另一种是6T模式,每6个时钟加1,速度是传统8051单片机的两倍。

 计数器由时钟提供提供脉冲信号,经过分频器(12分频或6分频),每来一次脉冲则计数器加1,当计数到达65535时下一个脉冲会溢出,触发中断(即告诉CPU闹钟响了该干事情了)。

工作方式寄存器TMOD

TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1,不可按位寻址,具体如下:

01234567
字节地址:89HM0M1C/TGATEM0M1C/TGATE

C/T为定时/计数选择位,寄存器TMOD中的一位,用来控制选择开关:当C/T为1时,连接T0 Pin,为计数器功能;当C/T为0时,连接SYSclk(系统时钟),为定时器功能。

GATE为门控位,当GATE为0时,经过非门为1,进入或门(因为或门为有1出1,因此此时可忽略INT0),再进入与门,当TR0为1时才能出1,这样contorl开关才能连通;当GATE为1时,INT0必须为1,TR0为1时开关才能连通。

 M0/M1为四种工作模式设置位

M1M0工作模式说明
0 0模式013位定时/计数器
0 1模式116位定时/计数器
1 0模式28位自动重装
1 1模式3两个8位计数器

对于TMOD的初始化,例如我们要使用T0定时器(低四位),但不改变T1定时器(高四位)的1配置:


TMOD &= 0xF0;		//把TMOD低四位清零,高四位保持不变
TMOD |= 0x01;		//把TMOD的最低位置1,高四位保持不变

 工作方式寄存器TCON

TCON的高四位用于定时/计数器的启动和中断申请;低四位用于外部中断。可按位寻址,此处只介绍高四位。

01234567
字节地址:88H    TR0TF0TR1TF1

 TF1:T1溢出中断请求标志,T1计数溢出时由硬件自动使TF1=1。CPU响应中断后硬件自动使TF1=0。(TF1也可以由软件置1或0)

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

TF0、TR0:针对于T0,作用与上述的TF1、TR1一样。


 中断系统

中断系统是为了使CPU具有对外界紧急事件的实时能力而设置的。

中断:当CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完后再回到原来被中断的地方,继续原来的工作。实现这种功能的部件称为中断系统

4af4f05d813349a1adf205b401e3718c.jpeg

中断源:请示CPU中断的请求源称为中断源。中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断时,要进行优先级排序(优先处理最紧急的中断请求源)。CPU总是先响应优先级别高的中断请求。

中断优先级:决定先执行哪个中断。当同时出现多个中断请求时,CPU会按照优先级从高到低依次执行中断服务程序。

中断嵌套:当CPU正在处理一个中断源请求时,发生了另一个优先级高的中断源请求。CPU暂停对原来的中断源的服务程序,转而去处理优先级更高的中断请求源,处理完后再回到原低级中断服务程序,最后回到主程序。此过程为中断嵌套。这样的中断系统为多级中断系统,没有中断嵌套的系统为单级中断系统


中断源分类

对于传统的51单片机而言,共有5个中断源。同时因为单片机是向下兼容的,基本都含有这5个中断源。

外部中断0(INT0):由P3.2引脚输入的中断请求信号,中断序号为0。

外部中断1(INT1):由P3.3引脚输入的中断请求信号,中断序号为2。

定时器T0中断:由定时/计数器T0的定时或计数溢出所产生的中断请求信号,中断序号为1。

定时器T1中断:由定时/计数器T1的定时或计数溢出所产生的中断请求信号,中断序号为3。

串行口中断(ES):由串行数据发生完成(TI)或接收完成(RI)产生的中断请求,中断序号为4。

1026be5126bd4f429c4efaf467dc7f5e.png


中断相关的寄存器

TCON寄存器

01234567
字节地址:88HIT0IE0IT1IE1TR0TF0TR1TF1

 IT0:外部中断0的触发方式选择位。当它为1时,对应的引脚为下降沿触发中断;当它为0时,对应的引脚为低电平触发方式。

IE0:外部中断0的中断请求标志位。当它为1时触发中断,即开始向CPU发送中断请求;单片机响应完中断后重新由硬件置0。

IT1:外部中断1的触发方式选择位。与IT0的功能类同。

IE1:外部中断0的中断请求标志位。与IE0的功能类同。

中断允许寄存器IE

76543210
字节地址:A8HEA  ESET1EX1ET0EX0

 EA:总中断允许控制位。用来开启或屏蔽所有中断请求信号。当EA为1时,中断请求能够被响应;当EA为0时,屏蔽所有中断请求。

EA=1; //打开总中断,必备

ES:串行口中断允许控制位。为1时能够响应串行口的中断请求,为0则屏蔽。

ET1:定时/计数器1中断允许控制位。

EX1:外部中断1中断允许控制位。

ET0、EX0:分别为定时/计数器0、外部中断0的中断允许控制位。

中断优先级寄存器IP

76543210
字节地址:B8H   PSPT1PX1PT0PX0

PS为串行口中断优先级控制位;PT1为T1中断优先级控制位;PX1为外部中断1中断优先级控制位;PT0为T0的中断优先级控制位;PX0为外部中断0的中断优先级控制位。


中断服务函数

形式如下,当中断响应时执行函数中的代码。

void 函数名() intreeupt 中断号
{
    //执行你希望执行的任务
}

使用中断的基本代码:以使用定时器0为例

void main()
{
    EA=1;       //打开总中断的开关
    ET0=1;      //打开定时器0的中断开关
    TMOD=0x01;   //设置定时器0的工作模式、功能选择
    TR0=1;       //启动定时器0
    while(1)
    {
        //主程序
    }
}

void Timer0() interrupt 1   //定时器0的中断号为1
{
    //中断服务程序
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——排序之冒泡排序

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

HarmonyOS入门笔记1配置环境

文章目录 下载安装DevEco Studio配置环境先认识DevEco Studio界面工程目录工程级目录模块级目录 app.json5module.json5main_pages.json通知栏预览区 运行模拟器 下载安装DevEco Studio 去官网下载DevEco Studio完了安装 配置环境 打开已安装的DevEco Studio快捷方式进入配置…

Python爬虫:爬虫基本概念、流程及https协议

本文目录: 一、爬虫的基本概念1.为什么要学习爬虫1.1 数据的来源1.2 爬取到的数据用途 2.什么是爬虫3. 爬虫的更多用途 二、爬虫的分类和爬虫的流程1.爬虫的分类2.爬虫的流程3.robots协议 三、爬虫http和https1.http和https的概念2.浏览器发送HTTP请求的过,2.1 http…

【数据结构刷题专题】—— 二分查找

二分查找 二分查找模板题&#xff1a;704. 二分查找 二分查找前提&#xff1a; 有序数组数组中无重复元素 左闭右闭&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while (left <…

An Experimental Study of State-of-the-Art Entity Alignment Approaches论文阅读

最先进的实体对齐方法的实验研究综述 Title: An Experimental Study of State-of-the-Art Entity Alignment Approaches 日期: 2022 发表单位: IEEE github: https://github.com/DexterZeng/EAE 原文地址: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9174835 概括…

启扬RK3568核心板助力智慧步道轻装健身,打造全民健康生活新方式

随着物联网、AI智能等新技术的快速发展&#xff0c;智慧步道成为全国各地公园建设和全民健身公共服务设施改造的新主题。智慧步道基于物联网、人脸识别、大数据分析等技术&#xff0c;对人们的运动进行监测和数据采集&#xff0c;显示运动数据&#xff0c;包括里程统计、热量消…

档案四性检测可复用组件接口说明

nhdeep提供在归档、移交与接收、长期保存等各环节根据需求进行自主配置和调用的可复用组件&#xff0c;支持客户端和接口调用两种功能使用模式。档案四性检测组件为自建档案管理系统和各种业务系统&#xff08;如OA&#xff09;&#xff0c;提供标准化的档案四性检测功能利用&a…

YOLOv5改进系列:主干ConvNeXTV2结构助力涨点

一、论文理论 论文地址&#xff1a;ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders 1.理论思想 ConvNeXt V2 在 ConvNeXt 的基础上增加了两个创新点&#xff08;一个 framework 和一个 technique&#xff09;&#xff1a;全卷积掩码自编码器&…

人工智能 框架 paddlepaddle 飞桨 使用指南 使用例子 线性回归模型demo 1

安装过程&使用指南&线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下 conda create -n paddle_env117 python=3.9 由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 activa…

nuxt3使用自定义组件

说明&#xff1a;nuxt3只有components文件夹里面的页面会自动注册为组件&#xff0c;但是有些单独的页面也需要组件&#xff0c;但是也不是全局的&#xff0c;所以写在pages里面的页面&#xff0c;需要手动注册为组件使用 1.创建组件 在pages里面创建页面文件夹&#xff0c;在…

【node】express使用(三)

1、express.static快速托管静态资源 express:快速、开放、极简的Web开发框架。(npm第三方包&#xff0c;提供快速创建web服务器便捷方法) Express中文官网 (1) express快速创建web网站服务器以及api接口服务器 // 1、导入express const express require(express) // 2、创…

【 Vue 3 】Vue3.0所采用的CompositionApi与Vue2.x使用的Options Api 有什么不同?

1. 开始之前 Composition API可以说是Vue3的最大特点&#xff0c;那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的方式&#xff0c;都存在缺点TypeScr…

搭建Spark单机版环境

在搭建Spark单机版环境的实战中&#xff0c;首先确保已经安装并配置好了JDK。然后&#xff0c;从群共享下载Spark安装包&#xff0c;并将其上传至目标主机的/opt目录。接着&#xff0c;解压Spark安装包至/usr/local目录&#xff0c;并配置Spark的环境变量&#xff0c;以确保系统…

高效解决Visual Studio无法识别到自定义头文件

文章目录 问题解决方案 问题 说明你没有好好配置项目属性 解决方案 把头文件都集中存放到一个文件夹里 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&#xff0c;点赞关注收藏&#xff0c;你的每一个赞每一份关注每一次收藏都将是我前进路…

[C++]C/C++内存管理——喵喵要吃C嘎嘎5

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

鸿蒙Harmony跨模块交互

1. 模块分类介绍 鸿蒙系统的模块一共分为四种&#xff0c;包括HAP两种和共享包两种 HAP&#xff08;Harmony Ability Package&#xff09; Entry&#xff1a;项目的入口模块&#xff0c;每个项目都有且只有一个。feature&#xff1a;项目的功能模块&#xff0c;内部模式和En…

在Semantic Kernel中使用Qdrant向量数据库

本文将介绍如何在Semantic Kernel中使用Qdrant向量数据库&#xff0c;并演示如何在Semantic Kernel中进行向量更新和查询操作。 1. 背景 在前一篇文章《Qdrant 向量数据库的部署以及如何在 .NET 中使用 TLS 安全访问》中&#xff0c;我们介绍了如何使用 Docker 部署 Qdrant 向…

Python私有属性和私有方法

私有属性和私有方法 在实际开发中&#xff0c;对象的某些属性或者方法只希望在对象内部被使用&#xff0c;而不希望在外界被访问。 私有属性&#xff1a;对象不希望公开的属性 私有方法&#xff1a;对象不希望公开的方法 定义方式&#xff1a;在属性名或者方法名前添加两个下划…

代理重加密+GO开源代码

目录 一、场景说明 二、代理重加密流程 三、具体原理 本地密钥生成​编辑 加密数据​编辑 生成代理重加密密钥​编辑 密钥代理重加密​编辑 重解密密钥​编辑S X_A 解密数据​编辑 四、开源代码 一、场景说明 一个数据方想要将数据发布到云服务器上进行数据共享&am…

VITIS更新硬件平台

VITIS硬件平台更新以后如何重新导入 在之前建立的硬件平台上右击&#xff0c;选择Update Hardware Specification&#xff0c;选择最新导出的硬件平台文件&#xff1b; 重建板级支持包 选择复位重建BSP源文件&#xff0c;然后Clean&#xff0c;再然后Build 参考连接