⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taskline_counter.c

📁 本人s12的一部分机器人巡线程序
💻 C
字号:
/*********************************************************************************/
/*
任务功能说明:本任务只是负责在检测到数线完成的时候发送方向为0和在发送零之后延时1秒钟再关闭
循线任务,同时开启查找地图功能;因为循线任务的方向变量是随外部给定而改变的,所以这个任务改变
方向为0后循线任务虽然还在进行循线位置判断并发送速度,但是由于方向已经被本任务变为0,那么循线
任务这时给下位机发送的数据只有方向有效,下位机会停止.1秒钟以后在开启地图查找任务的原因是,下
位机要完全停止电机需要一段时间.
*/
/*********************************************************************************/
#include "includes.h"
#define EXT extern
#include "main.h"
#pragma CODE_SEG Task_LineCounterCode		//save the TaskStart code in banked flash
void Task_LineCounter(TASKDATA* pdata);
BOOLEAN Follow_Stuts;//数线状态
uchar Line_a;//数线消抖变量,防止探测到污点算作数线
BOOLEAN FollowLine1;
uchar Time_count;
uchar Time_count1;
uchar Ptm; 
void Task_LineCounter(TASKDATA* pdata)   //循线任务
{
	#if OS_CRITICAL_METHOD == 3
	OS_CPU_SR cpu_sr;
	#endif
	INT8U err;
	Line_a=0;
	FollowLine1=FALSE;
	Time_count=0;
	Time_count1=100;
	
	for(;;)
	{
        FollowLine1=TRUE;
        OSTimeDly(1);//20ms检测一次,保证循线任务执行第一次以后再判断
      
      //#define followlinecount
      #ifdef followlinecount
      
	    if(Follow_Start)
    	  {
    	    Midspeed=15;
    	    do
    	      { //如果发现数线传感器当前在白线上则等待其出白线  AD08==高电平在白线
    	        OSTimeDly(1);
    	      }while(AD_bData1[0]>=150);
    	    
    	    while(Follow_Num!=0)
    	      {
        	    if((Time_count<250)&&(Follow_Num!=1))//假如只数线一条则直接给定速度
        	      {
        	        Time_count++;
        	        Midspeed=MidspeedC*Time_count/250;//有级升速,1秒达到给定值
        	        if(Midspeed<15)Midspeed=15;//防止启动速度低的时候振荡厉害
        	      }
        	    else if(Follow_Num!=1) 
        	      {
        	        Midspeed=MidspeedC;
        	        Time_count=254;
        	      }

    	        OSTimeDly(1);
    	        if(AD_bData1[0]>=150)Line_a++;
    	        else Line_a=0;
    	        if(Line_a>=4)
    	          {
    	            Line_a=0;
    	            Follow_Num--;
    	            if(Follow_Num>1)
    	              {
    	                do
    	                  {
    	                    OSTimeDly(1);
    	                  }while(AD_bData1[0]>=150);
    	              }
    	          }
    	        if(Follow_Num==1)
    	          {
    	            //Midspeed=25;

            	    if(Time_count=254)
            	      {
                	    if(Time_count1>50)
                	      {
                	        Time_count1--;
                	        Midspeed=MidspeedC*Time_count1/100;//有级升速,1秒达到给定值
                	        if(Midspeed<25)Midspeed=25;//防止启动速度低的时候振荡厉害
                	      }
            	      }
                	      
            	      
            	    if(FollowLine1==TRUE)
            	      {
        	            FollowLine1=FALSE;
        	            do
        	              {
        	                OSTimeDly(1);
        	              }while(AD_bData1[0]>=150);
            	      }
    	          }
    	      }
    	     if(Follow_Num==0)
    	          {
    	            do
    	              {
    	                OSTimeDly(1);
    	                Ptm=PTM;
    	              }while((Ptm&0x80)!=0);
                  {
                    OS_ENTER_CRITICAL();//这些数据数要同时处理的,不能产生实时中断
                    RightSpeed=10;//数到白线的时候使电机速度为0
                    LeftSpeed=10;
                    if(direction==0x04)direction=0x08;//停止方向
                    else if(direction==0x08)direction=0x04;
                    if(directionL==0x04)directionL=0x08;//改变左电机方向
                    else if(direction==0x08)direction=0x04;
                    if(directionR==0x04)directionR=0x08;
                    else if(directionR=0x08)directionR=0x04;//改变右电机方向
                    Line_a=0;//清除数线变量 
                    Follow_Start=FALSE;//循线任务关闭
                    Speed_Comm();
                    OS_EXIT_CRITICAL();//这里会产生任务调度  
                    OSTimeDly(10); 
                    RightSpeed=0;//数到白线的时候使电机速度为0
                    LeftSpeed=0;
                    OSTimeDlyHMSM(0,0,0,100);//数线完成延时1秒  //这里会产生任务调度
                    Key_TaskStart_EN=TRUE;//查找地图下一步打开
                    Time_count=0;
                    Time_count1=100;
                        
                  }    	              
    	          }
    	      
    	  
    	  }
    #endif
	}
}
#pragma CODE_SEG DEFAULT

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -