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"
#include "delay.h"
#include "ex_interrupt.h"
void main()
{
P1=0xff;
P46 = 1;
Ex0_Init(Mode_1);
Ex1_Init(Mode_0);
Ex2_Init(Mode_1);
Ex3_Init(Mode_0);
while(1)
{
P46=!P46;
delay_ms(500);
}
}
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;
#endif
在 ex_interrupt.c文件中简单配置一下,我这里采用模块化程序,在main()函数中调用初始化函数,并传入触发方式参数。
#include "ex_interrupt.h"
void Ex0_Init(uint8 ExMode)
{
if(ExMode==Mode_0)
{
IT0 = 0;
} IT0 = 1;
EX0 = 1;
EA = 1;
}
void Ex1_Init(uint8 ExMode)
{
if(ExMode==Mode_0)
{
IT1 = 0;
} IT1 = 1;
EX1 = 1;
EA = 1;
}
void Ex2_Init(uint8 ExMode)
{
if(ExMode==Mode_0)
{
IT2 = 0;
} IT2 = 1;
EX2 = 1;
EA = 1;
}
void Ex3_Init(uint8 ExMode)
{
if(ExMode==Mode_0)
{
IT3 = 0;
} IT3 = 1;
EX3 = 1;
EA = 1;
}
void ExInt0_ISR() interrupt 0
{
P10 = !P10;
}
void ExInt1_ISR() interrupt 2
{
P11 = !P11;
}
void ExInt2_ISR() interrupt 6
{
P12 = !P12;
}
void ExInt3_ISR() interrupt 7
{
P13 = !P13;
}
void MCU_PowerDown()
{
INT0=1;
while(!INT0);
_nop_();
_nop_();
PCON = 0x02;
_nop_();
_nop_();
P1++;
}
3. 总结
经过对STC89C52四个外部中断的简单配置 使用,可见其和传统51单片机具有相似性,继承了传统控制方式,又添加了新的可用外设。但其中需要注意,对于STC89C52RC的P4端口的使用,在官方的头文件和keil 环境中的reg52.h中是没有定义的,外部中断INT2和INT3的控制寄存器,各位也没有定义。所以用户若要使用这两个额外中断,需要更具官方手册自行定义。但也要注意,区分不同系列,比如STC89C52RC的XICON寄存器首地址为:0xc0; P4端口的首地址为:0xe8;而在12系列中则不是这个对应关系了。
|