【C51中断系统】


文章目录

  • 前言
  • 一、中断系统
  • 二、两点之中断系统
    • 1.中断系统的运行机制
      • 以具体的例子c程序来解释
    • 2.中断系统PX0作用


前言

中断相关知识—C51

一、中断系统

上篇文章已经讲了,当启动位打开,CNT计数溢出的时候,会触发溢出标志位置位,进而送入中断系统(对于中断系统本人理解:比如日常生活中,我们在做一件事,突然烧水壶开了,我们即要先暂时放弃做目前的事,转而去处理烧开水这个中断事件,当处理完成过后,又返回来继续处理之前的事)

而这里的举例:处理烧开水即中断程序;之前所做的事即main函数里面的主程序

二、两点之中断系统

1.中断系统的运行机制

【C51中断系统】_第1张图片
上述是C51中断系统框图:
左侧部分上一节已经讲过,分别是INT0(外部中断INT0,复用在单片机P3.2引脚上;T0即定时计数器0,复用在外部输入端P3.4引脚上;接下来是外部中断INT1,复用在单片机P3.3引脚上;定时计数器T1,复用在外部输入端P3.5接口上;然后是串口数据接收端RXD(RX),复用在管脚P3.0接口上;最后是串口数据发送端TXD(TX),复用在管脚P3.1端口上。

C51一共有5个中断源(引起中断的事情):INT0,T0,INT1,T1,串口
并且从左往右中断优先级依次降低,即当有两个及以上的中断发生,优先处理左边引发的中断源。

串口:我们烧录程序的时候/下载程序在proteus里面就已经使用过…

其中定时计数器引发中断的线路上一边文章已经讲过,TF0即对应定时计数器0的溢出标志位(前面线路已经省略CNT等框图),现在以定时器计数器0为例:

当TF0置1(溢出)之后,如果此时控制位ET0开启,并且中断总开关EA也闭合(注意:中断总开关【简称总中断】是关乎5个中断源的),那么定时计数器溢出中断请求就会被登记在中断表上,此时CPU会立即响应中断。

响应中断做了哪些事情:
1.执行对应的中断服务程序(指令)
2.并且硬件自动清除标志位(TF0)置0,以防止重复触发中断
3.在C51里面为这5个中断线分配了矢量地址,当有中断发生后,程序计数器会自动跳转至对应中断的矢量地址(程序计数器上上节讲)并且开始执行对应的中断程序。

以具体的例子c程序来解释

【C51中断系统】_第2张图片
这里的c语言中断服务程序接口其实就是函数头,且是C51编译器规定的,
要求函数返回值为void,函数中的参数也必须为空void

函数代码块要取名有意义_init等等类似初始化;interrupt(为关键字)+中断号
这个语句外加的(c语言本身是没有的)是为了告诉程序计数器对应的矢量地址的。

中断号和中断源,在图表中已经对应起来。
接下来以外部中断0的c程序来举例说明:

#include
sbit LED=P1^0;
sbit buzzer=P2^0;

void delay(void);
void main(void)
{	
	IT0=1//设置外部中断触发方式为下降沿触发
	EX0=1//对应的中断允许位打开
	EA=1//总中断打开
	PX0=0//IE0低优先级
	buzzer=0;//开启蜂鸣
	delay();
	buzzer=1;//关闭蜂鸣
	while(1)
	{
 		LED=0;//点亮LED
 		delay();
 		LED=1;//熄灭LED
 		delay();
    }	
}

//中断服务程序
void INT0_ISR(void) interrupt 0
{
	//IE0=0;对应的中断标志位是硬件自动清零,所以无需再软件清零
	buzzer=0;//开启蜂鸣
	delay();
	buzzer=1;//关闭蜂鸣
}

void delay(void)
{
	unsigned char i,j;
	for(i=0;i<200;i++)
	{
		for(j=0;j<200;j++){;}
	}
}

【C51中断系统】_第3张图片
这里的IT0是为了控制外部中断0的触发模式,IT0=0时,P3.2(INT0)为低电平时,进入逻辑脚非门变为逻辑真,从而触发外部中断0标志位至1,引发中断

当INT0(P3.2)上为方波信号(想上一节),且IT0=1,控制外部中断0的触发模式为下降沿触发,引发中断标志位IE0置1,引发中断

如果我们打开对应的中断允许位EX0,打开对应的总中断EA,后续就进入中断
(程序设置如上:如果中断函数不存在,虽然编译器可以通过,但触发中断后没有中断函数,会导致程序执行错误)

那么以上程序如何执行的呢?程序计数器PC首先开始:位定义,函数声明,进入main函数,然后蜂鸣器鸣叫依次,进入while循环,一直循环,当外部中断INT0/P3.2来一个下降沿过后即触发中断,此时程序计数器PC指向中断服务程序,执行中断语句(次程序写的是:蜂鸣器发鸣一次),执行完后,PC又指向上一次执行中断前的语句(在while循环里面),继续循环,等待下一次的中断触发…

2.中断系统PX0作用

【C51中断系统】_第4张图片
中断允许位,总中断都在寄存器IE中;PX0;PT0…这些是在IP寄存器中
当对应的IP寄存器对应的设置优先级的位置1的时候,则表明这个中断源的触发应该是高优先级,优先处理的(即当两个中断源同时触发的情况/或者正在执行某一个中断服务程序,另外一个优先级高的中断溢出标志位触发时,会立马放弃执行正在执行的中断程序,转而去执行另外一个中断优先级高的对应的中断程序,执行完这个中断优先级高的中断服务程序后,再转而执行之前的那个中断服务程序)

但是一般我们并没有去设置IP寄存器的优先级顺序(顺其自然)

你可能感兴趣的:(嵌入式大神之路,C51单片机,单片机,stm32,嵌入式硬件)