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

📄 main.c

📁 这是一个正确的飞思卡尔智能车程序,希望对比赛有帮助!!!
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#define TIME_6us 38
#define Mid_PWM 2932
#define Right_Max 3465
#define Left_Max 2399
#define TIME_1MS 6656
#define LINE_MAX   40
#define LINE_B  35
#define LINE_M 15
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
//extern word temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
//byte Pre_SetSpeed0;
//byte Pre_SetSpeed1;
//byte Pre_SetSpeed2;
byte Max_Speed;
byte PreLength;
byte Min_Speed;
byte SpeedTerminal=1;
byte Count=0;
byte Length=0;
int ErrorSum=0;

//void key(void);
//void  IintEEPROM(void); 
void SetSpeed(byte v);
void InitPWM(void);
void SetAngle(signed char a);
void SetDutycycle(word Duty);
//word ReadEEPROM(word addr);
word Duty;
byte Speed;
byte Speed_array[2]={0};
byte Cal_Speed;
byte NearFlag = 1;
byte MidFlag = 1;
char SpeedFlag=0;
char PreSpeedFlag;
static byte i =0;
static word x=0;
byte FieldFlag=0;
word LineNum =0;
word LineCount=25;
byte BlackCount[LINE_MAX]={0};
signed char Mid_def = 16,flag=1,blacklocationl,blacklocationr,leftflag,rightflag;
static char m,n;
static char Mid_left,Mid_right;
//byte LineValue_Near[35] = {0} ;
//byte LineValue_Mid[35] = {0} ;
//byte LineValue_Far[35] = {0} ;
byte LineValue[LINE_MAX][33]= {0};
signed char BlackLocation[LINE_MAX]={0};
void   Delay_6us(void);
signed char Error_N[LINE_MAX]={0};
signed char Error_N_1[LINE_MAX]={0};
void CCD_BlackLocation(void);



/////////////Interrupt///////////
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void CAP_Line(void)
    {
        TFLG1_C1F=1;
        LineNum++;
    }

interrupt  void  CAP_IRQ(void)
  {
       FieldFlag=1;
       INTCR_IRQEN= 0;
       TIE_C1I=1;
       //PORTB=0xff;
  }
/******************************************************/


#pragma CODE_SEG DEFAULT

/////////////Delay//////////////
void Delay_6us(void)
{
    int k;
        for (k=0; k<TIME_6us;k++ ) { }        
}

/////////////Delay_ms///////////
void Delay_ms(word xms)
{
    int k , j;
    for (j=0; j<xms; j++)
    {
        for (k=0; k<TIME_1MS; k++); 
    }
}
/////////////Bus////////////////
void init_Bus(void)
    {
        REFDV=3;
        SYNR=9;                              //bus clock=16MHz*(SYNR+1)/(REFDV+1)
        while(0==CRGFLG_LOCK);      //untill VCO run stable
        CLKSEL=0x80;                      // PLLSEL=1
    }
    
/////////////SCI////////////////
//初始化串行口参数,波特率设置为9600
void InitSCI(void)
{
    SCI0BD = 260;//设置波特率寄存器,波特率为9600          156
    SCI0CR2_TE = 1;//发送使能
    SCI0CR2_RE = 1;//接收使能
}

//向串口发送一个字节ASCII码
void TxSCI(byte data) 
{
    while(SCI0SR1_TDRE==0); //检查发送标志
    SCI0DRL = data;
}

//向串口发送一个字节ASCII码'|'
void TxSCI_over(void) 
{
    while(SCI0SR1_TDRE==0); //检查发送标志
    SCI0DRL = '*';
}


//向串口发送多个字节ASCII码
void TxsSCI(byte *p) 
{
    while(*p!='\0') 
    {
        TxSCI(*p++);
    }
}

//向串口发送1个字节十进制数
void TxSCI_1B(byte data) 
{
     byte temp[4];
     temp[0] = data/100%10+0x30; 
     temp[1] = data/10%10+0x30;
     temp[2] = data%10+0x30;
     temp[3] = '\0';
     TxsSCI(temp);
     TxSCI_over(); 
}    

//向串口发送2个字节十进制数
void TxSCI_2B(word data) 
{
     byte temp[6];
     temp[0] = data/10000%10+0x30; 
     temp[1] = data/1000%10+0x30;
     temp[2] = data/100%10+0x30; 
     temp[3] = data/10%10+0x30;
     temp[4] = data%10+0x30;
     temp[5] = '\0';
     TxsSCI(temp);
     TxSCI_over(); 
}
    
/////////////ECT////////////////
void init_ECT(void)
    {
        TCTL4=0b00010111;
        TSCR1_TEN=1;
        ICPAR_PA0EN=1;
        //PBCTL_PBEN=1;
        TSCR2_PR=0; 
    }

////////////IRQ///////////////    
void init_IRQ(void)
  {
          
          INTCR_IRQE=1;
          
  }

/////////////ATD////////////////
void init_ATD(void)
{
    ATD1CTL2 = 0xc0;//AD0模块使能,读取转换结果后自动清零
    ATD1CTL3 = 0x08;
    ATD1CTL4 = 0x81;//8位精度,采样时间为2个AD转换时钟,4分频
    ATD1CTL5=0xA0;    //右对齐,单通道
    ATD1DIEN=0x00;    //禁止数字输入
}

////////////CCD_Info///////////
void CCD_Info(void)
    {     
            //PORTB=0;
            INTCR_IRQEN= 1;
            while(!FieldFlag);
            //PACN0=0;
            for(m=0;m<LINE_MAX;m++)
            { 
              while(LineNum<LineCount);
              Delay_6us();
              for(n=0;n<33;n++)
              {
                while(!ATD1STAT0_SCF);
                LineValue[m][n]=ATD1DR0L;
              }
              LineCount+=7;
              
           /*   for(n=0;n<33;n++)
                {
                   BlackCount[m]=0;
                   
                   if(LineValue[m][n]<64)
                     {
                    LineValue[m][n]=0;
                    BlackCount[m]++;
                  }
                else LineValue[m][n]=1; 
                }
              
              if(BlackCount[m]>6) 
              {
               BlackLocation[m]=127;
               continue;                
              }    */
            }  
              
            /* for(Mid_left=16,Mid_right=16;Mid_right<33;Mid_left--,Mid_right++)
            {  
                if(LineValue[m][Mid_left]==0) 
               {
                  BlackLocation[m]= Mid_left ;
                  break;         
                }
            if(LineValue[m][Mid_right]==0) 
              {
                BlackLocation[m]= Mid_right;
                break;
              }
            if(Mid_right==32) BlackLocation[m]=127;
            }
            }    */
           ATD1CTL2=0X00;
           //Speed = PACN0; 
           
            TIE_C1I=0;
            FieldFlag=0;
            LineNum=0;
            LineCount=25;

             
    }
    
////////////BlackLocation/////////
void CCD_BlackLocation(void)
  {
     for(m=LINE_MAX-1;m>=0;m--)
	    {          PORTA_BIT7=1;
		        	BlackCount[m] = 0; 
        	     	for(n=0;n<33;n++)
                     	{
                  		if(LineValue[m][n]<64)
                     		{
                    			LineValue[m][n]=0;
                    			BlackCount[m]++;
                  	       	}
                		else LineValue[m][n]=1; 
                     	}
              	    if(BlackCount[m]>10) 
              		{
               			BlackLocation[m]=127;      //处理十字线和异常黑色区域标志
               			continue;                
              		}
				
		    if(BlackCount[m] == 0)
	    		{
				BlackLocation[m]=125;     //全白行标志
				continue;
		    	}		    
           if(BlackLocation[m] != 125)
            {
                if(LineValue[m][Mid_def] != 0)
           	{
               		   	if( (LineValue[m][Mid_def - 2] == 0) && (Mid_def > 2))
               			{
               				Mid_left = Mid_right = Mid_def - 2;
                	    }
                	   if ((LineValue[m][Mid_def + 2] == 0) && (Mid_def < 30))
                	   {
                	     Mid_left = Mid_right = Mid_def +2;
                	   }
               			if((LineValue[m][Mid_def-2] != 0) && (LineValue[m][Mid_def+2] != 0))
                	    {
                	              flag = 0; 	        
                	    }//没找到黑点,则从中间开始搜索
               	}
               else
               	{       
						    Mid_left = Mid_right = Mid_def;  
               	}

            	 if(flag == 0 || (m == LINE_MAX-1) )       
            	 {   
            	    flag=1;           
                	for(Mid_left=16,Mid_right=16;Mid_right<33;Mid_left--,Mid_right++)
                	{  
                	  	if(LineValue[m][Mid_left]==0) 
                	  	{
                	  		   BlackLocation[m]= Mid_left ;
                	   		   break;         
                	  	}
                	  	if(LineValue[m][Mid_right]==0) 
                	  	{
                	   		  BlackLocation[m]= Mid_right;
                	    	  break;

⌨️ 快捷键说明

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