實驗:按一下獨立按鍵,燈亮,再按一次,燈滅
之前做過的獨立按鍵實驗也能實現這個功能,但是會占用很多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控制同一盞燈,模擬兩個開關控制同一盞燈,按下一個開關,燈亮,去按下另外一個開關,燈滅
