STC89C52启动!!!(四)中断

单片机中断的定义

在单片机中,中断是一种机制,用于在特定事件发生时打断当前正在执行的程序流,转而执行预定义的中断服务程序。这种机制可以使单片机在处理实时事件或紧急任务时能够及时响应,提高系统的实时性和可靠性。

当单片机设置了中断并且中断条件发生时,单片机会立即停止当前正在执行的程序,保存相关的状态信息,然后跳转到预先定义的中断服务程序去执行。一旦中断服务程序执行完毕,单片机会返回到被中断的程序继续执行,保持原来的程序流程。

中断可以根据触发方式分为外部中断和内部中断:

  • 外部中断是由外部信号引起的,比如按键触发、传感器信号等。
  • 内部中断是由单片机内部的某些特定事件引起的,比如定时器溢出、串口接收数据等。

通过合理地使用中断,可以实现单片机对多任务的处理、实时数据的采集、外部事件的响应等功能。在单片机编程中,中断是一个非常重要且常用的功能,能够提高系统的灵活性和效率。 

首先来理解这里面的几个基础概念

中断源,中断向量,中断服务函数,中断标志位,中断允许控制位

  1. 中断源:指导致中断事件发生的原因或来源。在51单片机中,不同的外部或内部事件(比如定时器溢出、外部IO口状态变化等)可以作为中断源,当中断源满足中断触发条件时,会引起中断事件的发生。

  2. 中断向量(中断地址):中断向量是一个地址,用于存储特定中断的处理程序的起始地址。当中断事件发生时,单片机会根据中断向量找到相应的中断服务函数的地址,并跳转到该地址执行中断处理程序。

  3. 中断服务函数:也称为中断处理程序,是用来处理特定中断事件的一段代码。当中断发生时,CPU会自动跳转到相应中断向量指定的中断服务函数的地址处执行相应的处理逻辑,处理完毕后再返回到中断发生前的程序继续执行。

但是并不是所有的中断源都能引起中断事件,我们可以人为控制哪些中断源能引起中断事件

  1. 中断标志位:用于表示特定中断事件是否已经发生的标志位。当中断事件发生时,相应的中断标志位会被置位,告诉CPU该中断事件已发生,需要处理。在中断服务函数中通常会清除相应的中断标志位,以便下一次中断事件能够被正确地触发和处理。中断标志

  2. 中断允许控制位:决定中断源是否可以引起中断事件的。通过设置相应的中断使能控制位,可以灵活地控制各个中断源的中断功能,从而实现对中断的管理和控制。

补充说明:有些中断标志位会在内核响应之后自动清除,有一些需要我们在中断服务函数中手动进行清除。如果中断标志位没有处理好的话可能会导致反复进入,造成误操作。中断标志能告诉内核是哪一个中断源产生的,或者是中断源的哪一种触发条件 。

51单片机中中断系统的基本组成

5个中断源+4个寄存器:TCON , SCON , IE , IP

中断允许控制(IE)控制使能端


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

EA:中断允许总开关控制位。(1:所有中断请求被允许;0:所有中断请求被屏蔽)

ES:串行口中断允许控制位。(1:允许串口中断;0:禁止串口中断)

ET1:定时器/计数器T1的溢出中断允许控制位。(1:允许T1溢出中断;0:禁止T1溢出中断)

EX1:外部中断1中断允许位。(1:允许外部中断1中断;0:禁止外部中断1中断)

ET0:定时器/计数器T0的溢出中断允许控制位。(1:允许T1溢出中断;0:禁止T1溢出中断)

EX0:外部中断0中断允许位。(1:允许外部中断1中断;0:禁止外部中断1中断)

中断标志(TCON)

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

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

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

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

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

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

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

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

TR0(TCON.4),控制定时器 0 的启动和停止标志位

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

TR1(TCON.6),控制定时器 1 的启动和停止标志位

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

TCON中需要我们手动设置的位

在51单片机的TCON寄存器中,有一些位是需要我们手动设置的,而另一些位则不需要手动设置,它们的功能如下:

需要手动设置的位:

  1. IT0(外部中断0类型控制位):用于设置外部中断0的触发方式,需要根据实际需求手动设置。
  2. IT1(外部中断1类型控制位):用于设置外部中断1的触发方式,同样需要手动设置。
  3. TR0(定时器/计数器0运行控制位):用于手动启动或停止定时器/计数器0。
  4. TR1(定时器/计数器1运行控制位):用于手动启动或停止定时器/计数器1。

不需要手动设置的位:

  1. IE0(INT0中断使能):外部中断0使能位,由硬件自动设置和清除。
  2. IE1(INT1中断使能):外部中断1使能位,同样由硬件自动设置和清除。
  3. TF0(定时器/计数器0溢出标志):定时器/计数器0溢出标志,由硬件自动设置和清除。
  4. TF1(定时器/计数器1溢出标志):定时器/计数器1溢出标志,同样由硬件自动设置和清除。

因此,在编程时,我们需要注意对于IT0、IT1、TR0和TR1这些位进行手动设置,而IE0、IE1、TF0和TF1这些标志位则由硬件自动管理,无需手动干预。

中断源与中断号

每个中断源都有固定的入口地址(即中断向量)和中断号,我们在程序设计的时候,不需要记住中断入口地址,但需要知道每个中断源对应的中断号。这个中断号可以来关联到我们的中断服务函数。中断源和中断号是一一对应的。

中断服务函数

中断服务函数特点

1.中断服务没有返回值,也不能带参数。那么问题来了,我们假如中断服务函数内部需要与外面的数据做交互我们应该怎么办呢?答案是:可以使用全局变量

2.函数名后面要跟上一个关键字interrupt,说明这是一个中断服务函数。

3.在关键字interrupt后面要跟上一个中断号,说明这个中断服务函数是为那个中断提供服务的。

中断优先级

一般来说我们不用修改中断的优先级,使用系统默认的即可。

中断响应条件


  中断源有中断请求

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

  CPU开中断(EA=1)

使用中断,需要做什么?
  你想使用的中断是哪个?选择响应的终端号。打开总开关EA,打开对应中断开关

  你所希望的触发条件是什么?设置对应的中断标志位

  你希望在中断之后干什么?书写中断服务函数

外部中断:

由图中可以看出51单片机中两路外部中断对应的引脚:INT0和INT1分别对应了引脚的P3.2和P3.3

下面的两幅图更加清晰

实例:外部中断控制LED灯开关

要求:1.我们的引脚外部中断INT1设置为下降沿触发(即按下按键K4之后,执行中断服务函数)通常来说我们更常用下降沿触发。启动后D8灯循环闪烁(模拟的是主程序),其他灯熄灭。

2.中断服务函数要求:外部中断响应后,能让D1灯的明暗状态反转

解释:为什么是按键K4按下之后能自动产生外部中断信号请求呢?因为K4按键和INT1使用的引脚一样,都是P33。

代码示例:

#include<regx52.h>
sbit LED1=P2^0;
sbit LED8=P2^7;
void delay(unsigned int t){
	while(t--);
}
void LED_shan(){
	LED1=0;
	delay(40000);
	LED1=1;
	delay(40000);
}
//初始化外部中断
void INI_INT1(){
	IT1=1;//设置外部中断的触发方式
	EA=1;//打开总中断开关
	EX1=1;//打开外部中断1单独的开关
}
//中断服务函数编写
void Service_INT1 ()interrupt 2{
	LED8=~LED8;
	delay(40000);
	delay(40000);
	delay(40000);
	delay(40000);
	delay(40000);
}
void main(){
	INI_INT1();
	while(1){
		LED_shan();
	}
}

这个代码中最重要的两段代码是:初始化外部中断以及中断服务函数的编写

在这里我添加了几个delay();目的是为了中断后我们可以观察到主程序LED1的闪烁停止,一直保持一个状态,以此来证明中断过程cpu不执行其他任务。

并且单片机中的int范围是nt 类型通常被定义为 16 位有符号整数,范围是 -32768 到 32767,c语言中

  • 对于 16 位系统,int 通常是 16 位,范围约为 -32,768 到 32,767。
  • 对于 32 位系统,int 通常是 32 位,范围约为 -2,147,483,648 到 2,147,483,647。

 所以这里我使用了多个delay。

欢迎大家指正!

参考文章:51单片机中断系统-CSDN博客

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值