八色木

Arduino-时间函数-系列10

在Arduino中包含四种时间操作函数,分别是:delay()delayMicroseconds()millis () micros() ,它们可以分为两个大类,一类是以毫秒为单位进行操作的,另一类是以微秒为单位进行操作的,具体的差异在下文逐一描述,下面我们来了解一下。

Arduino Software

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); 
}

Exit mobile version