51单片机——中断系统之外部中断实验,小白讲解,相互学习

news2024/11/27 16:34:27

 中断介绍

        中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学些单片机必须要掌握的。

        为了更容易的理解中断概念,我们先来举一个生活中的例子:你打开火烧上一壶水,然后去洗衣服,在洗衣服的过程中,突然听到水壶发水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。这个过程实际就发生了一次中断。如下图:

                                           

        对于单片机来讲,中断是指 CPU 在处理某一事件A时,发生了另一件事情B, 请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完毕后,再回到原来事件 A 被中断的地方继续处理事件 A(中断返回),这一过程称为中断。

                                                       

        在来看生活事例,与单片机中断结合分析,主要任务事洗衣服,水开报警这时一个中断请求,这一时刻相当于断点处,你响应中断去关火,然后将开水灌入暖水瓶中,这一行动实际上就是处理中断程序,灌完开水后再回去继续洗衣服,相当于处理完中断程序后再返回主程序继续执行主程序。这里需要注意的是,水开是随时都有可能的,但是无论什么时候开,只要一开你将立即去处理它,处理完后再回来继续接着洗衣服。单片机再执行程序时,中断也是随时可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。

单片机再执行程序时其程序流程图如下:

        引起 CPU 中断的根源称为中断源。中断源向 CPU 提出中断请求,CPU 暂时 中断原来的事务 A,转去处理事件 B,对事件 B 处理完毕后,再回到原来被中断 的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。

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

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

        中断的开启与关闭、设置启用哪一个中断等都是由单片机内部的一些特殊功 能寄存器来决定的,在前面章节的学习中我们仅对单片机 IO 口操作过(实际上 操作 IO 口即操作 IO 口寄存器,只不过编译器已经帮我们把 IO 口寄存器封装好 直接操作 IO 即可,这些可在 51 单片机头文件内查看),从本章开始就会介绍单片机内部更多的特殊功能寄存器以及如何配置它实现相应的功能。

        随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与慢速 I/O 设备的数据传送问题,而且还具有如下优点:

①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;

②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增 强;

③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高

中断结构

        STC89C5X 系列单片机提供了 8 个中断请求源,它们分别是:外部中断 O(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0 中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。(注意:51 系列单片 机一定有基本的 5 个中断,但不全有 8 个中断,需要查看芯片手册,通常我 们使用的都是基本的 5 个中断:INT0、INT1、定时器 0/1,串口中断)。所有的 中断都具有四个中断优先级(基本型只有两个)。用户可以用关总中断允许位 (EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中 断允许位来使 CPU 响应相应的中断申请。其中有些中断源可以用软件独立地控 制为开中断或关中断状态。每一个中断的优先级别均可用软件设置。高优先级的 中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优 先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来 决定系统先响应哪个中断。

STC89C5X 系列单片机的各个中断查询次序表如下图 所示:

        通过设置新增加的特殊功能寄存器 IPH 中的相应位,可将中断优先级设为 四级,如果只设置 IP 或 XICON,那么中断优先级就只有两级,与传统 8051 单 片机两级中断优先级完全兼容。上图中的中断查询次序即为中断号,这个中断号 在编程时非常重要,当中断来临时,只有中断号正确才能进入中断。

        下面我们以 51 单片机均有的 5 个中断来介绍,其内部结构框图如下所示:

 

        ①INT0 对应的是 P3.2 口的附加功能,可由 IT0(TCON.0)选择其为低电平有 效还是下降沿有效。当 CPU 检测到 P3.2 引脚上出现有效的中断信号时,中断标 志 IE0(TCON.1)置 1,向 CPU 申请中断。

        ②INT1 对应的是 P3.3 口的附加功能,可由 IT1(TCON.2)选择其为低电平有 效还是下降沿有效。当 CPU 检测到 P3.3 引脚上出现有效的中断信号时,中断标 志 IE1(TCON.3)置 1,向 CPU 申请中断。

        ③T0 对应的是 P3.4 口的附加功能,TF0(TCON.5),片内定时/计数器 T0 溢 出中断请求标志。当定时/计数器 T0 发生溢出时,置位 TF0,并向 CPU 申请中断。

        ④T1 对应的是 P3.5 口的附加功能,TF1(TCON.7),片内定时/计数器 T1 溢出中断请求标志。当定时/计数器 T1 发生溢出时,置位 TF1,并向 CPU 申请中 断。

        ⑤RXD 和 TXD 对应的是 P3.0 和 P3.1 口的附加功能,RI(SCON.0)或 T(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位 RI 或 当串行口发送完一帧串行数据时置位 TI,向 CPU 申请中断。

中断相关寄存器

1)中断允许控制

        CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE 控制的。

EX0(IE.0),外部中断 0 允许位;

ET0(IE.1),定时/计数器 T0 中断允许位;

EX1(IE.2),外部中断 0 允许位;

ET1(IE.3),定时/计数器 T1 中断允许位;

ES(IE.4),串行口中断允许位;

EA (IE.7), CPU 中断允许(总允许)位。

2)中断请求标志 TCON

IT0(TCON.0),外部中断 0 触发方式控制位。

        当 IT0=0 时,为电平触发方式。

        当 IT0=1 时,为边沿触发方式(下降沿有效)。

IE0(TCON.1),外部中断 0 中断请求标志位。

IT1(TCON.2),外部中断 1 触发方式控制位。

IE1(TCON.3),外部中断 1 中断请求标志位。

TF0(TCON.5),定时/计数器 T0 溢出中断请求标志位。

TF1(TCON.7),定时/计数器 T1 溢出中断请求标志位。

3)中断优先级

        同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先 级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:

4)中断号

外部中断配置 

        我们知道要让 51 单片机发生中断必须要满足以下 3 个条件,这 3 个条件的 顺序可以任意:

①中断源有中断请求;

②此中断源的中断允许位为 1;

③CPU 开中断(即 EA=1)。

以上三条同时满足时,CPU 才有可能响应中断。在使用中断时我们需要做什么呢?

①你想使用的中断是哪个?选择相应的中断号;

②你所希望的触发条件是什么?

③你希望在中断之后干什么?

比如我们配置外部中断 0,对应的配置程序如下:

EA=1;//打开总中断开关

EX0=1;//开外部中断 0

IT0=0/1;//设置外部中断的触发方式

        如果要配置的是外部中断 1,只需将 EX0 改为 EX1,IT0 改为 IT1。
        因为独立按键一端是共地的,当按下后对应单片机 IO 口被拉低,而默认单 片机 IO 口是高电平,这样就有一个下降沿过程,所以通常使用外部中断都是配 置为下降沿触发,即 IT0=1;
        在编写程序时通常我们会将外部中断的配置放到一个自定义函数内便于管 理维护。如下所示:
void exti0_init ( void )
{
        IT0 = 1 ; //跳变沿触发方式(下降沿)如果是=0是低电平触发
        EX0 = 1 ; //打开 INT0 的中断允许
        EA = 1 ; //打开总中断
}
当触发中断后即会进入中断服务函数,外部中断 0 中断服务函数如下:

void int0() interrupt 0 //外部中断 0 中断函数

{

//编写用户所需的功能代码

}

        在中断函数中 exti0 是函数名,可自定义,但必须符合 C 语言标识符定义规 则, interrupt 是一个关键字 ,表示 51 单片机中断。 后面的“0”是中断号,外 部中断 0 中断号为 0 ,如果是外部中断 1,则中断号为 2,这个可参考中断章节 的内容。 编写所需的代码不能太长,越短越好
硬件设计
本实验使用到硬件资源如下:
(1)独立按键模块(K3)
(2)LED 模块(D1)
        LED 模块和独立按键模块电路在前面章节已介绍过,这里就不多说。原理图 中 K3 键是连接在单片机 P3.2 口(外部中断 0),K4 按键是连接在 P3.3 口(外部中断 1)。

 

软件设计
        实现的功能是:使用独立按键 K3 控制 LED 亮灭。
/**********************************************************************************
****
实验名称:外部中断 0 实验
接线说明:
实验现象:下载程序后,当按下 K3 键可控制 D1 指示灯亮灭
注意事项:将红外接收传感器取下,防止对 P3.2 口干扰
***********************************************************************************
****/
#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义 LED1 管脚
sbit LED1=P2^0;
//定义独立按键 K3 控制脚
sbit KEY3=P3^2;
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1 时,大约延时 10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
    while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : exti0_init
* 函数功能 : 外部中断 0 配置函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void exti0_init(void)
{
    IT0=1;//跳变沿触发方式(下降沿),跳变沿触发方式(下降沿)如果是=0是低电平触发
    EX0=1;//打开 INT0 的中断允许
    EA=1;//打开总中断
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
/*******************************************************************************
再main()函数并没有对LED灯的操作,按下按键KEY3为什么会控制灯亮灭呢?
这是因为我们满足了 exi0_init()的出发条件 ,就会进入中断服务函数exti0(),中断函数执行完成,就又回到刚才中断的位置,现在while()是个死循环,不断的循环,如果我们按键按下,就又跳到中断服务函数exti0(),中断函数执行完成,就又回到刚才中断的位置while()循环里面,当没有按键按下的时候就一直再while()里面循环,只要又按键按下就跳到中断服务函数exti0()
*******************************************************************************/
void main()
{
    exti0_init();//外部中断 0 配置
    while(1)
    {
    }
}
//外部中断 0 中断函数,interrupt 是一个关键字不能写错写错是进不去中断的
//0后面的0是中断号,也不能写错,不同数字代表不同的中断
void exti0() interrupt 0 
{
    delay_10us(1000);//消斗
    if(KEY3==0)//再次判断 K3 键是否按下
    LED1=!LED1;//LED1 状态翻转
}
程序代码比较简单,首先定义 K3 键与 LED1 的控制管脚,然后定义了外部中 断 0 配置函数 exti0_init,该函数内容是按照前面介绍的配置方法实现,即开 启总中断、外部中断 0 功能,设置外部中断 0 为下降沿触发。然后进入 while 循环,在循环体内没有执行任何功能程序。 有人就会问,在主函数中怎么没有看到按键对 LED 的控制呢?因为我们在 exti0_init()函数内就已经把按键管脚配置为外部中断 0 下降沿触发,当有按键 按下,即会进入对应中断服务函数执行相应的功能程序,LED 的控制就在中断函 数内完成的。
实现的功能是:使用独立按键 K4 控制 LED 亮灭。
/**********************************************************************************
****
实验名称:外部中断 1 实验
接线说明:
实验现象:下载程序后,当按下 K4 键可控制 D2 指示灯亮灭
注意事项:将红外接收传感器取下,防止对 P3.3 口干扰
***********************************************************************************
****/
#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义 LED1 管脚
sbit LED2=P2^1;
//定义独立按键 K3 控制脚
sbit KEY4=P3^3;
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1 时,大约延时 10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
    while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : exti0_init
* 函数功能 : 外部中断 1 配置函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void exti0_init(void)
{
    IT1=1;//跳变沿触发方式(下降沿),跳变沿触发方式(下降沿)如果是=0是低电平触发
    EX1=1;//打开 INT0 的中断允许
    EA=1;//打开总中断
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
/*******************************************************************************
再main()函数并没有对LED灯的操作,按下按键KEY3为什么会控制灯亮灭呢?
这是因为我们满足了 exi0_init()的出发条件 ,就会进入中断服务函数exti0(),中断函数执行完成,就又回到刚才中断的位置,现在while()是个死循环,不断的循环,如果我们按键按下,就又跳到中断服务函数exti0(),中断函数执行完成,就又回到刚才中断的位置while()循环里面,当没有按键按下的时候就一直再while()里面循环,只要又按键按下就跳到中断服务函数exti0()
*******************************************************************************/
void main()
{
    exti0_init();//外部中断 0 配置
    while(1)
    {
    }
}
//外部中断 0 中断函数,interrupt 是一个关键字不能写错写错是进不去中断的
//2后面的0是中断号,也不能写错,不同数字代表不同的中断
void exti0() interrupt 2 
{
    delay_10us(1000);//消斗
    if(KEY4==0)//再次判断 K4 键是否按下
    LED2=!LED2;//LED2 状态翻转
}

实验现象
        使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口), 把编译后产生的.hex 文件烧入到芯片内,实现现象如下:当按下 K3 键,D1 指 示灯亮,再次按下 K3 键,D1 指示灯灭,如此循环。 如果下载的是外部中断 1 实验程序,实验现象如下:当按下 K4 键,D1 指示 灯亮,再次按下 K4 键,D1 指示灯灭,如此循环

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

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

相关文章

1.3配置P2P网络类型

1.3.1实验3:配置P2P网络类型 实验需求实现单区域OSPF的配置实现通过display命令查看OSPF的网络类型实验拓扑实验拓扑如图1-11所示 图1-11 配置P2P网络类型 实验步骤步骤1:[1] 配置IP地址 路由器R1

关于“档案大数据”的非主流看法

近日,反复拜读了前国家档案局局长杨冬权先生今年6.9档案日的大作《从“选时代”到“全时代”——智慧社会档案工作的历史性转折》,作为档案信息化从业者那真是倍感振奋,壮怀激烈! 这篇文章绝对可以用气势磅礴、高屋建瓴这样的词语…

Oracle Data Guard 角色转换(Role Transitions)

查询视图V$DATABASE的DATABASE_ROLE列可以看到数据库当前的角色。 1.角色转换介绍 Oracle Data Guard让你可以使用SQL语句或者通过Oracle Data Guard broker界面来动态更改数据库的角色,Oracle Data Guard支持以下的角色转换: 1&#xff0…

C语言——指针、数组的经典笔试题目

文章目录前言1.一维数组2.字符数组3.二维数组4.经典指针试题前言 1、数组名通常表示首元素地址,sizeof(数组名)和&数组名两种情况下,数组名表示整个数组。 2、地址在内存中唯一标识一块空间,大小是4/8字节。32位平台4字节,64位…

hive数据存储格式

1、Hive存储数据的格式如下: 存储数据格式存储形式TEXTFILE行式存储SEQUENCEFILE行式存储ORC列式存储PARQUET列式存储 2、行式存储和列式存储 解释: 1、上图左面为逻辑表;右面第一个为行式存储,第二个温列式存储; …

【C语言】程序环境和预处理|预处理详解|定义宏(上)

主页:114514的代码大冒险 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、程序的翻译环境和执行环境 二、详解编译和链接 1.翻译环境 2.编…

TCP协议十大特性

日升时奋斗,日落时自省 目录 1、确认应答 1.1、序号编辑 2、超时重传 3、连接管理 3.1、三次握手 3.2、四次挥手 4、滑动窗口 5、流量控制 6、拥塞控制 7、延时应答 8、捎带应答 9、面向字节流 10、异常情况 TCP协议: 特点:有…

浅析EasyCVR安防视频能力在智慧小区建设场景中的应用及意义

一、行业需求 城市的发展创造了大量工作机会,人口的聚集也推动了居民住宅建设率的增长。人民生活旨在安居乐业,能否住得“踏实”是很多劳动工作者最关心的问题。但目前随着住宅小区规模的不断扩大、人口逐渐密集,在保证居住环境舒适整洁的同…

C++入门:初识类和对象

C入门:类和对象1 本节目录C入门:类和对象11.auto关键字(C11)1.1类型别名思考1.2auto简介typeid运算符:获取类型信息1.3 auto的使用细则1.4auto不能推到的场景2.基于范围的for循环(C11)2.1范围for的语法2.2范围for的使用条件3.指针…

SpringCloud篇——什么是SpringCloud、有什么优缺点、学习顺序是什么

文章目录一、首先看官方解释二、Spring Cloud 的项目的位置三、Spring Cloud的子项目四、Spring Cloud 现状五、spring cloud 优缺点六、Spring Cloud 和 Dubbo 对比七、Spring Cloud 学习路线一、首先看官方解释 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式…

【Azure 架构师学习笔记】-Azure Logic Apps(6)- Logic Apps调用ADF

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps(5)- 标准和使用量类型的区别 前言 Logic Apps 和 ADF 的搭配使用是常见的组合,它们可以互相弥补各自的不足和…

opencv绘制椭圆

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

ViT自适应patch划分 ACM MM 2021

Transformer在计算机视觉方面取得了巨大的成功,而如何分割图像中的patch仍然是一个问题。现有的方法通常使用固定大小的patch embedding,这可能会破坏对象的语义。为了解决这一问题,作者提出了一种新的Deformable Patch模块(DPT&a…

CPP2022-30-期末模拟测试03

6-1 引用作函数形参交换两个整数 分数 5 全屏浏览题目 切换布局 作者 李廷元 单位 中国民用航空飞行学院 设计一个void类型的函数Swap&#xff0c;该函数有两个引用类型的参数&#xff0c;函数功能为实现两个整数交换的操作。 裁判测试程序样例&#xff1a; #include <…

Linux网络:聚合链路技术

目录 一、聚合链路技术 1、bonding作用 2、Bonding聚合链路工作模式 3、Bonding实现 一、聚合链路技术 1、bonding作用 将多块网卡绑定同一IP地址对外提供服务&#xff0c;可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding&#xff0c…

微信小程序DAY2

文章目录DAY2一、学习目标二、数据绑定2-1、插值表达式![请添加图片描述](https://img-blog.csdnimg.cn/f433301ae5de4094bc397a8c5ea216d7.png)2-2、Mustache语法的应用场景2-2-1、绑定属性2-2-2、三元运算三、事件绑定3-1、事件对象的属性列表3-2、target 和 currentTarget 的…

Win12呼之欲出

Win10系统的电子授权将要停止&#xff0c;20H2、21H2两个版本未来也没有非安全更新了&#xff0c;只剩下Win10 22H2最新版还会继续更新功能&#xff1b;考虑到Win10庞大的基数&#xff0c;至少10亿台电脑的装机量依然是不可忽视的&#xff0c;所以Win10马上被淘汰是不可能的&am…

Linux内核转储---Kdump,Crash使用介绍

文章目录Kdump简介Crash简介Ubuntu下安装使用方法Crash相关命令crash基本用法crash的基本命令help&#xff1a;crash所提供的调试命令log&#xff1a;查看日志信息&#xff0c;类似dmesg输出bt&#xff1a;查看异常时候的堆栈信息dev: 查看设备的情况dis&#xff1a;反汇编代码…

三维形体的表面积

三维形体的表面积 在 N * N 的网格上&#xff0c;我们放置一些 1 * 1 * 1 的立方体。 每个值 v grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。 请你返回最终形体的表面积。 例子&#xff1a; 输入&#xff1a;[[2,1],[1,0]]输出&#xff1a;18 解题思路&#xff1…

G-GhostNet(IJCV 2022)原理与代码解析

paper&#xff1a;GhostNets on Heterogeneous Devices via Cheap Operationscode&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/g_ghost_pytorch/g_ghost_regnet.py前言本文提出了两种轻量网路&#xff0c;用于CPU端的C-GhostNet和用于GPU端…