51单片机按键作为外部中断控制led灯代码
时间: 2023-07-02 10:09:44 浏览: 75
下面是一个简单的51单片机按键作为外部中断控制LED灯的代码:
```
#include <reg51.h>
sbit LED = P1^0; // 定义P1.0口为LED输出口
sbit KEY = P3^2; // 定义P3.2口为按键输入口
void Delay(unsigned int i)
{
while (i--);
}
void main()
{
IT1 = 1; // 设置INT1为下降沿触发
EX1 = 1; // 使能INT1外部中断
EA = 1; // 全局中断使能
while (1); // 循环等待按键中断
}
void KeyInterrupt() interrupt 2
{
Delay(1000); // 延时去抖动
if (!KEY) // 判断按键是否按下
{
LED = ~LED; // 控制LED灯状态
}
}
```
在上面的代码中,我们定义了一个LED输出口和一个按键输入口,并且设置了INT1为下降沿触发的外部中断。在主函数中,我们启用了INT1外部中断和全局中断,并且一直循环等待按键中断。在按键中断服务函数中,我们延时去抖动并且判断按键是否按下,如果按下则控制LED灯状态反转。
需要注意的是,由于按键存在抖动现象,我们需要在按键中断服务函数中加入延时去抖动的代码,否则可能会出现误触发的情况。
相关问题
51单片机按键作为外部中断控制led流水灯灯代码
以下是使用51单片机的按键作为外部中断来控制LED流水灯的代码:
```
#include <reg51.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit KEY = P3^2; //按键接在P3.2
void delay(unsigned int t) //延时函数
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<123;j++);
}
void main()
{
EA = 1; //开总中断
EX0 = 1; //开外部中断0
IT0 = 1; //设置外部中断0为下降沿触发
LED1 = LED2 = LED3 = LED4 = 0; //初始化LED灯
while(1)
{
LED1 = 1; //LED1亮
delay(500); //延时
LED1 = 0; //LED1灭
LED2 = 1; //LED2亮
delay(500); //延时
LED2 = 0; //LED2灭
LED3 = 1; //LED3亮
delay(500); //延时
LED3 = 0; //LED3灭
LED4 = 1; //LED4亮
delay(500); //延时
LED4 = 0; //LED4灭
}
}
void Interrupt0() interrupt 0 //外部中断0处理函数
{
delay(10); //延时去抖
if(KEY == 0) //判断是否按下按键
{
LED1 = LED2 = LED3 = LED4 = 0; //所有LED灯熄灭
}
}
```
以上代码中,我们使用了P1.0~P1.3口控制4个LED灯,P3.2口作为外部中断0的触发口,当按下按键时,外部中断0会被触发,执行Interrupt0()函数中的LED灯熄灭操作。当没有按下按键时,程序会一直循环执行LED流水灯效果。需要注意的是,在程序中我们加入了延时去抖,避免按键抖动导致误触发。
51单片机应用外部中断实现按键控制LED流水灯代码
以下是一个在51单片机上实现外部中断实现按键控制LED流水灯的示例代码:
```c
#include <reg51.h>
sbit LED1 = P1 ^ 0;
sbit LED2 = P1 ^ 1;
sbit LED3 = P1 ^ 2;
sbit LED4 = P1 ^ 3;
sbit KEY = P3 ^ 2;
void delayms(uint ms) {
uint i, j;
for (i = ms; i > 0; i--)
for (j = 114; j > 0; j--);
}
void init_interrupt() {
IT0 = 1;
EX0 = 1;
EA = 1;
}
void main() {
uchar state = 0;
init_interrupt();
while (1) {
switch (state) {
case 0:
LED1 = 1;
LED2 = 0;
LED3 = 0;
LED4 = 0;
break;
case 1:
LED1 = 0;
LED2 = 1;
LED3 = 0;
LED4 = 0;
break;
case 2:
LED1 = 0;
LED2 = 0;
LED3 = 1;
LED4 = 0;
break;
case 3:
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 1;
break;
}
delayms(500);
}
}
void key_isr() interrupt 0 {
delayms(10); // 延时消抖
if (KEY == 0) {
while (KEY == 0); // 等待按键松开
state++;
if (state > 3) {
state = 0;
}
}
}
```
这个代码使用外部中断来检测按键的按下和松开,并通过切换状态来控制LED灯的流水效果。按键连接在P3.2口上,LED灯连接在P1口上。在主循环中,程序循环显示4个LED灯的流水效果,并在每个灯之间延迟500毫秒。外部中断的中断服务函数(ISR)通过切换状态来控制LED灯的流水效果。