延时函数delay的一点疑问

时间:2023-01-18 23:42:25
void main()
{
    

          while(1)
          {
            
             P2=0xfe; //1111 1110
            // delay(60000);
          }                  

}

代码的结果是D1一直亮,这个结果是可以解释的,因为有一个无限循环的while,导致P2不间断的被设置0xFE,这个值的意思就是让D1亮,一时设置一时亮,一直设置一直亮,很好理解。

 

但是下面的代码是加了delay函数的

void main()
{
    

          while(1)
          {
            
             P2=0xfe; //1111 1110
             delay(60000);
          }                  

}

结果也是D1一直亮,这里我就想不明白,CPU是怎么执行这个的。现在想到的一种解释就是delay的时间很短,短到肉眼感觉不出来。

 

我做过几个实验,0xfd是让D2亮 0xFE是让D1亮

          while(1)
          {
            
             P2=0xfd; //1111 1110
             delay(5000);
             P2=0xfe;
             delay(5000);
          }    
能感觉到闪烁

          while(1)
          {
            
             P2=0xfd; //1111 1110
             delay(2500);
             P2=0xfe;
             delay(2500);
          }

能感觉到闪烁

          while(1)
          {
            
             P2=0xfd; //1111 1110
             delay(2000);
             P2=0xfe;
             delay(2000);
          }    
    
能感觉到闪烁
          while(1)
          {
            
             P2=0xfd; //1111 1110
             delay(1500);
             P2=0xfe;
             delay(1500);
          }    

能感觉到闪烁
          while(1)
          {
            
             P2=0xfd; //1111 1110
             delay(1000);
             P2=0xfe;
             delay(1000);
          }    

肉眼感觉不到闪烁

那么这个delay(1000)用多长时间呢?
经过调试

0.00019550
0.00470500
发现是0.0046秒
也就是说两个灯切换亮,时间少于这个值就不会感觉出来。

 

          while(1)
          {
            
             P2=0xfe; //1111 1110
             delay(60000);
          }  

我delay(60000),换算过来就是0.276秒,这个时间已经能感觉出来了,为什么D1始终不闪烁?

 

我delay(100),我甚至调试过,发现流程并不会跨越过这个耗时操作。

 

void main()
{
    

          while(1)
          {
            
             P2=0xfe; //1111 1110
             delay(1500);
             P2=0xff; //1111 1111
             delay(1500);
          }                  

}

 

 同一个灯,要有亮灭的过程才会感觉闪烁。