微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于延时

关于延时

时间:10-02 整理:3721RD 点击:
C语言编写延时程序时,怎样设置精确时间呢?

void delay(uint c)   
{        uint a,b;
for(a=0;a<c;a++)
for(b=0;b<550;b++)
;
}
精确的时间跟你的时钟周期有关~~~ 以上程序段可以直接调用 eg: delay(100);
你也可以编一个定时1Ms 1S的程序:
eg:
void delay1ms(uint delay1ms) //STC11F60XE,22.1184M,1ms   
{   
        uint i,j;     
        for(;delay1ms>0;delay1ms--)   
           for(i=0;i<7;i++)   
             for(j=0;j<210;j++);
}

这样你就可以直接调用: 如延时23ms :  delay1ms(23);

使用计时器或定时器中断更准确
1、中断方式
void timerX_ISR(void)
{
     DelayMS++;
}
int main(void)
{
    while(1){
         .....
         DelayMS = 0;
         while(DelayMS < 9);
         ......
    }
    return 0;
}
将定时器设定为1ms一次中断,从0-9表示10ms延时
当然你也可以不用等待,用if判断,延时的时候去干点别的事情
2、计时器查询方式
void DelayMS(unsigned int delay_ms)
{
      unsigned int time1,time2, temp;
      time1 = TIMx_CNT;    //使用某个计时器,记录当前时刻
       delay_ms = delay_ms * TICK_PER_MS ;  //将延迟的MS数转换成计时器的次数
      do{
           time2 = TIMx_CNT;
           if(time2 >= time1){
                temp = (time2 - time1);
           }
           else{
                temp = (0xFFFFFFFF - (time1-time2) +1 );  //假设是32位的计时器,溢出的时候
           }
     }while( (temp < delay_ms  ) && ( delay_ms   != 0) )
}
设置好定时器,不用开中断,增计数。
这个方式有一个缺点,最多延时时间只能是计时器的周期的最大值
如果是32位的也够折腾了,如果是16位的,可以适当计时时钟,假设是1us加1,
可以最长延时65.535ms,周期改为10us最长就可以延时655.35ms了
如果是1us,TICK_PER_MS 的值就是1000,10us就是100,其他类推
如果需要较长的延时,那就多调用几次吧

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top