89c51单片机利用中断控制两个灯闪烁。有按钮1 按钮2,按按钮1松开,灯1每隔50毫秒闪烁一次,灯2熄灭。按按钮2松开,灯2每隔50毫秒闪烁一次,灯1熄灭。调用延时函数 用keil c语言编写程序 不能用定时器
时间: 2024-10-25 19:18:00 浏览: 35
实验2:LED闪烁.zip_51单片机_AT98C51单灯闪烁_C语言程序
在89C51单片机上利用中断控制两个灯闪烁并响应按钮按下操作,可以按照以下步骤编写程序:
首先,我们需要初始化GPIO口,设置按键输入模式,并启用中断。这里假设P1口作为LED输出,P2口接按钮。
1. 定义全局变量:
```c
volatile bool btn1State = 0; // 按钮1状态
volatile bool btn2State = 0; // 按钮2状态
int timerValue = 0; // 中断计数变量
```
2. 设置中断向量表:
```c
#pragma interrupt ISR_BTN1() // 定义中断服务函数
void ISR_BTN1(void) {
if (btn1State == 1) { // 按下到释放
btn1State = 0;
// 开始灯1闪烁
}
}
#pragma interrupt ISR_BTN2()
void ISR_BTN2(void) {
if (btn2State == 1) {
btn2State = 0;
// 开始灯2闪烁
}
}
```
3. 主程序入口点:
```c
void main(void) {
// 初始化GPIO口
P1 &= ~(0b11111111); // 清除所有位
// 确定P1口某位对应灯1,P2口某位对应灯2
TRIS_P1 |= 0b00000001; // P1口相应位置为输出
TRIS_P2 |= 0b00000010; // P2口相应位置为输入
// 配置中断
EIE1 = 0b11000000; // 启用外部中断1和2
GIE = 1; // 全局中断使能
while(1) {
// 检查按钮状态
if (IN_P2 & 0x04) { // 按钮1检测
btn1State = 1;
}
if (IN_P2 & 0x08) { // 按钮2检测
btn2State = 1;
}
// 模拟延时,每50毫秒检查一次
timerValue++;
if (timerValue >= 50) {
timerValue = 0;
// 根据当前按钮状态调整灯的闪烁
if (!btn1State && !btn2State) {
P1 ^= 0b00000001; // 切换灯1状态
} else if (btn2State) {
P1 &= ~0b00000001; // 关闭灯1,点亮灯2
} else if (btn1State) {
P1 |= 0b00000001; // 关闭灯2,点亮灯1
}
}
}
}
```
阅读全文