89c51单片机利用中断和延时控制两个灯闪烁。有两个按钮,按第1个按钮,灯1每隔50毫秒闪烁一次,灯2熄灭。按第2个按钮,灯2每隔50毫秒闪烁一次,灯1熄灭。用keil c语言编写程序
时间: 2024-10-24 20:15:02 浏览: 42
在89C51单片机上使用中断和延时控制两个灯的闪烁,并结合按键输入,可以按照以下步骤编写Keil C语言程序:
1. 首先,定义需要的头文件和变量:
```c
#include <reg51.h>
sbit LED1 = P1^0; // 灯1连接到P1.0口
sbit LED2 = P1^1; // 灯2连接到P1.1口
sbit BTN1 = P3^0; // 第1个按钮连接到P3.0口
sbit BTN2 = P3^1; // 第2个按钮连接到P3.1口
unsigned char count = 0; // 计数器用于延时
```
2. 设置定时器1的工作模式(例如,模式1,波特率为64)并初始化中断:
```c
TMOD = 0x01; // 设置T1工作于模式1
TH1 = 0xFD; // 计算50ms定时初值(对于模式1)
TL1 = 0xFA;
IE = 0b10000001; // 开启TIMI和INT1中断
```
3. 编写中断服务函数(ISR),这里假设中断优先级设置正确:
```c
void timer1_isr(void) interrupt 1 {
count++;
if (count >= 2) { // 当计数器满两次时关闭当前灯,切换灯亮的状态
count = 0;
LED1 ^= 1; // 灯1切换状态
if (!BTN1) { // 如果第1个按钮未按下,则灯2也切换
LED2 ^= 1;
}
}
}
```
4. 按钮中断处理:
```c
void button_isr(void) interrupt 0 {
if (BTN1 == 0 && !BTN2) { // 检查第1个按钮是否按下
TR1 = 1; // 启动定时器1
} else if (BTN2 == 0 && !BTN1) { // 检查第2个按钮是否按下
TR1 = 0; // 关闭定时器1
TH1 = 0xFD; // 重新设置定时器1
TL1 = 0xFA; // 以便灯2开始闪烁
LED1 = 0; // 灯1熄灭
}
}
```
5. 主程序循环:
```c
main() {
while(1) {
if (PIR1 & 0x01) { // 检查是否有定时器1中断
timer1_isr();
}
if (PIR0 & 0x02) { // 检查是否有按钮中断
button_isr();
}
}
}
```
阅读全文