【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 寄存器
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节地址:A8H | EA | ES | ET1 | EX1 | ET0 | EX0 |
允许接收中断时将相应的位设为1。
TCON寄存器
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节地址:88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
IT0和IT1控制相应外部中断的触发方式,0为低电平触发,1为下降沿触发。TR0、TR1为定时器控制位,在定时器中断中会讲到。其余中断请求标志位皆由单片机内部自动设置。
中断优先级
中断源 | 中断标志 | 中断服务程序入口 | 优先级顺序 |
---|---|---|---|
外部中断0(INT0) | IE0 | 0003H | 高 |
定时/计数器0(T0) | TF0 | 000BH | ↓ |
外部中断1(INT1) | IE1 | 0013H | ↓ |
定时/计数器1(T1) | TF1 | 001BH | ↓ |
串行口 | R1或T1 | 0023H | 低 |
中断号
中断号在程序中指引CPU定位哪个中断并进入相应的中断服务程序。
中断源符号 | 名称 | 中断引起原因 | 中断号 |
---|---|---|---|
INT0 | 外部中断0 | P3.2引脚低电平或下降沿信号 | 0 |
T0 | 定时器中断0 | 定时/计数器0计数回0溢出 | 1 |
INT1 | 外部中断1 | P3.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
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节地址:89H | GATE | C/ T ˉ \bar{\mathrm{T}} Tˉ | M1 | M0 | GATE | C/ T ˉ \bar{\mathrm{T}} Tˉ | M1 | M0 |
低四位控制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 | 方式0 | 13位定时/计数器 |
01 | 方式1 | 16位定时/计数器 |
10 | 方式2 | 8位自动重装定时/计数器 |
11 | 方式3 | T0分成两个独立的8位定时/计数器;T1此方式停止计数 |
我们常用的为方式1和方式2,方式1用于定时/计数器工作,方式2用于串口通信波特率的生成,将在下一个实验涉及。 |
控制寄存器TCON
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节地址:88H | TF1 | TR1 | TF0 | TR0 | ||||
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ÿ…...
禁用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…...
面试题整理(三)
芯冰乐知识星球入口:...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...