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