中断系统:外部中断
实现功能
按下独立按键Key3,LED流水灯向右;按下Key4,LED流水灯向左。
单片机型号:STC89C52
硬件原理
中断系统就是当系统在进行一项工作时,需要终止这项工作,转而去执行另一项工作,当执行完成后再接着执行第一项工作。
如上图,STC89C52有两个外部中断(INT0、INT1)、两个定时器中断(T0、T1)、一个串口中断(RX/TX)
以外部中断 INT0 讲解,INT1 同理。
外部中断 INT0 中的 IT0 是选择中断触发方式的,如果等于 1 ,则是下降沿触发中断;如果等于 0 ,则是低电平触发中断。EX0 是 INT0 的中断允许,将其赋值为 1 ,则可以开启 INT0 的中断允许。EA 是总中断 ,只有将其打开才能允许中断。IP 是控制中断的优先级的,这里不做介绍,使用默认优先级。INT0 的管脚连在 P3^2 ,INT1 的管脚连接在 P3^3 ,和独立按键 Key3、Key4 连在同一个管脚,所以可以用独立按键 Key3、Key4 来触发外部中断。
中断标号为:
- INT0 0
- T0 1
- INT1 2
- T1 3
- RX/TX 4
软件编写
外部中断配置:
- 中断源有中断请求。
- 中断源的中断允许位为1.
- CPU开中断。(即 EA=1)
题目要求按下两个按键,流水灯需要往不同的方向流动,所以需要两个外部中断。首先将两个外部中断配置好,再写出两个外部中断需要执行的函数。在写外部中断函数时需要用到关键字 interrupt ,再在后面写上中断标号。例如外部中断 INT0 的中断函数这样写 void Int0() interrupt 0 ,千万不要将中断标号写错了。
#include <REGX52.H>
#include <intrins.h>
#define LED P2
//定义独立按键管脚
sbit Key3=P3^2;
sbit Key4=P3^3;
unsigned int i;
void delay(unsigned int x)
{
while(x--);
}
void Int0_Init() //外部中断 0 配置
{
IT0=1; //跳变沿触发方式(下降沿)
EX0=1; //打开 INT0 的中断允许
EA=1; //打开总中断
}
void Int1_Init() //外部中断 1 配置
{
IT1=1;
EX1=1;
EA=1;
}
void Int0() interrupt 0 //外部中断 0 中断函数
{
delay(1000);
if(Key3==0)
{
for(i=0;i<16;i++) //流水灯流动点亮16个灯后停止流动
{
delay(5000);
LED=_crol_(LED,1);
delay(5000);
}
}
}
void Int1() interrupt 2 //外部中断 1 中断函数
{
delay(1000);
if(Key4==0)
{
for(i=0;i<16;i++)
{
delay(5000);
LED=_cror_(LED,1);
delay(5000);
}
}
}
void main()
{
LED=~0x01; //流水灯初始赋值
while(1)
{
Int1_Init();
Int0_Init();
}
}