当前位置:   article > 正文

STC89C52的四个 外部中断 基本使用方法_89c52外部中断

89c52外部中断

1. STC89C52中断系统

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。STC89C52系列单片机提供了8个中断请求源,它们分别是:

  • 外部中断0(NT0); 对应I/O :P32
  • 定时器0中断;
  • 外部中断1(INT1); 对应I/O :P33
  • 定时器1中断;
  • 串口(UART)中断;
  • 定时器2中断;
  • 外部中断2(INT2); 对应I/O :P43
  • 外部中断3(INT3) 。 对应I/O:P42

所有的中断都具有4个中断优先级。用户可以用关总中断允许位(EAE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断申请:每一个中断源可以用软件独立地控制为开中断或关中断状态:每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。STC89C52系列单片机的各个中断查询次序如下表所示:在这里插入图片描述
相同优先级内的查询次数也就是我们在使用时的中断号: 函数名() interrupt 中断号

2. 示例程序

主函数:

#include "STC.h"//选择对应型号头文件,这里由于重定义不再选择 “reg52.h”
#include "delay.h" 
//#include "uart.h"
#include "ex_interrupt.h"

void main()
{	
	P1=0xff;
	P46 = 1;
	// 初始化外部中断
	Ex0_Init(Mode_1);  //初始化外部中断为模式1,下降沿触发
	Ex1_Init(Mode_0);  //初始化外部中断为模式0,低电平触发
	Ex2_Init(Mode_1);
	Ex3_Init(Mode_0);
	
	while(1)
	{	
		P46=!P46;
		delay_ms(500);	
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

ex_interrupt.h文件:

#ifndef _EX_INTERRUPT_H
#define _EX_INTERRUPT_H
#include "STC.h"
//外部中断子函数声明
void Ex0_Init(uint8 ExMode);
void Ex1_Init(uint8 ExMode);
void Ex2_Init(uint8 ExMode);
void Ex3_Init(uint8 ExMode);

extern uint8 Mode_0;
extern uint8 Mode_1;

//void MCU_PowerDown(); //STC MCU掉电唤醒

/*	STC89C系列 外部中断2,3 定义		*/
/*	如果使用reg52.h或STC89C52的头文件未定义,请取消如下注释	*/

//sfr P4 = 0xe8; 

//sbit INT2 = P4^3;  //中断输入引脚
//sbit INT3 = P4^2:

//sfr XICON = 0xc0;

//sbit PX3 = XICON^7;
//sbit EX3 = XICON^6;
//sbit IE3 = XICON^5;
//sbit IT3 = XICON^4;
//sbit PX2 = XICON^3;
//sbit EX2 = XICON^2;
//sbit IE2 = XICON^1;
//sbit IT2 = XICON^0;
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

在 ex_interrupt.c文件中简单配置一下,我这里采用模块化程序,在main()函数中调用初始化函数,并传入触发方式参数。

#include "ex_interrupt.h"

/*****************************************************
 * 函数名: void Ex0_Init()
 * 功	能 : 外部中断INT0 初始化函数
 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发)
 * 返回值: 无
 *****************************************************/
void Ex0_Init(uint8 ExMode)
{
	if(ExMode==Mode_0)
	{
		IT0 = 0;
	}	IT0 = 1;				//中断模式设置(1:下降沿触发, 0:低电平触发
		EX0 = 1;				//使能外部中断0
		EA = 1; 				//开总中断
}


/*****************************************************
 * 函数名: void Ex1_Init()
 * 功	能 : 外部中断INT1 初始化函数
 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发)
 * 返回值: 无
 *****************************************************/
void Ex1_Init(uint8 ExMode)
{
	if(ExMode==Mode_0)
	{
		IT1 = 0;
	}	IT1 = 1;				//中断模式设置(1:下降沿触发, 0:低电平触发)
		EX1 = 1;				//使能外部中断1
		EA = 1; 				//开总中断
}

/*****************************************************
 * 函数名: void Ex2_Init()
 * 功	能 : 外部中断INT2 初始化函数
 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发)
 * 返回值: 无
 *****************************************************/
void Ex2_Init(uint8 ExMode)
{
	if(ExMode==Mode_0)
	{
		IT2 = 0;
	}   IT2 = 1;				//中断模式设置(1:下降沿触发, 0:低电平触发)
		EX2 = 1;				//使能外部中断2
		EA = 1; 				//开总中断
}

/*****************************************************
 * 函数名: void Ex3_Init()
 * 功	能 : 外部中断INT3 初始化函数
 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发)
 * 返回值: 无
 *****************************************************/
void Ex3_Init(uint8 ExMode)
{
	if(ExMode==Mode_0)
	{
		IT3 = 0;
	}	IT3 = 1;				//中断模式设置(1:下降沿触发, 0:低电平触发)
		EX3 = 1;				//使能外部中断3
		EA = 1; 				//开总中断
}

// ====================================================

/****************************************************
 * 函数名:void ExInt0_ISR() interrupt 0
 * 功	能 :外部中断INT0 服务函数 引脚 P32
 * 返回值:无
 ****************************************************/
void ExInt0_ISR() interrupt 0
{
/* 用户中断服务任务	*/
	P10 = !P10;		//状态取反
}


/****************************************************
 * 函数名:void ExInt1_ISR() interrupt 2
 * 功	能 :外部中断INT1 服务函数 引脚P33
 * 返回值:无
 ****************************************************/
void ExInt1_ISR() interrupt 2
{
/* 用户中断服务任务	*/
	P11 = !P11;		//状态取反
}

/****************************************************
 * 函数名:void ExInt2_ISR() interrupt 6
 * 功	能 :外部中断INT2 服务函数引脚P43
 * 注	意 :在使用外部中断2时需要定义 P43 和 XICON寄存器,见.h文件
 * 返回值:无
 ****************************************************/
void ExInt2_ISR() interrupt 6
{
/* 用户中断服务任务	*/
	P12 = !P12;		//状态取反
}


/****************************************************
 * 函数名:void ExInt3_ISR() interrupt 7
 * 功	能 :外部中断INT3 服务函数   引脚P42
 * 注	意 :在使用外部中断3时需要定义 P42 和 XICON寄存器,见.h文件
 * 返回值:无
 ****************************************************/
void ExInt3_ISR() interrupt 7
{
/* 用户中断服务任务	*/
	P13 = !P13;		//状态取反
}


/***************************************************
* 函数名: void MCU_PowerDown()
* 功 能 : STC89C52系列单片机外部中断0(下降沿)唤醒掉电模式
		任何方式均可设置 掉电模式 并非只有外部中断
* 返回值: 无
* 使用说明:若使用请 将该函数放在主循环中
****************************************************/
void MCU_PowerDown()
{
	INT0=1;					//ready read INTO port
	while(!INT0);		// check INTO
	_nop_();				//空语句 延时
	_nop_();
	PCON = 0x02;		//MCU power down 唤醒掉电模式
	_nop_();
	_nop_();
	P1++;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136

3. 总结

经过对STC89C52四个外部中断的简单配置 使用,可见其和传统51单片机具有相似性,继承了传统控制方式,又添加了新的可用外设。但其中需要注意,对于STC89C52RC的P4端口的使用,在官方的头文件和keil 环境中的reg52.h中是没有定义的,外部中断INT2和INT3的控制寄存器,各位也没有定义。所以用户若要使用这两个额外中断,需要更具官方手册自行定义。但也要注意,区分不同系列,比如STC89C52RC的XICON寄存器首地址为:0xc0; P4端口的首地址为:0xe8;而在12系列中则不是这个对应关系了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/717927
推荐阅读
相关标签
  

闽ICP备14008679号