1、什么是中断?

        当中断发生时单片机将正在执行的程序暂时放下而去处理中断事件,当中断事件处理完毕后再接着去处理之前的事情,这样可以大大降低单片机的资源,提高执行效率。

2、51单片机的中断源

51单片机共有5个中断源:外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断,

每一个中断都对应一个中断向量,分别为INT0、T0、INT1、T1、串口中断。

3、思路步骤

接下来我们以外部中断0为例,来简单看一下单片机中断的用法。

实现功能:led灯轮流依次点亮熄灭,当外部中断0触发时(即按键按下),led全亮。

程序主要分为3个部分:中断初始化函数、中断服务子程序、主函数:

中断初始化函数:进行相关的配置

(1)打开中断的总开关EA=1;

(2)打开外部中断0开关(EX0=1);

(3)选择中断触发方式(IT0=1为下降沿触发方式,IT0=0为低电平触发方式);

中断服务子程序:中断处理函数。在此例题中,可以在中断服务子程序中写上让led全灭的程序。

主函数:调用中断初始化函数,执行相应程序。

4、代码实现:

        注意此时按键为独立按键模式(跳线帽接通J5的2 3引脚)。

#include"reg51.h"
#include"intrins.h"
 
void SelectHc573(unsigned char n)
{
	switch(n)
	{
		case 4:
			P2=(P2 & 0x1f) | 0x80;
			break;
		case 5:
			P2=(P2 & 0x1f) | 0xa0;
			break;
		case 6:
			P2=(P2 & 0x1f) | 0xc0;
			break;
		case 7:
			P2=(P2 & 0x1f) | 0xe0;
			break;
	}
}
 
//******************led流水灯相关函数*******************************
void Delay100ms()		//延时函数
{
	unsigned char i, j, k;
 
	_nop_();
	_nop_();
	i = 5;
	j = 144;
	k = 71;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void	led()    //led流水灯函数
{
	unsigned char i;
	SelectHc573(4);
	P0=0x01;
	for(i=0;i<8;i++)
	{
		P0=P0 << 1;
		P0=~P0;
		Delay100ms();
		P0=~P0;
	}
}
 
//**************中断初始化函数*******************************
void Init_int0()
{
	EA=1;//打开中断的总开关
	EX0=1;//打开外部中断0开关
	IT0=1;//选择中断触发方式为下降沿触发
}
//**************中断服务子程序*******************************
void SeviceInt0() interrupt 0
{
		SelectHc573(4);
		P0=0x00;   //中断触发后,led全亮
		Delay100ms();
}
 
//********************主函数***********************************
void main()
{
	Init_int0();
	while(1)
	{		
		led();   //led依次循环点亮熄灭
	}
}