本文主要是介绍C51_外部中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
终端的概念
- 当CPU在正常运行时,如果外部发生了紧急事件请求,CPU则会先暂停当前的工作,转而调用特定的的程序来处理这个紧急事件。处理完毕后,再回到原来中断发生的地方继续工作,这样的过程称为工作
- 实现这种功能的系统称为中断系统,请示CPU中断的请求称为中断源,对紧急事件的处理程序称为中断服务程序
中断系统框架
中断源
中断触发条件
- 低电平触发
- 当外部中断输入引脚检测到低电平时中断触发,并且在低电平保持的时间内持续触发中断,直到引脚变为高电平
- 注意:只有在CPU处理完成当前中断后,下一个中断才会被相应
- 下降沿触发
- 引脚电平从高电平到低电平跳变的瞬间,称为下降沿。当外部中断输入引脚检测到下降沿时,中断触发。当引脚保持低电平时,中断不会再次触发
中断请求标志
中断优先级
- 如果单片机正在处理一个中断程序,此时又有优先级更高的中断请求,单片机会暂停当前的中断程序,转而处理新的优先级更高的中断程序。待新的中断处理完毕后,再继续处理之前的中断程序。这个过程称为中断嵌套
- 在同一优先级中,如果有多个同一优先级的中断同时触发,则CPU的响应顺序取决于内部硬件电路形成的查询次序
中断处理
- 软件查询
- 硬件查询
- 通常情况下,使用中断系统时都会采用硬件查询法
- 终端服务函数是特殊的函数
函数类型 函数名 () interrupt 中断号 using 工作寄存器组号
- 在编写终端服务函数时,应遵循以下规则
- 只能由CPU中断处理时调用,不能在代码中直接调用
- 不能进行参数传递,若在中断服务函数中包含参数类型声明将导致程序编译出错
- 不能含有返回值,因此需要将终端服务函数的类型定义为void类型
- 中断服务函数中不宜处理耗时较长的指令,避免延误下次中断响应
实例与代码解析
- 包含头文件
#include <reg52.h>
- 位定义LED
sbit LED1 = P2 ^ 4; // 定义LED1
sbit LED2 = P2 ^ 5;
- 编写中断配置函数
static void InitInterrupt(void); // 内部函数声明
static void InitInterrupt(void)
{IT0 = 1; // 设置外部中断0的触发方式为下降沿触发EX0 = 1; // 打开外部中断0的中断允许IT1 = 1;EX1 = 1;EA = 1; // 打开总中断允许
}
- 编写主函数
void main()
{InitInterrupt(); // 配置中断while (1){}
}
- 编写外部服务中断函数
void Externa10_Handler() interrupt 0
{LED1 = ~LED1; // 翻转LED1的亮灭状态
}void Externa11_Handler() interrupt 2
{LED2 = ~LED2; // 翻转LED2的亮灭状态
}
这篇关于C51_外部中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!