|
/******************************************************************************
函数说明: 任务1,LED闪烁(0.5s亮,0.5S灭)
函数实现: 采用状态机的方法实现
#define LED_INIT 0
#define LED_ON 1 //LED任务的定义
#define LED_OFF 2
-------------------------------------------------------------------------------
时间:2008-05-29
作者:胡玉贵
说明:在数据采集仪的设计过程中用到长延时,可能要延时1~10S的时间。如果编写一个简
单的延时函数系统的响应将是不能忍受的,所以只能考虑采用其他的办法实现很长的
延时。
办法1:采用uCosII这样的操作系统,应为有任务的调度,所以实时性的延时很容易实
现。
任务函数()
{
系统的延时函数(延时时间);//任务被挂起,直到延时时间到达
执行函数();
}
方法是很好的,我也研究了一段时间,但是网上能用的CODE(ucosII ON m128
ICCAVR)没有。****再加上我的系统实时性不是要求那么高,只要能避免很长
时间的延时函数就行。***
办法2:没有uCOSII那样的实时调度,调度采用主函数中的while(1)实现
声明的几点:系统的实时性不要求非常高的,因此短的延时函数保留,大于100ms
的延时采用状态机实现
eg:以LEDTask为例,任务有两个状态,ON和OFF,ON-》OFF的延时为500ms,OFF
-》ON的延时同样为500ms。如果采用一般的延时函数MCU基本可以不用干其他
事了。***用定时器+状态机很好的解决了这个问题***
步骤1:为函数定义一个全局的延时变量G_delaytime;
步骤2:初始化定时器,这里以25ms为中断对G_delaytime减一处理,当为0是延时
时间到
步骤3:分析函数的状态,一般多建一个初始化状态,此状态只运行一次。
******************************************************************************/
void LEDTask(void)
{
static unsigned char ledstate;//LEDTask函数的状态变量,控制LED的变化
switch(ledstate)
{
case LED_INIT://led任务初始化状态
PORTB&=~BIT(0);
G_delaytime[0]=20;//打开延时这里是关键
ledstate=LED_ON; //状态的转变
break;
case LED_ON:
if(G_delaytime[0]==0)//等待延时的结束,此时延时已经用定时器实现,25ms减一,20个单位=25×20=500ms
{
PORTB|=BIT(0);
G_delaytime[0]=20;
ledstate=LED_OFF;
}
break;
case LED_OFF:
if(G_delaytime[0]==0)
{
PORTB&=~BIT(0);
G_delaytime[0]=20;
ledstate=LED_ON;
}
break;
default :break;
}
}
点击此处下载 ourdev_296796.rar(文件大小:125K) (原文件名:Multask.rar) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|