用户国营 发表于 5 天前

10天学会嵌入式技术之51单片机-day-4

 

第十二章 中断体系

中断体系是单片机用于处理外部紧急变乱的一种机制。中断体系工作的大抵流程如下
图所示:当 CPU 正在处理某项使命时,外部发生了某个紧急变乱,此时 CPU 会停息当前
的工作,转而行止理这个紧急变乱,处理完之后,再回到原来被中断的位置,继续处理原
来的工作。
https://i-blog.csdnimg.cn/direct/e9e54f1c273d4b2b84b02b7f2ef1e09c.png
中断体系使单片性可以大概实时响应外部变乱,提高了体系的灵活性和响应能力。
关于中断体系,我们先须要了解如下术语:
(1 )中断源
        中断源是指可以大概引发中断的变乱。
(2)中断标记位
中断标记位用于标识某个中断是否发生,每个中断源都有一个与之对应的中断标记位。
当某个中断发生时,相应的中断标位就会置为 1,当 CPU 检测到标记位时,就会处理相应的中断。当中断处理完毕后,中断标记位须要复位(置 0),以便吸收下一次中断,有些中
断源的标记位,会在 CPU 处理完中断后,自动复位,而有些则须要开发者手动复位,在使
用中断时,须要留意查看手册说明。
(3)中断服务程序
中断服务程序指处理中断的逻辑,当某个中断标记位置 1 时,CPU 会自动执行相应的
中断服务程序。
(4)中断优先级
中断优先级是指在多个中断同时发生时,单片机响应中断的先后顺序,并且高优先级
的中断可以打断低优先级的中断。

12.2中断源

STC89C52RC 共有 8 个中断源,8 个中断源可分为 3 类,3 个类别分别是外部中断、定
时器中断、串口中断,下面扼要先容每种范例。

12.2.1外部中断

(4个:INT0,INT1,INT2,INT3)
外部中断是指由单片机外部的紧急变乱触发的中断,通过向单片机的特定引脚发送特
定的信号触发。STC89C52RC 共提供了 4 个外部中断引脚,分别是 INT0,INT1,INT2,
INT3,如下图所示。
https://i-blog.csdnimg.cn/direct/4d9a1c60716941db92e09b54eb055adc.png
51 单片机的外部中断支持两种触发方式,分别是低电平触发和下降沿触发。
12.2.2 定时器中断

(3个:Timer0、Timer1、Timer2)
定时器中断是指由单片机内部的定时器触发的中断。
定时器是大多数单片机都具备的一个功能模块,用于实现定时使命。其用法是,设置
一个定时值,然后开始计时,待计时结束后,触发相应的定时器中断,开发者可以在中断
服务程序中编写定时使命的逻辑。
STC89C52RC 共有三个定时器,分别是 Timer0、Timer1、Timer2,每个定时器都有一
个相对应的中断。
12.2.3 串口中断

串口中断是由单片机串口触发的中断。
串口是单片机用于收发数据的重要接口之一,当单片机通过串口吸收到数据或者发送
完数据后都会触发相应的中断。
STC89C52RC 的串口引脚为 TxD 和 RxD,此中 TxD 用于发送数据,RxD 用于吸收数
据,如下图所示。
https://i-blog.csdnimg.cn/direct/b24bf04e9e0e4dfdb4f02a0751a80aa5.png

12.3 中断服务程序

中断服务程序是指用于处理中断的一段代码,当中断发生时,CPU 就会停息当前程序
的执行,转而执行对应的中断服务程序,处理完中断后再规复到原来的程序。
STC89C52RC 共有 8 个中断源,分为 4 个外部中断、3 个定时器中断和 1 个串口中断,
开发者可以为每个中断源声明相应的中断服务程序,中断服务程序的声明语法如下。
https://i-blog.csdnimg.cn/direct/afa1c13750814ae1b524b00076e54f3c.png
12.4 中断优先级

STC89C52RC 共有四个中断优先级,每个中断源都可以单独设置优先级。若多个中断
同时发生,优先级高的会被优先处理;若两个中断的优先级雷同,则根据此中断号决定处
理顺序,中断号越小越优先。
除此之外,高优先级的中断还可以打断低优先级的中断,也就是说当 CPU 正在处理一
个中断时,又发生了别的一个优先级比它还高的中断,此时 CPU 会停息原来中断的服务程
序,转而行止理这个高优先级的中断,处理完之后,再回到原来低优先级的中断服务程序。
这个机制叫做中断嵌套,STC89C52RC 支持两级中断嵌套。

第 13 章 外部中断——按键控制 LED 亮灭

13.1 需求形貌

利用外部中断的方式,通过 SW3 按键控制 LED1 的亮灭
13.2 硬件计划

若想通过外部中断的方式检测按钮,必须将按钮接入 4 个外部中断引脚之一,如下图
所示,可以看到 SW3 可用于触发外部中断 0。
https://i-blog.csdnimg.cn/direct/537f7423f9834cc79134bc85b7c7a2ba.png

13.3 外部中断利用说明

STC89C52RC 的外部中断须要举行如下配置才可利用。
13.3.1 启用中断

默认环境,CPU 会屏蔽所有中断哀求,也就是说 CPU 不会响应任何中断哀求,要利用
中断,必须先辈行启用。
每个中断源是否被启用,是由单片机内部的两个寄存器控制的,这两个寄存器分别是
IE(Interrupt Enable,中断允许)寄存器和 XICON(Auxiliary Interrupt Control,辅助中断
控制)寄存器。
两个寄存器的具体布局如下。
https://i-blog.csdnimg.cn/direct/6abf431812b24c59a35f3b6367edb5b3.png
两个寄存器各有 8 位,每位的作用可参考下图(STC89C52 系列中断体系布局图)。
https://i-blog.csdnimg.cn/direct/504c7fc0584c44bc9458ba2455e5232c.png
从上图可以看出,STC89C52 系列的中断体系具有两级控制,起首是 EA 总控制位,其
次是每个中断源各自的控制位。因此若须要启用某个中断,须要先将总控制位 EA 置位 1,
再将该中断自身的控制为置为 1。

13.3.2配置外部中断触发方式

STC89C52 系列的外部中断支持两种触发方式,分别是低电平触发和下降沿触发,4 个
外部中断各须要 1 个控制位用于设置触发方式,这 4 个控制位分布于如下两个寄存器中,
分别是 XICON(Auxiliary Interrupt Control,辅助中断控制)寄存器中、TCON(Timer 0
and 1 Control)寄存器,如下图所示。
https://i-blog.csdnimg.cn/direct/7a08685e217746bc8f2bb1e2c35f4d78.png
4 个控制位的具体作用可参考下图(STC89C52 系列中断体系布局图)。
https://i-blog.csdnimg.cn/direct/c1736628ab134388bf90562e451f96f6.png
从上图可以看出 IT0~IT3 分别用于设置外部中断 0 到 3 的触发方式,且 0 表低电平触
发,1 表现下降沿触发。
13.3.3 配置中断优先级(可选)

STC89C52 系列的中断体系支持四个优先级,所以每个中断源的优先级都须要通过 2
个控制位举行配置,8 个中断源共须要 16 个控制位,这 16 个控制位分布在如下 3 个寄存器
中,分别是 IPH(Interrupt Priority High,中断优先级高位)寄存器,IP(Interrupt Priority
Low,中断优先级低位)寄存器,XICON(Auxiliary Interrupt Control,辅助中断控制)寄
存器。
三个寄存器的具体布局如下。
https://i-blog.csdnimg.cn/direct/4f07f7409ab54353874104e0607aab27.png

https://i-blog.csdnimg.cn/direct/62d138a7f4de4daa8266a9dc9a4afed0.png

13.3.4 界说中断服务程序

外部中断 0 到外部中断 3 的中断号分别是:0、2、6、7,以外部中断 0 为例,此中断
服务程序应界说为
void INT0_Handler() interrupt 0
{
}
13.4 软件计划


13.4.1 实现思路

(1)启用外部中断 0
// 打开中断总开关
EA = 1;
// 打开外部中断 0 开关
EX0 = 1 (2)配置外部中断 0 的触发方式
当前案例选择下降沿触发更为公道,因为选择低电平触发会导致按键按下时,外部中
断一直被重复触发。
// 配置外部中断为下降沿触发
IT0 = 1;
(3)配置中断优先级
当前程序只有一个,优先级可省略不配。
(4)中断服务程序
完成上述配置后,须要根据需求界说中断服务程序,当前需求相对比较简朴,中断服
务程序如下。
void INT0_Func() interrupt 0
{
    // 中断中打开 LED0
    LED0 = ~LED0;
} 13.4.2 完备代码

#include <STC89C5xRC.H> //包罗 STC89C52 的头文件#define LED0 P00void Init_INT0(){    // 打开中断总开关    EA = 1;    // 打开外部中断 0 开关    EX0 = 1;    // 配置外部中断为下降沿触发    IT0 = 1;}void main(){    Init_INT0();    while (1);}/*** @brief 中断函数中打开 LED0,代表当触发中断时,LED0 会打开。* 根据我们之前的设置,当按下 SW3 时,P32 为低电平,此时 LED0 打开。** interrupt 0 表现 0 号中断触发时执行该函数的逻辑* 假如用 C 语言编程,中断查询序次就是中断号*/void INT0_Func() interrupt 0
{
    // 中断中打开 LED0
    LED0 = ~LED0;
}





























免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 10天学会嵌入式技术之51单片机-day-4