C51_外部中断

终端的概念

  • 当CPU在正常运行时,如果外部发生了紧急事件请求,CPU则会先暂停当前的工作,转而调用特定的的程序来处理这个紧急事件。处理完毕后,再回到原来中断发生的地方继续工作,这样的过程称为工作
  • 实现这种功能的系统称为中断系统,请示CPU中断的请求称为中断源,对紧急事件的处理程序称为中断服务程序

中断系统框架

在这里插入图片描述

中断源

在这里插入图片描述

中断触发条件

  • 低电平触发
    • 当外部中断输入引脚检测到低电平时中断触发,并且在低电平保持的时间内持续触发中断,直到引脚变为高电平
    • 注意:只有在CPU处理完成当前中断后,下一个中断才会被相应
  • 下降沿触发
    • 引脚电平从高电平到低电平跳变的瞬间,称为下降沿。当外部中断输入引脚检测到下降沿时,中断触发。当引脚保持低电平时,中断不会再次触发

中断请求标志

在这里插入图片描述
在这里插入图片描述

中断优先级

  • 如果单片机正在处理一个中断程序,此时又有优先级更高的中断请求,单片机会暂停当前的中断程序,转而处理新的优先级更高的中断程序。待新的中断处理完毕后,再继续处理之前的中断程序。这个过程称为中断嵌套
  • 在同一优先级中,如果有多个同一优先级的中断同时触发,则CPU的响应顺序取决于内部硬件电路形成的查询次序

中断处理

  1. 软件查询
  2. 硬件查询
  • 通常情况下,使用中断系统时都会采用硬件查询法
  • 终端服务函数是特殊的函数 函数类型 函数名 () interrupt 中断号 using 工作寄存器组号
  • 在编写终端服务函数时,应遵循以下规则
    • 只能由CPU中断处理时调用,不能在代码中直接调用
    • 不能进行参数传递,若在中断服务函数中包含参数类型声明将导致程序编译出错
    • 不能含有返回值,因此需要将终端服务函数的类型定义为void类型
    • 中断服务函数中不宜处理耗时较长的指令,避免延误下次中断响应

实例与代码解析

  1. 包含头文件
#include <reg52.h>
  1. 位定义LED
sbit LED1 = P2 ^ 4; // 定义LED1
sbit LED2 = P2 ^ 5;
  1. 编写中断配置函数
static void InitInterrupt(void); // 内部函数声明
static void InitInterrupt(void)
{
    IT0 = 1; // 设置外部中断0的触发方式为下降沿触发
    EX0 = 1; // 打开外部中断0的中断允许
    
    IT1 = 1;
    EX1 = 1;
    EA = 1; // 打开总中断允许
}
  1. 编写主函数
void main()
{
    InitInterrupt(); // 配置中断
    while (1)
    {
        
    }
}
  1. 编写外部服务中断函数
void Externa10_Handler() interrupt 0
{
    LED1 = ~LED1; // 翻转LED1的亮灭状态
}

void Externa11_Handler() interrupt 2
{
    LED2 = ~LED2; // 翻转LED2的亮灭状态
}
  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值