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

一,文字层面理解 

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

        中断系统是为使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个LEDIT0=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;	//设置模式1TL0=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.mzph.cn/web/32219.shtml

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

相关文章

【LLM之KG】KoPA论文阅读笔记

研究背景 知识图谱补全&#xff08;KGC&#xff09;是通过预测知识图谱中缺失的三元组来完善知识图谱的信息。传统方法主要基于嵌入和预训练语言模型&#xff0c;但这些方法往往忽视了知识图谱的结构信息&#xff0c;导致预测效果不佳。 研究目标 本文的研究目标是探索如何将…

【Linux】基础IO_3

文章目录 六、基础I/O3. 软硬链接4. 动静态库 未完待续 六、基础I/O 3. 软硬链接 使用 ln 就可以创建链接&#xff0c;使用 ln -s 可以创建软链接&#xff0c;直接使用 ln 则是硬链接。 我们对硬链接进行测试一下&#xff1a; 根据测试&#xff0c;我们知道了 硬链接就像一…

食品行业BC一体化运营方案

一、引言 在当前的市场环境下&#xff0c;食品行业面临着日益激烈的竞争和不断变化的消费者需求。传统的经营模式已无法满足现代消费者对高效、便捷和个性化服务的要求。因此&#xff0c;实施BC&#xff08;Business to Consumer&#xff09;一体化运营方案成为必然选择。通过…

某程序员:30岁了,老婆管钱,背着我买了50万股票,亏了20w,强制她清仓后又买了36万

“辛辛苦苦攒了几年钱&#xff0c;本想买房买车&#xff0c;结果全被老婆炒股亏掉了&#xff01;” 近日&#xff0c;一位30岁的程序员大哥在网上吐苦水&#xff0c;引发了网友们的热议。 这位程序员大哥和妻子结婚后&#xff0c;一直秉持着“男主外&#xff0c;女主内”的传统…

c语言 课设 atm

功能需求分析 ATM功能主界面:显示所能进行的操作,用户可多次选择。 ATM注册界面:输入用户名,用户密码,确认密码,密码长度不是六位重新输入,两次密码不一致重新输入,输入账号。密码隐藏,实现退格换行对*无影响。多人注册 ATM登录界面:输入账号,密码,三次以内输入…

git常用操作汇总大全

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;入职小红书广告投放开发&#xff0c;很高兴认识大家&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博…

ThinkPHP6图书借阅管理系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6图书借阅管理系统 一 介绍 此图书借阅管理系统基于ThinkPHP6框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 ThinkPHP6mysqlbootstrapphpstudyvscode 二 功能 用户 1 登录/注销…

多路h265监控录放开发-(8)完成摄像机管理的修改和删除功能

xviewer.h public:XViewer(QWidget* parent Q_NULLPTR);//编辑摄像机void SetCam(int index);//121 public slots:void AddCam(); //新增摄像机配置120void SetCam(); //121void DelCam(); //121 private:Ui::XViewerClass ui;QMenu left_menu_; xviewer.cpp void XView…

LeetCode 算法:排序链表 c++

原题链接&#x1f517;&#xff1a;排序链表 难度&#xff1a;中等⭐️⭐️ 题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输…

牛客练习题打卡--redis

A list保证数据线性有序且元素可重复&#xff0c;它支持lpush、blpush、rpop、brpop等操作&#xff0c;可以当作简单的消息队列使用&#xff0c;一个list最多可以存储2^32-1个元素; redis中set是无序且不重复的; zset可以按照分数进行排序 &#xff0c;是有序不重复的; Redi…

Arduino入门4——基于millis函数、定时器中断的多任务框架

Arduino入门4——基于millis函数、定时器中断的多任务框架 millis函数定时器中断总结&#xff08;笔者的碎碎念。。。。。。。。&#xff09; 上一期我们基于oled学习了库的调用&#xff0c;这一期我们基于millis函数和定时器中断&#xff0c;学习以下多任务框架。但是我们本期…

CentOS9镜像下载地址加速下载

CentOS 9 是 CentOS 项目的最新版本之一&#xff0c;它基于 RHEL&#xff08;Red Hat Enterprise Linux&#xff09;9 的源代码构建。CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个免费的企业级 Linux 发行版&#xff0c;旨在提供一个与 RHEL 兼…

大模型项目落地时,该如何估算模型所需GPU算力资源

近期公司有大模型项目落地。在前期沟通时,对于算力估算和采购方案许多小伙伴不太了解,在此对相关的算力估算和选择进行一些总结。 不喜欢过程的可以直接 跳到HF上提供的模型计算器 要估算大模型的所需的显卡算力,首先要了解大模型的参数基础知识。 大模型的规模、参数的理解…

路由器基础配置以及静态路由配置

1、搭建网络 搭建网络拓扑、分配IP地址、划分网段、连接端口 2、配置路由器 路由器基础配置 //进入全局配置模式 Router#enable Router#conf t Enter configuration commands, one per line. End with CNTL/Z.//配置高速同步串口serial2/0 Router(config)#int ser2/0 Route…

21.智能指针(上)

目录 一、概念二、Box\<T\>2.1 概念与应用场景2.2 简单应用2.3 递归类型的创建 三、通过Deref trait将智能指针当作常规引用处理3.1 常规引用3.2 像引用一样使用Box\<T\>3.3 自定义智能指针3.4 函数和方法的隐式解引用强制转换3.5 解引用强制转换与可变性交互 四、…

docker简单快速使用上手

1.Docker是什么&#xff1f; Docker 是一个开源的容器化平台&#xff0c;主要用于开发、运输和运行应用程序。它通过提供轻量级的虚拟化机制&#xff0c;使得开发者可以在一个隔离的环境中运行和管理应用程序及其依赖项。Docker 的核心组件包括镜像&#xff08;Image&#xff…

Python | Leetcode Python题解之第165题比较版本号

题目&#xff1a; 题解&#xff1a; class Solution:def compareVersion(self, version1: str, version2: str) -> int:n, m len(version1), len(version2)i, j 0, 0while i < n or j < m:x 0while i < n and version1[i] ! .:x x * 10 ord(version1[i]) - o…

18.cobra框架了解

目录 概述举例安装实践实践 概述 github cobra cobra 快速的实现一个命令行客户端&#xff0c;命令行解析工具。 cobra 中的主要概念 -Commands 表示执行运作-Args 执行参数-Flags 这些运作的标识符 举例 git clone 命令 git clone https://github.com/spf13/cobra.git -…

【Java】已解决java.nio.channels.OverlappingFileLockException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.nio.channels.OverlappingFileLockException异常 在Java的NIO&#xff08;New I/O&#xff09;编程中&#xff0c;java.nio.channels.OverlappingFileLockException是一…

ArrayList知识点(面试)

上一篇我们说了hashmap的相关知识点&#xff0c;这一篇我们再说一些ArrayList的相关知识&#xff0c;因为ArrayList也是我们项目中比较常用的。 ArrayList(底层是数组) 底层工作原理 首先&#xff0c;在构造ArrayList的时候会先看有没有指定容量&#xff0c;如果没有&#xf…