单片机的外部中断(二)

前言:单片机的中断系统(一)


        80C51单片机提供两个外部中断口:  INT0(P3.2)和INT1(P3.3)引脚输入。这两个引脚是功能复用引脚,既可以作为普通V0口,也可作为外部中断输入引脚。下面以部中断0来讲述。80C51单片机在每个机器周期的S5P2期间扫描外部中断输入引脚的电平状态。当外部中断设置为下降沿触发时,若处理器在连续两个机器周期扫描到INT0引脚的电平先后为高电平和低电平时,就会设置中断标志位IE0为1,表示外部有中断申请,该中断申请信号会一直保持,直到该中断被响应,该标志由内部硬件自动清除当外部中断设置为电平触发方式时,在外部中断引脚INTo变为低电平时,IE0变为1,并一直保持为1,直到引脚INTo的输入变为高电平时,IE0位才清0。因此,选择低电平触发方式时,对INT0的电平持续时间有严格要求,必须保持INTo引脚为低电平,直到中断被响应才 能变高,而且在中断返回前必须变成高电平,以撤销中断请求。若低电平时问太短,则可能导致中断不会被响应;若太长,在中断子程序执行完后仍为低电平,则IE0会一直保持为1,这时会导致一次中断请求,得到多次响应 ——————http://www.51dzw.com/embed/embed_110007.html

外部中断0实验 

按键作为外部中断的产生源,按下按键,led状态反转。

图一:单片机引脚图
图二:独立按键接线图
图三:LED引脚图

程序:

#include<reg52.h>

sbit key3=P3^2;//外部中断0的引脚接口
sbit led=P2^0;

void delay(int dat)
{
	while(dat--);
}

void Int0Init()
{
	IT0=1;//下降沿触发
	//IE0=0;请求标志位,无触发,或响应中断后,硬件自动置0
	EX0=1;//外部中断0允许标志
	EA=1;//打开总终端
}

void main(void)
{
	Int0Init();
	while(1);//如果不写while(1),单片机在主程序中会不断循环执行,导致不断初始化		
}

void LedRever() interrupt 0	//0是外部中断的中断号
{
	 delay(1000);
	 if(key3==0)
	 {
	 	led=~led;
	 }
}

 比较有意思的是,中断函数中增加了消抖部分。

如果不加消抖,可能想程序可能想多次执行这个中断。如果消抖在外面,可能已经进入中断了,还没进行消抖。

外部中断1实验:

接线引脚图如图一、二、三。

普中教程代码:

/**************************************************************************************
*		              外部中断1实验												  *
实现现象:下载程序后按下K4按键可以对D1小灯状态取反。
注意事项:无。																				  
***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit k4=P3^3;  //定义按键K4
sbit led=P2^0;	 //定义P20口是led

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函 数 名         : Int1Init()
* 函数功能		   : 设置外部中断1
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Int1Init()
{
	//设置INT1
	IT1=1;//跳变沿出发方式(下降沿)
	EX1=1;//打开INT1的中断允许。	
	EA=1;//打开总中断	
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	Int1Init();  //	设置外部中断1
	while(1);		
}

/*******************************************************************************
* 函 数 名         : Int1()	interrupt 2
* 函数功能		   : 外部中断0的中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Int1()	interrupt 2		//外部中断1的中断函数
{
	delay(1000);	 //延时消抖
	if(k4==0)
	{
		led=~led;
	}
}

参考文章:

外部中断0中断请求标志位。

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/84678802