中断系统:外部中断
实现功能
按下独立按键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();}
}