外部中断未发生时,系统通过定时器完成定时0.5s的延时,使发光二极管呈从左到右的顺序一次被点亮,当有中断产生时,发光二极管则闪烁。按下P3.3所接按键,触发外部中断。
时间: 2024-03-14 13:46:44 浏览: 21
好的,以下是代码实现:
```c
#include <reg51.h>
void delay(unsigned int t) // 延时函数,t为延时时间
{
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 123; j++);
}
void main()
{
unsigned char i = 0, flag = 0;
TMOD = 0x01; // 设置定时器0为模式1
TH0 = (65536 - 50000) / 256; // 设置定时器初值
TL0 = (65536 - 50000) % 256;
ET0 = 1; // 打开定时器0中断
EA = 1; // 打开总中断
EX0 = 1; // 打开外部中断0
IT0 = 1; // 设置外部中断0为下降沿触发
while(1)
{
if(flag == 0) // 未发生外部中断
{
for(i = 0; i < 8; i++)
{
P0 = 1 << i; // 依次点亮每个LED
delay(5); // 延时0.5s
}
}
else // 发生外部中断
{
for(i = 0; i < 8; i++)
{
P0 = 1 << i; // 依次点亮每个LED
delay(1); // 延时0.1s
}
}
}
}
void timer0() interrupt 1
{
TH0 = (65536 - 50000) / 256; // 重新设置定时器初值
TL0 = (65536 - 50000) % 256;
}
void extint0() interrupt 0
{
P0 = 0xff; // 全部LED点亮
delay(100); // 延时10s
P0 = 0x00; // 关闭所有LED
flag = 1; // 设置外部中断标志
}
```
这里使用了定时器0中断和外部中断0,通过设置外部中断标志来判断是否发生外部中断。在未发生外部中断时,通过定时器实现0.5s的延时,依次点亮每个LED;在发生外部中断时,点亮所有LED并延时10s,然后关闭所有LED。