关于单片机定时器的问题,求解!

2019-07-15 21:22发布

例如我有这样一段代码,大体思路如下:

代码1;
延时1ms;
然后执行代码2;
延时1.5ms;
然后执行代码3;
延时1.7ms;
然后执行其他代码;

请问这样用单片机内部定时器怎么实现?  注:不用软件延时。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
爱我别走
2019-07-16 01:38
本帖最后由 爱我别走 于 2013-12-10 14:03 编辑

一般延时有两种写法,即阻塞和非阻塞两种。下面我提供些思路,你自己完善一下应该就可以了。
//=========================================================
//                                                  延时的阻塞写法
//=========================================================
      阻塞的延时就是,你调用延时函数之后,程序就卡在延时函数里,只有当延时时间到达
程序才能继续往下走。一般可以用软件的循环语句来写,当然也可以用定时器。如下面的两
个例子:
/*
软件延时--阻塞模式
*/
vloid delay(void)
{
      //通过while,for等循环语句让cpu空转,从而达到延时。
}

/*
定时器延时--阻塞模式
*/
unsigned int g_ncount = 0;/*定义一个全局变量,用于计时*/

//定时器初始化
void init_timer(void)
{
    //关键代码:写上定时一个适合的时间片,比如100us。
}

//定时器中断
void Isr_timer(void) interrupt 1
{
       //关键代码:写上g_ncount --;
}

//延时函数
void delay(int dx)
{
  g_ncount=dx;
while(g_ncount);
}

//=========================================================
//                                                  延时的非阻塞写法
//=========================================================
     非阻塞延时就是,在你调用延时函数后,cpu转而去做别的事情,当延时时间到达,cup回到
延时函数的下一行继续执行。这样做到好处是显而易见的,由于没有阻塞,不会因为你调用延时
而影响其他任务的执行,充分提高了cpu的效率。一般我们用状态机实现。
/*
定时器延时--非阻塞模式
*/
unsigned int g_states = 0;  /义全局变量,用于保存状态*/
unsigned int g_ncount = 0;/*定义一个全局变量,用于计时*/

//定时器初始化
void init_timer(void)
{
    //关键代码:写上定时一个适合的时间片,比如100us。
}

//定时器中断
void Isr_timer(void) interrupt 1
{
       //关键代码:写上g_ncount --;
}

//延时的使用
switch(g_states)
{
     case 0:
   {
       //添加代码1
        ..................
        g_ncount = 10;
        g_states = 1;  //切换到延时状态
   }break;

  case 1:
   {
       if(g_states == 0)
     {  
            g_ncount = 0;l
            g_sattes = 2;//跳转到代码段2
      }
   }break;

  case 2:
  {

  }break;
   ................
}







一周热门 更多>