#include <reg52.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 int flag = 1; // 设置外部中断标志 }
时间: 2024-02-14 07:12:27 浏览: 108
这段代码的功能是在 P0 口连接 8 个 LED 灯,按照顺序依次点亮每个 LED,并且当外部中断 0 触发时,将所有 LED 灯点亮并延时 10 秒后关闭所有 LED 灯。在外部中断 0 触发时,还设置了一个名为 "flag" 的变量,用于标记是否发生了外部中断。
不过,这段代码存在一个问题:在 extint0() 函数中,声明了一个名为 "flag" 的变量,并将其值设置为 1,但是这个 "flag" 变量是在函数内部定义的局部变量,其作用域只限于函数内部,无法影响到 main() 函数中的 "flag" 变量。因此,这个变量的设置实际上对程序没有任何作用,外部中断发生后,main() 函数中的 "flag" 变量仍然保持为 0。
要解决这个问题,可以将 "flag" 变量定义为全局变量,在 main() 函数外部进行定义,这样在整个程序中都可以使用这个变量。可以将 "flag" 变量定义为静态全局变量,或者通过 #define 宏定义来定义全局变量,例如:
```c
#include <reg52.h>
#define FLAG_OFF 0
#define FLAG_ON 1
static unsigned char flag = FLAG_OFF; // 定义静态全局变量 "flag"
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;
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 == FLAG_OFF) // 未发生外部中断
{
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
}
flag = FLAG_OFF; // 外部中断标志复位
}
}
}
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 = FLAG_ON; // 设置外部中断标志
}
```
这样,在 extint0() 函数中设置的 "flag" 变量就能影响到 main() 函数中的 "flag" 变量了。
阅读全文