在Arduino中包含四种时间操作函数,分别是:delay()、delayMicroseconds()、millis () 和 micros() ,它们可以分为两个大类,一类是以毫秒为单位进行操作的,另一类是以微秒为单位进行操作的,具体的差异在下文逐一描述,下面我们来了解一下。
delay()函数
delay() 函数的工作方式非常简单。它接受单个整型数字参数,这个参数表示一个以毫秒为单位时间,从字面意思理解这是延迟时间函数。程序执行中遇到这个函数时,等待设定的时间后到进入下一行代码。但是,delay( )函数并不是让程序执行等待的唯一方法,它也被称为“阻塞”函数。
delay()函数格式
delay (ms) ;
ms是以毫秒为单位无符号长整型数。来看一下LED闪烁的例子:
/* 闪烁LED * * 每间隔1秒打开和关闭一个连接到数字针脚的LED. * */ int ledPin = 13; // LED连接到数字引脚13 void setup() { pinMode(ledPin, OUTPUT); // 设置引脚为输出 } void loop() { digitalWrite(ledPin, HIGH); // 打开LED delay(1000); // 等待1000ms digitalWrite(ledPin, LOW); // 关闭LED delay(1000); // 等待1000ms }
delayMicroseconds()函数
delayMicroseconds() 函数的作用是:接受一个以微秒为单位的整型数字参数,执行等待。一毫秒等于一千微秒,一秒钟等于一百万微秒。 相比delay()函数它的单位更小,也就是说可以更精确的执行控制。 目前,delayMicroseconds() 函数 能够支持的最大值是16383,这个值可能会在未来Arduino版本中发生变化。因此我们可以看到对于延迟时间超过几千微秒的情况,使用delay()函数似乎更简单一些。
delayMicroseconds() 函数格式
delayMicroseconds (us) ;
us是暂停的微秒数,是一个无符号整型数。现在把LED闪烁的例子修改看一下:
/* 闪烁LED * * 每间隔1秒打开和关闭一个连接到数字针脚的LED. * */ int ledPin = 13; // LED连接到数字引脚13 void setup() { pinMode(ledPin, OUTPUT); // 设置引脚为输出 } void loop() { digitalWrite(ledPin, HIGH); // 打开LED delayMicroseconds(1000); // 等待1000us digitalWrite(ledPin, LOW); // 关闭LED delayMicroseconds(1000); // 等待1000us }
从LED闪烁的频率可以看到两者间的区别。
millis () 函数
millis()函数可以用来获取Arduino运行程序的时间长度,该时间长度单位是毫秒,Arduino最长可记录50天。如果超出记录时间上限,记录将从0重新开始。
millis()函数格式
millis () ;
获取Arduino开机后运行的时间长度,此时间数值以毫秒为单位(返回值类型:无符号长整型数)。看下面的例子:
unsigned long time; void setup() { Serial.begin(9600); } void loop() { Serial.print("Time:"); time = millis(); // 串口监视器显示程序运行的时间长度,毫秒读数. Serial.println(time); // 为避免连续发送数据,设置等待1000ms. delay(1000); }
micros()函数
micros() 函数的作用是: 获取Arduino运行程序的时间长度,该时间长度单位是微秒。最长记录时间大约70分钟,溢出后回到0。在主频16MHZ的Arduino板上,如Due和Nano,这个函数的分辨率为 4 us(即返回的值总是4的倍数)。在主频8MHZ的Arduino板上,这个函数的分辨率为8 us。
micros()函数格式
micros () ;
函数返回程序启动后的时间长度,读数为无符号长整型, 单位是微秒。看下面的示例:
unsigned long time; void setup() { Serial.begin(9600); } void loop() { Serial.print("Time:"); time = micros(); // 串口监视器显示程序运行的时间长度,微秒读数. Serial.println(time); // 为避免连续发送数据,设置等待1000ms. delay(1000); }