不要用中断写,用1ms的延迟函数实现1s的亮灯
时间: 2024-12-17 22:56:28 浏览: 3
如果你不想使用中断来实现1ms的延时,可以利用C语言中的while循环配合硬件定时器或者软件计数器来模拟延时。这里我们先用软件模拟一个简单的时间循环,虽然这不是最精确的方式,但在某些场合可以作为基础演示。
以下是一个使用软件计数器实现1s亮灯,每1ms闪烁一次LED的例子:
```c
#include <reg52.h>
unsigned long last_time_ms = 0; // 上一次计时的时间点
void delay(unsigned long time_ms) { // 软件延时函数
unsigned long current_time = getticks(); // 获取当前系统时间
while ((current_time - last_time_ms) < time_ms) {
current_time = getticks(); // 更新当前时间
}
last_time_ms = current_time;
}
void led_on() {
P1_0 = 1; // LED打开
}
void led_off() {
P1_0 = 0; // LED关闭
}
int main(void) {
P1_0 = 0; // 初始状态关闭LED
while (1) { // 无限循环,实现1s的亮灯和1ms的闪烁
led_on(); // 点亮LED
for (int i = 0; i < 1000; i++) { // 模拟1ms延时,实际上这个循环次数会因CPU性能而有所不同
delay(1);
}
led_off(); // 关闭LED
}
}
```
在这个例子中,`delay()` 函数通过反复检查当前时间和上一次计时的时间差来模拟延时,而主循环则会在每次循环中点亮和熄灭LED。请注意,这种软延时方式不是非常精确,特别是在高负载条件下可能会有偏差。
阅读全文