欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AT89C51单片机外部中断

程序员文章站 2022-06-08 20:02:37
...

C51单片机外部中断调用P3_2 ,P3_3口。
AT89C51单片机外部中断
中断方式有两种,分别为电平方式和脉冲方式。
中断请求有0和1。中断总允许为EA=1,
IE0:外部中断请求0标志位;
IT0:外部中断0触发方式设置位,IT0=1下降沿触发,IT0=0低电平触发;
IE1:外部中断请求1标志位;
IT1:外部中断1触发方式设置位,IT1=1下降沿触发,IT1=0低电平触发;
外部中断0中断服务程序的编写:

void 函数名()interrupt 0
{

}

外部中断1中断服务程序的编写:

void 函数名()interrupt 2
{

}

参考实验程序(主程序为P1口输出跑马灯程序),编写中断子程序使得发生外部中断0,且为低电平触发时,LED灯全亮。中断结束后LED继续接上次状态进行跑马灯闪烁。

#include<reg51.h>
#include<intrins.h>
sbit P3_2=P3^2;
void delay(unsigned char i);
void main()
{
	unsigned char ii;
	P1=0xFE;
	P3_2=1;
	EA=1;
	EX0=1;
	IT0=0;
	while(1)
	{
		P1=0xFE;
		for(ii=0;ii<8;ii++)
		{
			P1=_crol_(P1,1);
			delay(200);
		}
	}
}
void  delay(unsigned char i)    //延时函数,无符号字符型变量i为形式参数
{
	unsigned char j,k;          //定义无符号字符型变量j和k
	for(k=0;k<i;k++)            //双重for循环语句实现软件延
	for(j=0;j<255;j++);
}
void int_0() interrupt 0
{
	P1=0x00;
}

参考实验程序(主程序为P1口输出跑马灯程序),发生外部中断1,且为低电平触发时,LED灯闪烁5次,中断结束后LED继续接上次状态进行跑马灯闪烁。

#include<reg51.h>
#include<intrins.h>
sbit P3_3=P3^3;
void delay(unsigned char i);
void main()
{
	unsigned char ii;
	P1=0xFE;
	P3_2=1;
	EA=1;
	EX1=1;
	IT1=0;
	while(1)
	{
		P1=0xFE;
		for(ii=0;ii<8;ii++)
		{
			P1=_crol_(P1,1);
			delay(200);
		}
	}
}
void  delay(unsigned char i)    //延时函数,无符号字符型变量i为形式参数
{
	unsigned char j,k;          //定义无符号字符型变量j和k
	for(k=0;k<i;k++)            //双重for循环语句实现软件延
	for(j=0;j<255;j++);
}
void int_1() interrupt 2
{
	unsigned char a;
	for(a=0;a<5;a++)
	{
	 	P1=0x00;
		delay(200);
		P1=0xff;
		delay(200);
	}
}

参考实验程序(主程序为P1口输出跑马灯程序),编写中断子程序使得发生外部中断0,且为低电平触发时,LED灯全亮,中断结束后LED继续接上次状态进行跑马灯闪烁;发生外部中断1,且为低电平触发时,LED灯闪烁5次,中断结束后LED继续接上次状态进行跑马灯闪烁。

#include<reg51.h>
#include<intrins.h>
sbit P3_2=P3^2;
sbit P3_3=P3^3;
void delay(unsigned char i);
void main()
{
	unsigned char ii;
	P1=0xFE;
	P3_2=1;
	EA=1;
	EX0=1;
	IT0=0;
	EX1=1;
	IT1=0;
	while(1)
	{
		P1=0xFE;
		for(ii=0;ii<8;ii++)
		{
			P1=_crol_(P1,1);
			delay(200);
		}
	}
}
void  delay(unsigned char i)    //延时函数,无符号字符型变量i为形式参数
{
	unsigned char j,k;          //定义无符号字符型变量j和k
	for(k=0;k<i;k++)            //双重for循环语句实现软件延
	for(j=0;j<255;j++);
}
void int_0() interrupt 0  //0触发
{
	P1=0x00;
}
void int_1() interrupt 2		//1触发
{
	unsigned char a;
	for(a=0;a<5;a++)
	{
	 	P1=0x00;
		delay(200);
		P1=0xff;
		delay(200);
	}
}

AT89C51单片机外部中断