串口中断和外部中断一起控制单片机LED的程序
时间: 2023-06-15 11:04:36 浏览: 148
下面是一个示例程序,可以通过串口和外部中断来控制单片机上的LED灯:
```c
#include <reg52.h>
sbit LED = P1^0; // 定义P1.0口为LED输出口
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 125; j++);
}
}
void UART_ISR() interrupt 4 // 串口中断函数
{
if (RI) { // 接收到数据
RI = 0; // 清除接收中断标志
if (SBUF == '1') { // 收到字符'1'
LED = 0; // 点亮LED灯
} else if (SBUF == '0') { // 收到字符'0'
LED = 1; // 熄灭LED灯
}
}
}
void EXT0_ISR() interrupt 0 // 外部中断函数
{
LED = ~LED; // 取反LED灯状态
delay(100); // 延时去抖动
}
void main()
{
TMOD = 0x20; // 定时器1工作在模式2(8位自动重载)
TH1 = 0xfd; // 波特率为9600bps
TL1 = 0xfd;
SCON = 0x50; // 串口工作在模式1
TR1 = 1; // 启动定时器1
ES = 1; // 使能串口中断
EX0 = 1; // 使能外部中断0
EA = 1; // 开启总中断
while (1);
}
```
在上面的代码中,我们首先定义了P1.0口为LED输出口,并实现了一个简单的延时函数。
然后,在程序的主函数中,我们启动了定时器1、使能了串口中断和外部中断0,并开启了总中断。在无限循环中,程序会一直等待中断的发生。
当串口接收到数据时,会触发串口中断函数。在串口中断函数中,我们首先判断是否接收到了数据,然后再根据接收到的数据来控制LED灯的状态。
当外部中断0发生时,会触发外部中断函数。在外部中断函数中,我们通过取反LED灯的状态来实现灯的闪烁。
需要注意的是,在使用外部中断时,由于按下按键会产生抖动,因此需要在函数中添加一个延时去抖动的代码。
阅读全文