51系列单片机的中断共有5个,其中外部中断共占两个。外部中断主要通过单片机的引脚P3.3、P3.4接收外部脉冲或高低电平触发CPU中断。与外部中断有关的多功能寄存器为IE、IP、TCON。
单片机的P0.0口接一只LED,按键接在P3.2端口,按键不按时,由于P3.2接有上拉电阻R3,所以P3.2此时为高电平+5V,如果按键按下,P3.2电源地短路,P3.2为低电平,利用外部中断INT0实现按键输入电路的电路具体如图。
为了消除键盘抖动现象,键盘两端并联滤波电容器C4。P3.2是单片机的外部中断的输入端,当按键按下时,让单片机执行外部中断服务程序,在中断服务中完成对LED的控制。
这里没有设置INT0是下降沿触发中断或是低电平触发中断,原因是按键按下,不管产生不产生键抖现象,总能使INT0引脚产生1个下降沿和低电平。如果设置只有下降沿才触发INT0中断,需要利用设置计时器控制寄存器TCON的IT0 = 1位,按键按下是否产生中断,可以利用程序检测TCON的IE0位。利用外部中断触发作为按键输入很好的解决了键盘抖动问题。
#include<reg51.h>
sbit LED0 = P0^0;
sbit key5 = P3^2;
bit i;
void int0_isr(void) interrupt 0 //INT0中断服务函数,INT0的中断号为0
{
i = !i;
LED0 = i; //INT0中断1次,LED工作状态变化1次
while(key5 == 0)EX0 = 0; //按键按下时刻,禁止中断
EX0 = 1; //按键抬起,允许中断
}
void main(void)
{
P0 = 0; //P0口全为低电平
EX0 = 1; //开启INT0中断
PX0 = 1; //INT0中断优先,可以省去
EA = 1; //开启总中断开关
IT0 = 0; //设置外部中断0为低电平有效触发
while(1); //等待按键按下,中断发生
}
如果需要多个键盘,把INT0口与I/O口之间用键盘连接,I/O输出低电平扫面信号即可。在数码管动态显示电路中,为了节省硬件资源,可以在INT0口和P2口之间接入键盘,实现8只按键输入。
仿真电路如图: