实验:按一下独立按键,灯亮,再按一次,灯灭
之前做过的独立按键实验也能实现这个功能,但是会占用很多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控制同一盏灯,模拟两个开关控制同一盏灯,按下一个开关,灯亮,去按下另外一个开关,灯灭