1.millis()
millis 函数用于获取单片机通电到现在运行的时间长度,单位是 ms,该函数返回值类型为无符号长整型(unsigned long)。系统最长的记录时间为9小时22分,如果超出将从0开始。
millis是一个无参数函数,适合作为定时器使用,不影响单片机的其他工作,而使用delay函数期间无法做其他工作。
延时10s后自动点亮接到引脚13的LED的示例程序清单如下:
int led=13;
unsigned long i,j;
void setup()
{
pinmode(led,output);
i-millis(); //读入初始值
}
void loop()
{
j=millis(); //不断读入当前时间值
if((j-i)>10000) //如果延时超过10s,则点亮LED
digitalwrite(LED,HIGH);
else
digitalwrite(LED,LOW);
}
注意:函数返回值unsigned long型,如果用int型保存时间将得到错误结果。
可以在开发环境的下列示例程序中找到Millis函数的应用:
Blink WithoutDelay.pde、Calbration.pde、ebounce.pde.
2.delay(ms)
delay函数是一个延时函数,参数表示延时时长,单位是ms。函数无返回值,原型如下:
void delay(unsigned long ms)
{
Uint16t-start=(uint16-t)micros();
While(ms>0)
{
If((uint16-t)micros()-start)>=1000)
{
Ms--;
Start+=1000;
}
}
可以在开发环境的下列示例程序中找到delay函数的应用:
ADXL3xx.pde、AnalogInput.pde、Blink.pde、Fading.pde、Graph.pde、Knock.pde、Loop.pde、Melody.pde、Memsic2125.pde、Ping.pde。
3.delayMicroseconds(µs)
delayMicroseconds函数也是延时函数,可以产生更短的延时,参数是延时的时长,单位是μs(微秒),其中1s=1000ms=1000000μs.
函数原型如下:
void deaymicroseconds(unsigned int us)
{
//for a one -microsecond delay,simply return.
//the overhead of the function call yields a delay of
//approximately 1 1/8 us.
if(--us==0)
return;
//the following loop takes a quarter of a microsecond (4 cycles)
//per iteration,so execute it four times for each
//microsecong of delay requested.
us<<=2;
//busy wait
-asm- -volatile-(
“1:sbiw %0,1””\n\t”//2 cycles
“brne 1b”:”=w”(us):”0”(us)//2 cycles
);
}
可以在开发环境中的下列示例程序中找到delayMicroseconds函数的应用:
Melody.pde、Ping.pde。
4.micros()
micros 函数用于返回开机到现在运行的微秒值,该函数返回值类型为无符号长整型(unsigned long),70分钟将溢出。
显示当前微秒值的示例程序清单如下:
unsigned long time;
void setup()
{
serial,bigin(9600);
}
void loop()
{
serial,print(“time:”);
time=micros(); //读取当前的微秒值
serial.println(time); //打印开机到目前运行的微秒值
delay(1000); //延时1s
}