打印

定时器大家是怎么用的呢?

[复制链接]
2794|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
快乐小小鱼|  楼主 | 2012-9-21 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器可以代替delay()等空延时函数,我是这样用的:
ISR_TIMER()
{
   delay_time ++;
}

void func(void)
{
  if(delay_time>10)
  {
     delay_time = 0;

    XXXX; //这里添加自己的代码
   }
};
这样函数func就是每10次中断间隔执行一次了,不知道大家怎么用定时器来计时的。我总感觉这样用数据乱传递,不怎么好!每次需要计时的地方,都要一个全局变量来计时。大家是这样来中这种数据传递的呢?也就是中断里的变量,和其他函数之间数据的传递,怎样做让程序更模块化呢?

相关帖子

沙发
woshixinshou| | 2012-9-21 23:12 | 只看该作者
楼主应该不是从51开始学的,51的习惯是定义个位变量,中断置1,大循环查询是否为1,是则清0并执行任务。
其他则一个char,里面8个位,都用不完啊。

使用特权

评论回复
板凳
快乐小小鱼|  楼主 | 2012-9-21 23:20 | 只看该作者
哦哦,楼上是说51定时器中断发生置位一个sbit变量,然后在main的大循环里面检测sbit是否置1,如果置1,则认识延时到,清零执行!下次延时时间到,再次清零sbit,执行程序!

使用特权

评论回复
地板
快乐小小鱼|  楼主 | 2012-9-21 23:21 | 只看该作者
用8bit和用1bit方法一样的,没有本质的区别!有没有更好方法要传递这类数据呢?

使用特权

评论回复
5
快乐小小鱼|  楼主 | 2012-9-21 23:23 | 只看该作者
以前好像看过说这样的全局变量传递,可以把全局变量做形参传递,也就是func(delay_time)的,这样比func()要清晰些!如果要改变原来数据,就只能传指针喽!

使用特权

评论回复
6
457878| | 2012-9-22 07:09 | 只看该作者
这样就好了:

/*In Timer.c:*/

typedef UINT8 BOOL;

static UINT8 delay_time;//这样delay_time就不是全局变量了

ISR_TIMER()
{
   delay_time ++;
}

BOOL Timer_CheckOV(void) //声明为外部函数
{
  if(delay_time>10)
  {
     delay_time = 0;
        return(TRUE);
   }
};


/*In Task.c:*/
void Task_Run(void)
{
        ...
       
        if (Timer_CheckOV() == TRUE)
        {        DoSomething();
        }
       
        ...       
}

使用特权

评论回复
7
457878| | 2012-9-22 07:13 | 只看该作者
Timer_CheckOV() 必须配套一个Timer_SetOV() 来用,就像这样:

/*In Task.c:*/
void Task_Run(void)
{
        ...
        switch(s_Status)
        {
                case 0:
                        Timer_SetOV(100);//100ms
                        s_Status++;
                        break;
                case 1:
                        if (Timer_CheckOV() == TRUE)
                        {        s_Status++;
                        }
                        break;
                case 2:
                        DoSomething();
                        ...
                        break;
                               
        }
        ...       
}

使用特权

评论回复
8
457878| | 2012-9-22 07:15 | 只看该作者
本帖最后由 457878 于 2012-9-22 07:41 编辑

#5: 有个概念必须注意:既然是全局变量,直接使用就行,自然就不用传递了,所以:传递的都是模块变量和局部变量

使用特权

评论回复
9
dlyt_test001| | 2012-9-22 08:14 | 只看该作者
计数,定时的工作在中断中做。定时到后置标志位。
在主循环中检测标志位。
如果标志位置位,则运行定时函数,并清标志位。

使用特权

评论回复
10
快乐小小鱼|  楼主 | 2012-9-22 08:44 | 只看该作者
谢谢,457878的回复,很值得学习下,用函数把定时器计数值进行了包装和隔离下!这样也挺好的!

使用特权

评论回复
11
whx2009| | 2012-9-22 10:54 | 只看该作者
以前还真没太注意过全局变量和局部变量,又长知识了

使用特权

评论回复
12
457878| | 2012-9-22 11:15 | 只看该作者
本帖最后由 457878 于 2012-9-22 11:17 编辑

#11 , 关于“全局变量”的厉害关系,有个贴讲的很详细,搜索:“一线研发之声+全局变量”,可以找到那个贴子

使用特权

评论回复
13
dqyubsh| | 2012-9-22 20:01 | 只看该作者
除了全局变量这个差别,我想知道7楼和9楼的代码有什么差别。我之前是用9楼的说法。是不是一定为了使用状态机才这样做?

使用特权

评论回复
14
liuyuqiong1| | 2012-9-22 21:07 | 只看该作者
个人觉得如下方式更好些:
定义F_Time100ms
作为时间到了的标志位是全局变量~~





ISR_TIMER()
{

Static uint8 delay_time =0;
   
if(delay_time ++>10)//
这样更能确保时间准确些,变量清零变化更快些

{


Delay_time
= 0;


F_Time100ms = TRUE;

}
Else
{

F_Time100ms = FALSE;

}
}

void func(void)
{
  
if(F_Time100ms)
  
{
   
XXXX; //
这里添加自己的代码

   
}
};


1# 快乐小小鱼

使用特权

评论回复
15
hong118520| | 2012-9-22 22:14 | 只看该作者
小行星惺惺惜惺惺惺惺惜惺惺惺惺惜惺惺惺惺惜惺惺

使用特权

评论回复
16
bettercoffe| | 2013-8-20 14:17 | 只看该作者



买了个定时插座  http://www.kedooo.net/hot.asp?i=1302-609  做工非常好,很满意!


回来就用上了,时间很准,不错!再也不怕忘记关电源了。


对比了好多家,这种使用起来最为方便,老人也会用,那种带屏幕的设置起来好麻烦的。


















使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

190

帖子

8

粉丝