arduino中的delay
时间: 2025-06-30 15:12:19 浏览: 9
### Arduino 中 `delay()` 函数的使用方法
Arduino 的 `delay()` 函数用于在程序执行过程中引入指定时间的暂停,单位为毫秒。例如,调用 `delay(1000)` 会暂停程序运行 1 秒钟。该函数常用于控制 LED 闪烁、传感器采样间隔等简单任务。
以下是一个典型的使用示例:
```cpp
void setup() {
pinMode(13, OUTPUT); // 设置引脚 13 为输出
}
void loop() {
digitalWrite(13, HIGH); // 点亮 LED
delay(1000); // 延迟 1 秒
digitalWrite(13, LOW); // 关闭 LED
delay(1000); // 再次延迟 1 秒
}
```
此代码会使连接在数字引脚 13 上的 LED 每秒闪烁一次。
---
### 使用 `delay()` 函数的影响
尽管 `delay()` 函数使用简单直观,但它本质上是**阻塞式延时**,即在此期间 CPU 不执行其他操作,仅等待时间结束。这意味着如果在主循环中使用较长的 `delay()`,将导致程序响应变慢,无法同时处理多个任务[^1]。
例如,在串口通信或实时数据采集场景中,若使用 `delay()` 进行延时,可能会错过关键的数据接收或事件触发。此外,由于 `delay()` 依赖于 Timer0 的中断来实现计时功能,修改 Timer0 的配置可能会影响其准确性[^3]。
---
### 替代方案:使用 `millis()` 实现非阻塞延时
为了克服 `delay()` 的局限性,可以使用 `millis()` 函数实现非阻塞延时。`millis()` 返回自程序启动以来经过的毫秒数,适合用于多任务调度和精确计时。
以下是一个使用 `millis()` 实现 LED 闪烁的示例:
```cpp
unsigned long previousMillis = 0;
const long interval = 1000; // 间隔时间为 1 秒
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
digitalWrite(13, !digitalRead(13)); // 切换 LED 状态
}
// 可以在此处添加其他非阻塞任务
}
```
该方法允许在等待 LED 状态切换的同时执行其他操作,如读取传感器数据或处理串口输入,从而提高程序的响应性和并发能力。
---
### 注意事项
- 避免在中断服务程序(ISR)中使用 `delay()`,因为这可能导致系统崩溃或不可预测的行为。
- 在需要高精度定时或多任务并行处理的项目中,应优先考虑使用硬件定时器或非阻塞编程技术。
- 若需更复杂的定时控制,可结合使用 `TimerOne` 或 `MsTimer2` 等库来实现基于中断的定时机制[^4]。
---
阅读全文
相关推荐



















