单片机两个外部中断控制灯左移右移代码reg51.h
时间: 2024-11-25 11:19:14 浏览: 35
在使用单片机(如8051系列)时,通常会利用外部中断来控制灯的左移和右移。这里以`reg51.h`文件为例,假设我们有一个定时器T0用于触发中断,并且有两个外部中断源INT0和INT1分别连接LED灯的左右切换。
首先,需要在`reg51.h`头文件中包含必要的寄存器声明:
```c
#include <reg51.h>
#define LED_LEFT P1 // LED1接INT0
#define LED_RIGHT P2 // LED2接INT1
// 定义中断服务函数
void EXTI0_ISR(void) interrupt 1; // INT0中断服务程序
void EXTI1_ISR(void) interrupt 2; // INT1中断服务程序
```
然后,在主程序或某个配置文件中设置定时器T0并启用中断:
```c
void timer_init(void) {
TMOD = 0x01; // 设置T0工作模式为计数初值自动复位
TH0 = 0xFD; // 设置T0定时时间(具体时间取决于晶振频率)
TL0 = 0xFD;
EA = 1; // 全局中断使能
ET0 = 1; // T0中断使能
}
// 外部中断服务函数,处理灯的移动
void EXTI0_ISR() {
if (P3^0) { // 判断INT0是否上升沿触发
// 左移操作,将LED_RIGHT清零,LED_LEFT置高
LED_RIGHT &= 0xFE; // 右灯灭
LED_LEFT |= 0x01; // 左灯亮
}
__中断返回__; // 结束中断并返回主程序
}
void EXTI1_ISR() {
if (P3^1) { // 判断INT1是否上升沿触发
// 右移操作,将LED_LEFT清零,LED_RIGHT置高
LED_LEFT &= 0xFE; // 左灯灭
LED_RIGHT |= 0x01; // 右灯亮
}
__interrupt_return__; // 结束中断并返回主程序
}
```
阅读全文