外部中断未发生时,系统通过定时器完成定时0.5s的延时,使8个发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。按下P3.3所接按键,触发外部中断。 编写89C52程序,用按键模拟单片机外部中断输入源,当按键按下时产生中断。外部中断未发生时,系统通过定时器完成定时0.5s的延时,使发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。
时间: 2024-03-17 13:40:08 浏览: 27
好的,下面是更详细的程序实现:
```c
#include <reg52.h> // 引入8052单片机头文件
// 定义全局变量
unsigned char led_index = 0; // 发光二极管的序号
unsigned char is_interrupt_triggered = 0; // 中断是否触发标志
// 定时器中断服务函数
void timer_isr() interrupt 1 {
TH0 = 0xFC; // 重新赋初值,定时0.5秒
TL0 = 0x66;
led_index++; // 发光二极管序号加1
if (led_index > 7) {
led_index = 0; // 循环显示
}
if (is_interrupt_triggered) {
P1 = 0xFF; // 闪烁
} else {
P1 = ~(1 << led_index); // 从左到右依次点亮
}
}
// 外部中断服务函数
void external_isr() interrupt 0 {
is_interrupt_triggered = 1; // 标记中断触发
}
// 主函数
void main() {
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 赋初值,定时0.5秒
TL0 = 0x66;
ET0 = 1; // 开启定时器0中断
EX0 = 1; // 开启外部中断0
EA = 1; // 开启总中断
while (1) {
if (!is_interrupt_triggered) {
// 如果中断未触发,则延时0.5秒
for (unsigned int i = 0; i < 50000; i++);
} else {
// 如果中断已触发,则闪烁
for (unsigned int i = 0; i < 25000; i++);
P1 = 0x00;
for (unsigned int i = 0; i < 25000; i++);
P1 = 0xFF;
is_interrupt_triggered = 0; // 清除中断标志
}
}
}
```
需要注意的几点是:
1. 定时器的初值需要根据实际情况进行微调,以达到精确的定时效果;
2. 延时循环的次数需要根据实际情况进行微调,以达到0.5秒的延时效果;
3. 在外部中断服务函数中,需要清除中断标志,否则会一直闪烁。
阅读全文