实验:按一下独立按键,灯亮,再按一次,灯灭
之前做过的独立按键实验也能实现这个功能,但是会占用很多CPU资源,不是好的方法,这里使用外部中断来实现比较合适
效果和独立按键实验一样
1. 下降沿方式触发:外部中断0
#include <reg52.h>
#define u16 unsigned int
#define u8 unsigned char
sbit LED1 = P2^0; // 要点亮的LED灯
sbit k3 = P3^2; // 控制LED灯的独立按键
// 延迟函数,延迟10us
void delay(u16 time)
{
while(time--);
}
// 中断条件
void int0Init()
{
EA = 1; // 中断总允许位
EX0 = 1; // 外部中断0允许位
// 中断标志:边沿触发方式(下降沿有效),因为独立按键常态下是断开的,处于高电平,按下按键后为低电平
IT0 = 1;
}
// 主函数
void main()
{
// 中断初始化
int0Init();
// 中断函数
while(1);
}
// 中断函数
void int0() interrupt 0
{
// 消抖,延迟10ms
delay(1000);
if(k3 == 0) // 按下k3按键
{
LED1 = ~LED1; // LED灯切换状态
}
}
1. 下降沿方式触发:外部中断1
#include <reg52.h>
#define u16 unsigned int
#define u8 unsigned char
sbit LED1 = P2^0; // 要点亮的LED灯
sbit k4 = P3^3; // 控制LED灯的独立按键
// 延迟函数,延迟10us
void delay(u16 time)
{
while(time--);
}
// 中断条件
void int1Init()
{
EA = 1; // 中断总允许位
EX1 = 1; // 外部中断1允许位
// 中断标志:边沿触发方式(下降沿有效),因为独立按键常态下是断开的,处于高电平,按下按键后为低电平
IT1 = 1;
}
// 主函数
void main()
{
// 中断初始化
int1Init();
// 中断函数
while(1);
}
// 中断函数
void int1() interrupt 2
{
// 消抖,延迟10ms
delay(1000);
if(k4 == 0) // 按下k3按键
{
LED1 = ~LED1; // LED灯切换状态
}
}
以上是外部中断0和外部中断1的实验,可以用外部中断0和外部中断1控制同一盏灯,模拟两个开关控制同一盏灯,按下一个开关,灯亮,去按下另外一个开关,灯灭
