51单片机STC89C52RC——6.1 中断系统

news2024/11/27 4:34:41

一,文字层面理解 

        反正我看下面的几段文字时脑壳没有正常运转。一个头几个大

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

        当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。        

        当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。

二,图形代码结合理解中断

还是上图片吧,理解起来稍微容易下

再弄简单点

再入下面这两个图 

对于程序员可能还是要用代码才能够直观体现这个逻辑。

void main()
{		
	//主程序
    //......
    //暂停,跑去执行中断函数的代码
    //....中断函数执行中
    //恢复,继续执行主程序代码
    //......
    //主程序		
}

void time0() interrupt 1 //定时器0中断函数 【友情提示:在执行这个中断函数的代码时,主函数的程序一直是暂停状态,直到函数执行结束,所以这里面的代码不要有死循环或者长时间执行的逻辑代码。否则下个中断进入时,这个中断还没执行完。这个函数里面的代码尽量少,逻辑尽量简单,执行时间尽量短】
{
	//中断程序		
    //.......
    //中断程序			
}

三,STC89C52中断资源

3.1  中断源个数:8个

外部中断0、

定时器0中断、

外部中断1、

定时器1中断、

串口中断、

定时器2中断、

外部中断2、

外部中断3

3.2 中断优先级个数:4个

        STC89C51RC/RD+系列单片机的所有的中断都具有4个中断优先级,对于这些中断请求源可编程为高优先级中断或低优先级中断,可实现两级中断服务程序嵌套。一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令才能响应新的中断申请。以上所述可归纳为下面两条基本规则:

        1.低优先级中断可被高优先级中断所中断,反之不能。

        2.任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断当同时收到几个同一优先级的中断要求时,哪一个要求得到服务,取决于内部的查询次序。这相当于在每个优先级内,还同时存在另一个辅助优先级结构,STC89C51RC/RD+系列单片机各中断优先查询次序如下:

3.3 中断号:

3.4 中断的结构

 3.5 中断的触发

3.6 中断的处理

当某中断产生而且被CPU响应,主程序被中断,接下来将执行如下操作:

1.当前正被执行的指令全部执行完毕;
2.PC值被压入栈;
3.现场保护;
4.阻止同级别其他中断;
5.将中断向量地址装载到程序计数器PC;6.执行相应的中断服务程序。

当某中断被响应时,被装载到程序计数器PC中的数值称为中断向量,是同该中断源相对应的中断服务程序的起始地址。各中断源服务程序的入口地址(即中断向量)为:

当“转去执行中断”时,引起中断的标志位将被硬件自动清零。由于中断向量入口地址位于程序存储器的开始部分,所以主程序的第1条指令通常为跳转指令,越过中断向量区(LJMPMAIN)。

四,如何开启中断

 对于初学中断者来说,这感觉就是要给自己插上飞天的翅膀。只要学会了开启各种系统的各种中断,基本上其他难题也就迎刃而解。

4.1  开启中断 interrupt 0 (用独立按键K3模拟INT0发生中断 控制LED 二进制方式亮灭)

我这里只简单举例开启STC89C52RC的 第一个中断。也就是  interrupt  0  。

不要以为写了 个 interrupt 0 的函数 系统就会自动开启中断。错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错错

先写个接收中断的函数 也就是 interrupt 0


/**
 * 函    数:中断函数
 * 参    数:无
 * 返 回 值:无
 */
void time0() interrupt 0 
{
	P2++;
	/*
	分析:
	K3第一次按下:P2最开始是0xFF,加上1后,就变成了0x00,8个LED去亮起
	K3第二次按下:P2有0x00变成了0x01,第一个LED就会熄灭
	......
	
	*/
}

我们要想让程序发生中断,进入到我们些的这个中断函数 timer0 中。我们还得配置好寄存器的开关。我们看电路结构需要开启那些开关,如下图,我圈上的几个开关都给他合上。从优往左看。

PX0:优先级系统默认是最高级,不管

EA:全局中断开关合上  EA=1

EX0:允许INT0的中断进入。EX0=1;

IT0:设置低电平或者下降沿触发,我们先设置IT0=1(下降沿触发);

在看INT0 在板子上的针脚位置,他和P32是同一个。

 P32 我们在《51单片机STC89C52RC——2.1 独立按键控制LED亮灭》中有用到,我们用独立按键K3模拟INT0的中断触发。

按一下K3 就会触发中断。LED就会依次亮灭(注意LED的亮灭控制要写在中断函数中)

#include <REGX52.H> 
/**
 * 函    数:主函数
 * 参    数:无
 * 返 回 值:无
 */
void main()
{	 
	P2=0xFF;//上电熄灭8个LED
	IT0=1;	//外部中断 (低电平触发) 这里用独立按键P32 可模拟触发
	EX0=1;	//允许中断进入
	EA=1;	//打开全局中断开关
	while(1)
	{
		
	}
}
/**
 * 函    数:中断函数
 * 参    数:无
 * 返 回 值:无
 */
void time0() interrupt 0 
{
	P2++;
	/*
	分析:
	K3第一次按下:P2最开始是0xFF,加上1后,就变成了0x00,8个LED去亮起
	K3第二次按下:P2有0x00变成了0x01,第一个LED就会熄灭
	......
	
	*/
}

效果如下

分析:
    K3第一次按下:P2最开始是0xFF,加上1后,就变成了0x00,8个LED去亮起
    K3第二次按下:P2有0x00变成了0x01,第一个LED就会熄灭
    ......
    

外部中断 1  ,也就是INT1 引脚也可以用这个方式测试,INT1与P33是公用的,用独立按键K4可做中断测试。

4.2  开启中断 interrupt 1 (定时器Timer0/计数器 触发中断,实现LED闪烁)

如下图。要开启标红的这一路。配置还是比较多。不要嫌麻烦。挨着来。走一遍后,你会觉得像是打开了任督二脉。

按照图,还是从下往从右往左一次配置。

PX0: 优先级系统默认是最高级,不管

EA:全局中断开关合上  EA=1

ET0:允许Timer0/TF0 的中断进入。ET0=1;

我们再单独分析定时器器/计数器,

TR0:定时器开始运行;TR0=1;

TMOD:采用模式1(16位)

TL0=64535%256;(TL0=TIMS; [TL0只有8位,所以高位不会赋值过去,只有地位有效])

TH0=64536/256;(TH0=TIMS>>8;TH0也只有8位,TIMS右移8位后然低位溢出,高位就自动在低位了

每次中断发生后,都需要重新将TH0和TL0重新初始化。(在中断函数中重新赋值TH0和TL0)

#include <REGX52.H> 
/*宏定义定时器的初始值*/
#define TIMS (65536-12000000/12/1000)
unsigned int count=1000;//计数器  默认1000
void main()
{
	TMOD=0x01;	//设置模式1
	TL0=TIMS;	//设置定时器的低8位
	TH0=TIMS>>8;//设置定时器的高8位
	TR0=1;		//让定时器开始运行
	ET0=1;		//允许定时器发生中断溢出
	EA=1;		//打开全局中断
	while(1);	//主程序停止在此
}

/**
 * 函    数:定时器中断函数
 * 参    数:无
 * 返 回 值:无
 */
void timer0_interrupt() interrupt 1
{
	TL0=TIMS;		//重新初始化低位
	TH0=TIMS>>8;	//重新初始化高位
	if(count--==0)	//1毫秒*1000=1秒
	{	
		count=1000;	//重置计数
		P2_0=!P2_0;	//第一个LED 每秒熄亮一次
	}
}

 

有了以上两种 开启中断的方式,也就 

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

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

相关文章

接口自动化拓展:Flask框架安装、介绍及工作中的应用!

Flask是一个轻量级的Python Web框架&#xff0c;用于构建Web应用程序和API。它简洁而灵活&#xff0c;容易上手&#xff0c;并且非常适合用于开发小型到中型规模的应用程序。在接口自动化测试中&#xff0c;Flask可以作为服务器框架&#xff0c;用于搭建测试接口。 本文将从零…

Android:知道类加载过程面试还是卡壳?干货总结,一网打净“类”的基础知识!

多线程进行类的初始化会出问题吗&#xff1f; 类的实例化触发时机。 <clinit>()方法和<init>()方法区别。 在类都没有初始化完毕之前&#xff0c;能直接进行实例化相应的对象吗? 类的初始化过程与类的实例化过程的异同&#xff1f; 一个实例变量在对象初始化…

Docker(数据卷、自定义镜像、网络)

数据卷 数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 命令 说明 docker volume create 创建数据卷 docker volume ls 查看所有数据卷 docker volume rm 删除指定数据卷 docker volume inspect 查看某个…

视觉新纪元:解码LED显示屏的视角、可视角、最佳视角的最终奥秘

在璀璨夺目的LED显示屏世界里&#xff0c;每一个绚烂画面的背后&#xff0c;都离不开三个关键概念&#xff1a;视角、可视角与最佳视角。这些术语不仅是衡量显示效果的重要标尺&#xff0c;也是连接观众与精彩内容的桥梁。让我们一起走进这场视觉盛宴&#xff0c;探索那些让LED…

keepalived高可用,nginx+keepalived+apache架构的实现

目 录 一、概述&#xff1a; 二、实验架构图如图所示&#xff1a; 三、实验环境&#xff1a; 四、实现效果&#xff1a; 五、实验解析及步骤&#xff1a; 六、具体实现&#xff1a; 6.1 先关闭防火墙和核心防护&#xff1a;两条命令&#xff1a; 6.2 后端apache服务…

SSL/TLS握手

文章目录 SSL/TLSTLS历史发展层次结构SSL/TLS握手协议TLS1.2 Vs TLS1.3 安全通信协议是一类用于保护计算机网络上数据传输安全的协议。这些协议通过加密、身份验证和数据完整性机制来防止数据被窃听、篡改或伪造。以下是一些主要的安全通信协议&#xff1a;SSL/TLS, IPsec, SSH…

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

初始化数据 */ private void initData(Bundle savedInstanceState) { if (savedInstanceState ! null) mDatas savedInstanceState.getStringArrayList(“mDatas”); if (mDatas null) { mLoadingDialog new LoadingDialog(); mLoadingDialog.show(getFragmentMana…

CSS的 text-decoration

text-decoration text-decoration CSS 简写属性设置文本上的装饰性线条的外观。它是 text-decoration-line、text-decoration-color、text-decoration-style 和较新的 text-decoration-thickness 属性的缩写。 MDN text-decoration text-decoration 可以设置1到4个参数, 允许…

Type-C连接器厂商对检测实验室的要求及重要性解析

Type-C连接器厂商对检测实验室的要求与重要性 Type-C连接器作为一种高速、全功能的接口标准&#xff0c;被广泛应用于各类电子产品中。作为Type-C连接器的制造商&#xff0c;对于产品的质量和性能要求是至关重要的。为了确保产品符合规范并满足市场需求&#xff0c;Type-C连接…

Redis—Set数据类型及其常用命令详解

文章目录 一、Redis概述Set类型1 SADD:向集合&#xff08;Set&#xff09;中添加一个或多个成员2 SCARD:获取集合&#xff08;Set&#xff09;中成员数量3 SDIFF:获取多个集合之间的差集4 SDIFFSTORE:计算多个集合之间的差集&#xff0c;并将结果存储在指定的目标集合中5 SMEMB…

深度学习之数据集 Dataset总结

数据集 Dataset MindSpore提供了基于Pipeline的数据引擎&#xff0c;通过Dataset和Transforms实现高效的数据预处理。它提供了内置的文本、图像、音频等数据集加载接口&#xff0c;并提供了自定义数据集加载接口。此外&#xff0c;MindSpore的领域开发库也提供了大量的预加载数…

Android Studio无法连接夜神模拟器的解决方案

一、AS检测不到夜神模拟器 1、问题描述 在按照教程【如何安装和使用Android夜神模拟器】进入夜神的bin目录&#xff0c;输入连接命令回车后&#xff0c;终端显示的already connected to 127.0.0.1:62001&#xff0c;但是AS的Running Devices并没有显示夜神模拟器。 2、解决方…

自动驾驶仿真测试用例(完善版本)

进一步完善上述的测试用例&#xff0c;并根据不同的测试准备、车辆准备、车辆状态、车辆场景、车辆执行、可变因素、具体信号状态、通过标准和预期标准来详细描述每个测试用例。 用例编号测试类型测试项目测试描述车辆准备车辆状态车辆场景车辆执行可变因素具体信号状态通过标准…

从零实现GPT【1】——BPE

文章目录 Embedding 的原理训练特殊 token 处理和保存编码解码完整代码 BPE&#xff0c;字节对编码 Embedding 的原理 简单来说就是查表 # 解释embedding from torch.nn import Embedding import torch# 标准的正态分布初始化 也可以用均匀分布初始化 emb Embedding(10, 32) …

ubuntu 20.04 访问csdn报错 Secure connection failed

打扰了&#xff0c;csdn服务器的问题&#xff0c;和源没关系&#xff0c;后面又重新测试了一下。刚好那一刻网站连上了。 暂时没有好办法&#xff0c;等待一段时间就连上了&#xff0c;改host似乎也不太行。 问题原因&#xff1a; 我一边更新源 sudo apt update & apt up…

ANR灵魂拷问:四大组件中的onCreate-onReceive方法中Thread-sleep(),会产生几个ANR-

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { sleepTest(); } }); sleepTest方法详情 public void sleepTest(){ new Handler().postDelayed(new Runnable() { Override public void run() { Button but…

Spring Boot启动报错Lombok supports: sun/apple javac 1.6, ECJ

版本 idea 2023.3.4 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.32</version></dependency> 解决方式 File->Settings->Build, Execution, Deployment->Com…

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{溢出元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦&#xff0c;然后流了一身汗&#xff0c;然后没起来&#xff0c;九点多才起床背…

Android中屏蔽 电源键长按、Home键、Home长按

“电源键长按”&#xff08;globalscreen&#xff09; “Home键”&#xff08;homekey&#xff09; “Home长按”&#xff08;recentapps&#xff09; 我们可以使用广播来实现&#xff0c;如&#xff1a; [java] view plain copy print ? package com.jumpinus.test; im…

系统架构师概述

引言 系统架构设计师是项目开发活动中的众多角色之一&#xff0c;它可以是一个小组或者一个人或者是一个团队&#xff0c;架构师包含建筑师&#xff0c;设计师&#xff0c;创造者&#xff0c;缔造者&#xff0c;可以说架构师就是我们社会各个领域的创造者和缔造者。从组织上划分…