程序实现功能:
在实验板上左下方有一个黑色的独立按键(K3), 当我们按下它时, D1(LED灯)的状态就会取反.
思路分析:
我们令IT0 = 1, 即选择了"边沿触发", 所以每当独立按键按下时, 中断处理函数EX_INT0()就会执行.
当进入中断处理函数执行时, 若P32引脚的电平为低电平, 则说明K3按键已按下; 若P32引脚的电平为高电平, 说明K3按键已抬起.
"低电平触发"和"边沿触发"的区别:
①"低电平触发"是指在电平处于低电平态的时间内触发.
②"边沿触发"是指在电平由高 -> 低或由低 -> 高的一瞬间触发.
独立按键电路原理图:
抖动的处理:
为什么我们要在中断处理函数开始执行时先加入1ms延时模块, 是因为按键在按下或抬起时电平不是一下子稳定到低或高状态的, 而是在经历一小段时间的电平抖动后才到达稳定态: 为了对P32引脚电平判断的准确性, 先加入1ms的延时模块, 当电平稳定之后 再行判断.
程序源代码:
#include <STC89C5xRC.H>
void delay()//获得1ms延时
{
TH0 = 0xFC;
TL0 = 0x18;//65536 - 1000 = 64536 = FC18H
TR0 = 1;//开启定时器0
while(TF0 == 0);//等待定时器0计数溢出
TF0 = 0;
TR0 = 0;//暂停定时器0
}
void EX_INT0() interrupt 0//外部中断0处理函数
{
delay();//1ms延时消抖
if(P32 == 0)
{
P20 = ~ P20;//D1电平翻转
}
}
int main()
{
TMOD = 0x01;//设置定时器0的工作模式
TR0 = 0;
TF0 = 0;
P20 = 0;//开发板上D1亮
EA = 1;//中断总开关打开
EX0 = 1;//外部中断0开关打开
IT0 = 1;//边沿触发
//IT0 = 0 -> 低电平触发中断, IT0 = 1 -> 边沿触发中断
while(1)
{
;
}
return 0;
}