【Arduino】用millis()代替delay()实现延时功能

本文介绍了如何在Arduino编程中使用millis()和micros()函数实现更精确的延时控制,以实现多任务处理,避免delay()导致的程序阻塞。作者提供了自定义函数time_delay的实现和使用示例,包括灯光闪烁应用。
摘要由CSDN通过智能技术生成

  在Arduino编程中,delay()函数用于在程序执行期间暂停执行一段时间。它可以将Arduino的执行暂停指定的毫秒数。如果我们需要在程序中实现多任务处理,delay()函数并不是一个好的选择。因为在使用delay()函数时,Arduino不会处理任何输入和输出,因此会导致无法及时响应其他事件。

  millis()函数是一个内置的Arduino函数,它返回从程序启动到当前时间的毫秒数。与delay()函数相比,millis()函数可以实现更精确的延时控制。通过记录开始时间和延时时间,可以在延时期间执行其他代码,并使用millis()函数检查是否到达预定的延时时间。我们可以使用millis()函数实现类似delay()函数的延时效果,而不会阻塞程序的执行。

 下面我们自定义一个函数,这里命名为 time_delay 

unsigned long time_delay(unsigned long time_cont) {
  unsigned long time_now = millis();                    //记录当前时间
  unsigned long time_target = time_now + time_cont;     //定义目标时间
  while (1) 
  {
    time_now = millis();                                //更新当前时间
/*

这里放入你要在延时中同时要进行的程序

*/
    if (time_now >= time_target)                       //如果到达目标时间
      break;                                            //跳出循环
  }
  return 0;
}

time_cont :需要输入的变量,即为需要暂停的毫秒数。

time_now :被millis()函数赋值的变量,即为当前时刻的毫秒数。

time_target :当前时刻+要暂停的时间,即为暂停后的未来时刻。

将上面的代码放进arduino的程序中,我们就可以开始快乐的使用它了,使用方法跟delay()函数一模一样。下面举个例子,实现灯光的闪烁。

void setup() {
pinMode(13,1);                                         //定义输出引脚(arudino uno/nano)
}
void loop() {
digitalWrite(13,1);                                    //输出高电平
time_delay(1000);                                      //延时
digitalWrite(13,0);                                    //输出低电平
time_delay(1000);                                      //延时
}
unsigned long time_delay(unsigned long time_cont) {
  unsigned long time_now = millis();                    //记录当前时间
  unsigned long time_target = time_now + time_cont;     //定义目标时间
  while (1) 
  {
    time_now = millis();                                //更新当前时间

/*

这里放入你要在延时中同时要进行的程序

*/

    if (time_now >= time_target)                       //如果到达目标时间
      break;                                            //跳出循环
  }
  return 0;
}

  那么我们已经实现了使用millis()函数来代替delay()函数,如果我们需要更加精确的延时,也可以使用相同的思路,使用 micros() 函数实现相同的功能。micros()函数可以返回自 Arduino 开始运行以来的微秒数。它的精度是微秒级别,每微秒增加1。我们将上面程序中的millis()函数替换成micros()函数,可以实现微秒级的延时。

unsigned long time_delay(unsigned long time_cont) {
  unsigned long time_now = micros();                    //记录当前时间
  unsigned long time_target = time_now + time_cont;     //定义目标时间
  while (1) 
  {
    time_now = micros();                                //更新当前时间
/*

这里放入你要在延时中同时要进行的程序

*/
    if (time_now >= time_target)                       //如果到达目标时间
      break;                                            //跳出循环
  }
  return 0;
}

第一次写文章,写的不好还请见谅,如果你发现有什么问题,欢迎指正。

如果这篇文章对你有帮助,还请点一个赞支持一下,十分感谢。

  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值