当前位置: 首页 > news >正文

【51单片机】程序实验1112.外部中断-定时器中断

主要参考学习资料:B站【普中官方】51单片机手把手教学视频

前置知识:C语言

单片机套装:普中STC51单片机开发板A4标准版套餐7

码字不易,求点赞收藏加关注(´•ω•̥`)

有问题欢迎评论区讨论~

目录

  • 程序实验11&12.外部中断-定时器中断
    • 中断系统
      • 中断概念
      • 中断结构
      • 中断寄存器
        • IE 寄存器
        • TCON寄存器
        • 中断优先级
        • 中断号
        • 中断响应条件
    • 外部中断
      • 硬件设计
      • 实验11 外部中断
    • 定时器中断
      • 定时器介绍
        • CPU时序
        • 定时器原理
        • 定时器结构
          • 工作方式寄存器TMOD
          • 控制寄存器TCON
        • 定时器工作方式
          • 方式0
          • 方式1
          • 方式2
          • 方式3
      • 定时器配置
      • 实验12 定时器中断

程序实验11&12.外部中断-定时器中断

中断系统

中断概念

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在很大程度上提高了单片机处理外部或内部事件的能力。引起程序中断的根源称为中断源

单片机处理中断的过程:

引起CPU中断的根源称为中断源

单片机的中断系统允许有多个中断源,当几个中断源同时向CPU发出中断请求时,需要解决中断优先级的问题,CPU会先执行优先级高的中断程序。单片机中对中断源有默认的优先级别,也可以通过对应的寄存器修改优先级。

如果CPU在执行中断源A的中断程序时发生了优先级更高的中断源B,那么CPU将转而执行B的中断程序再回到原来的位置继续执行A的中断程序,称为中断嵌套。中断嵌套在51单片机中应用很少,在STM32、DSP等中断较为复杂的单片机中经常遇到。

中断的优点:分时操作、实时响应、可靠性高。

中断结构

一个增强型51单片机提供了8个中断源,分别为外部中断INT0~3、定时器中断TIME0~2和一个串行口中断UART,而普通系列的51单片机均有的5个中断源为INT0、INT1、T0、T1、UART。

如图是一个中断结构,从上到下中断的优先级从高到低,左侧连接单片机管脚。在中断标志之前,外部中断需要先通过IT0、IT1选择中断触发方式,0为低电平触发,1为下降沿触发。中断标志在接收到中断后自动置为1,其中串行中断的中断标志经过一个或运算。IE寄存器 设置中断在程序中的有效与否,源允许分别控制每个中断的有效性,而总允许控制所有中断的有效性,只有中断对应的源允许和总允许都接通时才能被CPU接收。IP寄存器 部分配置中断优先级,1的优先级高于0,其余遵循默认优先级。

中断寄存器

IE 寄存器
76543210
字节地址:A8HEAESET1EX1ET0EX0

允许接收中断时将相应的位设为1。

TCON寄存器
76543210
字节地址:88HTF1TR1TF0TR0IE1IT1IE0IT0

IT0和IT1控制相应外部中断的触发方式,0为低电平触发,1为下降沿触发。TR0、TR1为定时器控制位,在定时器中断中会讲到。其余中断请求标志位皆由单片机内部自动设置。

中断优先级
中断源中断标志中断服务程序入口优先级顺序
外部中断0(INT0)IE00003H
定时/计数器0(T0)TF0000BH
外部中断1(INT1)IE10013H
定时/计数器1(T1)TF1001BH
串行口R1或T10023H
中断号

中断号在程序中指引CPU定位哪个中断并进入相应的中断服务程序。

中断源符号名称中断引起原因中断号
INT0外部中断0P3.2引脚低电平或下降沿信号0
T0定时器中断0定时/计数器0计数回0溢出1
INT1外部中断1P3.3引脚低电平或下降沿信号2
T1定时器中断1定时/计数器1计数回0溢出3
T1/R1串行口中断串行通信完成一帧数据发送或接收引起中断4
中断响应条件

满足下面三个条件CPU才能触发中断响应:

  • 中断源有中断请求。
  • 中断源的中断允许为1。
  • CPU开中断。
    以外部中断0为例:
EA = 1; //打开总中断开关
EX0 = 1; //打开外部中断0
IT0 = 0; //设置外部中断的触发方式
void int0() interrupt 0 //中断函数需要interrupt跟随中断号
{//编写用户所需的功能代码
}

外部中断

硬件设计

外部中断INT0和INT1分别为单片机管脚P32和P33的附加功能,而这两个管脚又与独立按键K3和K4连接。管脚自带上拉电阻默认为高电平,按键按下时管脚接地变为低电平,假如将外部中断配置为下降沿的触发方式则按键按下瞬间触发外部中断。

实验11 外部中断

实现功能:使用独立按键K3控制LED1亮灭。

#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;//定义按键和LED1的控制管脚
sbit KEY3 = P3^2;
sbit LED1 = P2^0;//毫秒延时函数
void delay_ms(u16 ms)
{u16 i, j;for(i = ms;i > 0;i--)for(j = 110;j > 0;j--);
}//外部中断0配置函数
void exti0_init()
{//寄存器的每一位在reg52.h头文件里均已定义IT0 = 1; //设置外部中断触发方式为下降沿EX0 = 1; //打开外部中断0开关EA = 1; //打开总中断开关
}void main()
{exti0_init();while(1){//当检测到中断,CPU会自动跳到主函数外的中断服务函数}
}//外部中断0服务函数
void exti0() interrupt 0
{delay_ms(10); //消抖if(KEY3 == 0){LED1 = !LED1; //切换LED1的亮灭状态}
}

定时器中断

定时器介绍

CPU时序
  • 振荡周期:为单片机提供定时信号的振荡源的周期。
  • 状态周期:两个振荡周期。
  • 机器周期:六个状态周期。
  • 指令周期:完成一条指令占用的时间,通常为1~4个机器周期。
    如果单片机的振荡频率为12MHz,则对应的机器周期为 1 μ s 1\mathrm{\mu s} 1μs
定时器原理

定时器的实质是一种加一计数器,随着脉冲的输入自动加一,可存储16位,分为高八位TH和低八位TL。当计数器数位全为1时,下一个脉冲将使计数器溢出,计数器归零的同时会使相应的中断标志置一。定时和计数的次数通过计数器的初值来设定, 次数 = 溢出值 − 初值 次数=溢出值-初值 次数=溢出值初值,对于较大的次数采用分段计数。

定时器结构

51单片机定时器的工作由两个特殊八位寄存器TCON和TMOD来控制。TMOD确定定时器的工作方式和功能,TCON低四位控制外部中断,高四位控制定时器的启停及溢出。

定时器的两个功能分别为定时功能和计数功能。定时功能接收来自CPU振荡器(OSC)的机器周期脉冲,计数功能接收来自单片机管脚P3.4和P3.5的脉冲。

工作方式寄存器TMOD
76543210
字节地址:89HGATEC/ T ˉ \bar{\mathrm{T}} TˉM1M0GATEC/ T ˉ \bar{\mathrm{T}} TˉM1M0

低四位控制T0,高四位控制T1。

  • GATE:门控位,控制定时器启动是否受外部中断影响。当GATE=0,只需通过寄存器TCON的TR0/TR1=1来使对应定时器启动;当GATE=1,在前面的基础上还需要来自外部中断引脚INT0/INT1的高电平才能启动。
  • C/ T ˉ \bar{\mathrm{T}} Tˉ:定时/计数模式选择位,定时器模式设为0,计数器模式设为1。
  • M1&M0:工作方式选择位,见下表:
M1M0工作方式说明
00方式013位定时/计数器
01方式116位定时/计数器
10方式28位自动重装定时/计数器
11方式3T0分成两个独立的8位定时/计数器;T1此方式停止计数
我们常用的为方式1和方式2,方式1用于定时/计数器工作,方式2用于串口通信波特率的生成,将在下一个实验涉及。
控制寄存器TCON
76543210
字节地址:88HTF1TR1TF0TR0
TF0/TF1:定时器溢出中断请求标志,由硬件自动完成,可通过调用查询定时器溢出状态。

TR0/TR1:定时器的运行控制位,设置为1时定时器开始工作,设置为0时定时器停止工作。

定时器工作方式
方式0

13位定时/计数器用到TH的八位和TL的低五位。

GATE控制原理:GATE经过一个非门后和INT引脚进行或门运算,若GATE=0,非门后为1,无论INT引脚为0还是1,或运算结果都为1;若GATE=1,非门后为0,只有INT引脚为1,或运算结果才为1。随后再和TR运行控制位进行与运算,当TR=1且或运算结果为1时定时器启动。

C/ T ˉ \bar{\mathrm{T}} Tˉ控制原理:当C/ T ˉ \bar{\mathrm{T}} Tˉ=1,虚线对应开关打到1,定时器接收T0引脚的脉冲;当C/ T ˉ \bar{\mathrm{T}} Tˉ=0,开关打到0,定时器接收机器周期脉冲。

方式1

方式1与方式0的区别为定时器TH的八位和TL的八位都参与计数。

方式2

方式2中用TL进行计数,TH进行装载。当TL溢出时,TH会自动将设置好的值装载进TL重新开始计数,适用于精确的脉冲信号发生器,例如串口通信。

方式3

方式3只适用于T0,此时T1停止工作。其中TL0可用于定时和计数,与中断标志TF0连接;TH0仅用于定时,与中断标志TF1连接。

定时器配置

  • 对TMOD赋值以确定T0和T1的工作方式。
  • 根据所要定时的时间计算初值并写入TH0、TL0或TH1、TL1。
  • 如果使用中断,则对EA赋值并开放定时器中断。
  • 设置TR0或TR1为1,启动定时/计数器定时或计数。
    对于初值的计算,可使用相关软件。下图中,方式1溢出值为 2 16 = 65536 2^{16}=65536 216=65536,减去1ms对应的机器周期数1000,将结果64536转化为十六进制,FC对应高八位写入TH,18对应低八位写入TL。

//以定时器0的配置为例
void time0_init()
{TMOD |= 0x01; //选择为定时器0模式,工作方式1TH0 = 0xFC; //给定时器赋初值,定时1msTL0 = 0x18;ET0 = 1; //打开定时器0中断允许EA = 1; //打开总中断TR0 = 1; //打开定时器
}

其中TMOD使用了或运算是为了不干扰高四位对定时器1的配置,赋值符号右侧将高四位都设为0不会改变原有高四位的值,如果配置定时器1则将低四位都设为0。

实验12 定时器中断

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

#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;//定义LED1的控制管脚
sbit LED1 = P2^0;//定时器0初始化函数
void time0_init()
{TMOD |= 0x01;TH0 = 0xFC;TL0 = 0x66;ET0 = 1;EA = 1;TR0 = 1;
}void main()
{time0_init();while(1){}
}//定时器0中断服务函数
void time0() interrupt 1
{//静态变量i累计毫秒值static u16 i = 0;//触发中断后将定时器重置为初值,使其立即重新计时TH0 = 0xFC;TL0 = 0x66;//毫秒值累加i++;//如果达到1秒if(i == 1000){i = 0; //重新累计毫秒值LED1 = !LED1; //切换LED1亮灭状态}
}

本篇完

相关文章:

【51单片机】程序实验1112.外部中断-定时器中断

主要参考学习资料:B站【普中官方】51单片机手把手教学视频 前置知识:C语言 单片机套装:普中STC51单片机开发板A4标准版套餐7 码字不易,求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验11&12.外部中断-定时器…...

webrtc-java:引领Java进入实时通信新时代

webrtc-java:引领Java进入实时通信新时代 项目地址:https://gitcode.com/gh_mirrors/we/webrtc-java 在现代互联网应用中,实时通信(Real-Time Communication, RTC)已成为连接人们的桥梁。而说起RTC技术的先锋,不得不…...

TongWeb7-东方通快速使用手册

TongWeb7-东方通 快速使用手册 文章目录 第1章 TongWeb7 产品介绍 1.1 概述1.2 规范支持 第2章 TongWeb7 安装 2.1 TongWeb7 安装要求 2.1.1 TongWeb7 支持的操作系统2.1.2 系统要求2.1.3 其他 2.2 安装TongWeb72.3TongWeb7 目录结构说明2.4 TongWeb7 的启动和停止 第3章 应用…...

JVM内存区块

大家好,经过前两篇文章的介绍,大家对数组也有了一定了解,其实所有的数组都是对象,我们在方法中引用数组的变量叫做引用变量(简称引用),那么数组到底是存放在哪里的呢,为什么引用再出…...

C语言单元总结

黑色加粗表示刷题刷到这样的题 红色加粗表示可能重要 单元一 程序设计宏观认识 C语言程序框架 C语言程序最基本的程序框架由两部分构成,分别是 1) 编译预处理 2) 函数组 C语言程序构成 C程序最大的特点就是所有的程序都是用函数来装配的,函数是构成…...

通过PS和Unity制作2D动画之一:创建形象

1、通过路径画出轮廓 使用路径的过程中,需要注意: 1)如果使用形状工具作图,比如使用椭圆工具画正圆形,需要设置其属性为“路径”。 2)使用路径选择工具,再按住Alt键点击某个路径,可…...

Notable是一款优秀开源免费的Markdown编辑器

一、Notable简介 ‌ Notable‌是一款开源的跨平台Markdown编辑器,支持Linux、MacOS、Windows以及国产操作系统等多种主流操作系统。它以其高颜值和强大的功能,成为了许多用户的首选工具。 主要特性 实时预览‌: Notable提供了实时预览功能&…...

基于MFC绘制门电路

MFC绘制门电路 1. 设计内容、方法与难点 本课题设计的内容包括了基本门电路中与门和非门的绘制、选中以及它们之间的连接。具体采用的方法是在OnDraw函数里面进行绘制,并设计元器件基类,派生出与门和非门,并组合了一个引脚类,在…...

C—指针初阶(2)

如果看完阁下满意的话,能否一键三连呢,我的动力就是大家的支持与肯定,冲! 二级指针 我们先看概念以及作用:用来存放一级指针的地址的指针 先看例子,我们逐一分析 我们先分析上面那个“1” 标注那里&#x…...

Linux 基础环境的开发工具以及使用(下)

1. make / Makefile 自动化构建的工具 1)引入 在我们进行一些大型的工程的时候,代码量是极其大,当我们代码在进行一系列的编译的时候,难免会出现一些错误,当我们对错误进行一系列的更改之后,难道我们需要…...

constexpr、const和 #define 的比较

constexpr、const 和 #define 的比较 一、定义常量 constexpr 定义:constexpr用于定义在编译期可求值的常量表达式。示例:constexpr int x 5;这里,x的值在编译期就确定为5。 const 定义:const表示变量在运行期间不能被修改&…...

期末复习-Hadoop综合复习

说明 以下内容仅供参考,提到不代表考到,请结合实际情况自己复习 目录 说明 一、题型及分值 二、综合案例题-部署Hadoop集群 或 部署Hadoop HA集群 案例 1:Hadoop 基础集群部署 案例 2:Hadoop HA 集群部署 案例 3&#xff…...

禁用SAP Hana错误密码锁定用户功能

背景 公司项目适配多种数据库其中包含SAP Hana,由于有同事的数据库连接工具保存了某个在用的数据库的旧密码,导致时不时会被锁用户。通过查询官方文档已解决,这里统一记录一下。 禁用密码锁定方法 以下按系统管理员和普通用户的解法分别列…...

Ubuntu 22.04加Windows AD域

说明:   Ubuntu 22.04系统通过realmd,sssd加入到 Active Directory 域,并为域用户配置sudo权限。同时为方便用户使用为Ubuntu系统安装wps与sogou中文输入法。 1. Ubuntu 22.04加入Windows AD域 1.1 首先配置网络,Ubuntu系统能…...

qt实现窗口的动态切换

先说一下整体思路。页面布局两个widget然后再将定时器和按钮关联起来。 定时器发出信号的时候,随着信号,不断地重新设置widget的宽度,实现窗口的动态切换。 具体操作如下: class QtWidgetsApplication4 : public QMainWindow {…...

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题②

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题② 模块A 基础设施设置与安全加固(200分)A-1 登录安全加固(Windows, Linux)A-2 Nginx安全策略(Linux)A-3日志监控(Windows)A-4中间件…...

【Vulkan入门】09-CreateFrameBuffer

目录 先叨叨git信息关键代码VulkanEnv::FindHostVisitbaleMemoryTypeIndex()TestPipeLine::CreateFramebuffers() 与网上大多数文章不同,其他文章基本上都使用窗口框架(X11、GLFW、WSL等)提供的surface来显示Vulkan渲染出的图像。我认为那样会…...

FPGA设计-Vivado的Off-Chip Termination设置问题

目录 简介: 设置规则: output strength(输出驱动器的电流驱动能力) slew rate(输出电压压摆率) Pull type(上下拉类型) On-chip termination(输入端/输出端的内置片上端接电阻) 输出端接电阻配置 简介: 经常遇到在FPGA设计时,很多人很迷惑这些关于硬件的终…...

GC常见垃圾回收算法,JVM分代模型

如何判断是垃圾?引用计数器和Root可达性算法 如何进行清除?标记清除、复制、标记整理 堆分代模型?Eden,Surevivor,Tenuring 一个对象从创建到消亡的过程? 对象什么时候进入老年代? 一、GC&a…...

面试题整理(三)

芯冰乐知识星球入口:...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...