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

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

时间:10-02 整理:3721RD 点击:
例如我有这样一段代码,大体思路如下:
代码1;
延时1ms;
然后执行代码2;
延时1.5ms;
然后执行代码3;
延时1.7ms;
然后执行其他代码;
请问这样用单片机内部定时器怎么实现?  注:不用软件延时。

用定时器定时0.1秒,或者0.01秒,多循环几次不就行了,找公约数。

一般延时有两种写法,即阻塞和非阻塞两种。下面我提供些思路,你自己完善一下应该就可以了。
//=========================================================
//                                                  延时的阻塞写法
//=========================================================
      阻塞的延时就是,你调用延时函数之后,程序就卡在延时函数里,只有当延时时间到达
程序才能继续往下走。一般可以用软件的循环语句来写,当然也可以用定时器。如下面的两
个例子:
/*
软件延时--阻塞模式
*/
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;
   ..
}



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

网站地图

Top