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

📄 main.c

📁 飞思卡尔智能车最终完整程序 具有很高的参考价值
💻 C
字号:
#include <hidef.h>      /* common defines and 

macros */
#include <mc9s12dg128.h>     /* derivative 

information */
//#include "PWM.h"
//#include "AD.h"
#include "control.h"

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


word AD_wData[9];  //全局变量存放 AD0,AD1,AD2的结果
word sum[9]; //初始化时为求平均值,全白中,各个灯的FF次的电压和
word avrg0[9]; //全白时各个灯的平均电压
word summ[9];//初始化时为求平均值,全黑中,各个灯的FF次的电压和
word avrg1[9]; //全黑时各个灯的平均电压
word ss[9]; //实际采集来的各个灯的电压
word s[9];  // 实际采集来的各个灯的电压
word sum2[8];//用于存放两两灯电压之和
word k;	 //用于存放比较出的最大值 
uint h=1500;//转角大小
int flag = 0;//标志中间灯是否第一次在黑道附近
int flagg=0;//标志0灯从哪边感应到黑道
int flagg1=0;//标志8灯从哪边感应到黑道
int flagg0=0;//标志是左边还是右边出道
int j=0;
dword i;
dword m;
dword s0;
dword s1;
dword p11=0;//以下四个变量用于记录黑道处于同一侧的时间
dword p12=0;
dword p21=0;
dword p22=0;
word max0[9]=0;//初始化时采集来的黑道的值
int g=0;//为过滤算法使用
word cha[9];//用来存放黑白电压差

int ffgg0=0;//标志是否用中间板采的数据
int ffgg1=0;//标志是否用中间板采的数据     
word sum0=0;  //初始化时采集来9个灯的全白电压和
//word sum1=0;  //实际采集来的左4个灯的电压和
//word sum22=0; //实际采集来的右4个灯的电压和
int fla=0;//标志是出道还是入道
void AD_Init();
void PWM_Init();
void PWM_Init1();
//void PID(); 
void AD_Init(void)	//AD初始化
{
     //控制寄存器2:    上电,标志位快速清零,开中断
      ATD0CTL2  = (ATD0CTL2_ADPU_MASK|ATD0CTL2_AFFC_MASK|ATD0CTL2_ASCIE_MASK); 
     ATD1CTL2  = (ATD1CTL2_ADPU_MASK|ATD1CTL2_AFFC_MASK|ATD1CTL2_ASCIE_MASK); 
     //控制寄存器3:转换序列长度为3
     
     ATD0CTL3  =0x78;// (ATD0CTL3_S2C_MASK|ATD0CTL3_S1C_MASK);
    	ATD1CTL3 =0x78;// (ATD1CTL3_S2C_MASK|ATD1CTL3_S1C_MASK);
	 //控制寄存器4:
     ATD0CTL4  = (ATD0CTL4_SRES8_MASK|ATD0CTL4_PRS1_MASK|ATD0CTL4_PRS0_MASK);
   	ATD1CTL4  = (ATD1CTL4_SRES8_MASK|ATD1CTL4_PRS1_MASK|ATD1CTL4_PRS0_MASK);
	 //控制寄存器5:
     ATD0CTL5  = (ATD0CTL5_DJM_MASK|ATD0CTL5_SCAN_MASK|ATD0CTL5_MULT_MASK);
    	ATD1CTL5  = (ATD1CTL5_DJM_MASK|ATD1CTL5_SCAN_MASK|ATD1CTL5_MULT_MASK);
     ATD0DIEN=0x00;   // 禁止数字输入缓冲
      ATD1DIEN=0x00;   // 禁止数字输入缓冲
}

#pragma CODE_SEG NON_BANKED  //中断服务程序
#pragma TRAP_PROC
void interrupt 22 Int_AD0(void)
{
    AD_wData[0] = ATD0DR0;   //将结果寄存器中的值存放到数组中
    AD_wData[1] = ATD0DR1;   //将结果寄存器中的值存放到数组中
    AD_wData[2] = ATD0DR2;   //将结果寄存器中的值存放到数组中
    AD_wData[3] = ATD0DR3;
    AD_wData[4] = ATD0DR4;
    AD_wData[5] = ATD0DR5;
    AD_wData[6] = ATD0DR6;
    AD_wData[7] = ATD0DR7;
    AD_wData[8] = ATD1DR0;
   
   
}

#pragma CODE_SEG DEFAULT		
word max(word a,word b,word c,word d,word e,word 

f,word r,word w) {
     word maxx=0;
     if(a>maxx)maxx=a;
     if(b>maxx)maxx=b;
     if(c>maxx)maxx=c;
     if(d>maxx)maxx=d;
     if(e>maxx)maxx=e;
     if(f>maxx)maxx=f;
     if(r>maxx)maxx=r;
     if(w>maxx)maxx=w;
     return maxx;
 }
void delay0(){
  for(i=0;i<0xFFFF;i++)
    for(m=0;m<0x05;m++);
}
void delay1(){
  for(i=0;i<0xFFFF;i++);
 // for(i=0;i<0xFFFF;i++);
}
void main(void) 
{
     
     AD_Init();   //AD 初始化
     DDRB = 0xFF;
     DDRA_BIT6=0; //A_BIT6口作为第二块板左边传感器的输入口
     DDRA_BIT7=0;	 //A_BIT7口作为第二块板右边传感器的输入口
     PORTB  = 0xFF;
     p=0;
     for(j=0;j<9;j++)      
     {
          AD_wData[j] = 0; //全局变量初始化
    			sum[j]=0;
       		
       	  avrg0[j]=0;
       	  avrg1[j]=0;
       		summ[j]=0;
     }
     for(j=0;j<9;j++) {
      max0[j]=0;ss[j]=0;  
     }
      for(j=0;j<8;j++)
        sum2[j]=0;
     EnableInterrupts; 	 //开AD中断
     for(i=0;i<0xFFFF;i++);
     for(i=0;i<0xFF;i++)		//只能是FF,防止下面sum溢出
     {
         for(j=0;j<9;j++) 				

 //采集白道路信息
         {
             sum[j]=sum[j]+AD_wData[j];
         }
     }
     for(i=0;i<9;i++) {
     sum0=sum0+sum[i]/0xFF;
     avrg0[i]=sum[i]/0xFF;
     }
      
     PORTB=sum[0]/0xFF;		//显示0通道采集到的值
     delay0();
     
     PORTB=0x00;//显示马上得进行黑道信息采集了
     delay1();
     
     for(j=0;j<9;j++){
      for(m=0;m<0xFF;m++){
        summ[j]=summ[j]+AD_wData[j];
       }
        avrg1[j]=summ[j]/0xFF;
        PORTB=avrg1[j]; //显示采来的黑道信息
        cha[j]=avrg1[j]-avrg0[j];
        delay0();
        PORTB=0x00; //显示马上得进行下一次黑道信息采集了
        delay1();
     }
     PORTB=0x00;					

  //灯全亮,提示车马上就可以跑了
     delay1();
    
     PWM_Init() ;
     PWM_Init1(1500,1,200);
      for(i=0;i<0xFFF;i++);
//       delay1();
     for(;;)
     {		
         
     		  int f=0;
     			u3=100;
     		if(flagk1==1){
     			  p21=0;
     			  flagk2=0;
     			  p11++;
     			  if(p11==0xFFF)flagkk1=1;
     			}else if(flagk2==1){
     			  p11=0;
     			  flagk1=0;
     			  p21++;
     			  if(p21==0xFFF)flagkk2=1;
     			}
     		for(f=0;f<9;f++){
     		  s[f]=AD_wData[f];
     	    ss[f]=s[f]-(avrg0[f]-0x50); //当前值减去初始白道值,以便比较
     		}                                   
			 for(f=0;f<8;f++)sum2[f]=ss[f]+ss[f+1]; //两两灯电压之和
 //减去1.6V防止溢出*******************
      if(AD_wData[0]<0xC0&& AD_wData[1]<0xC0&& AD_wData[2]<0xC0&&AD_wData[3]<0xC0&&
    AD_wData[4]<0xC0&&AD_wData[5]<0xC0&&AD_wData[6]<0xC0&&AD_wData[7]<0xC0&&
    AD_wData[8]<0xC0){
    if(sum2[0]<0xC0&&sum2[1]<0xC0&&sum2[2]<0xC0&&sum2[3]<0xC0&&
      sum2[4]<0xC0&&sum2[5]<0xC0&&sum2[6]<0xC0&&sum2[7]<0xD0){
         fla=1;
         if(flagg0==1)
          {
         for(i=0;i<0xFF;i++);
          PWM_Init1(1140,u1,200);
         flagk1=1;
         flagkk2=0;
          for(;;){
            if(AD_wData[4]>0xB0||AD_wData[5]>0xB0||AD_wData[6]>0xB0||
            AD_wData[7]>0xB0||AD_wData[8]>0xB0){
              flagg0=0;
              break;		
            }
          }
         }
         else if(flagg0==2){
         for(i=0;i<0xFF;i++);
          PWM_Init1(1860,u1,200);
         flagk1=0;
            flagkk2=1;
          for(;;)if(AD_wData[0]>0xB0||AD_wData[1]>0xB0||
          AD_wData[2]>0xB0||AD_wData[3]>0xB0||AD_wData[4]>0xB0){
            flagg0=0;
            break;  
          }
         }
      }else{
             }
    }else{
     
     if(s[0]-(avrg0[0]-0x13)<0x40 && s[1]-(avrg0[1]-0x13)<0x40 &&
     s[2]-(avrg0[2]-0x13)<0x40 && s[3]-(avrg0[3]-0x13)<0x40 &&
     s[4]-(avrg0[4]-0x13)<0x40 && s[5]-(avrg0[5]-0x13)<0x40 &&
     s[6]-(avrg0[6]-0x13)<0x40 && s[7]-(avrg0[7]-0x13)<0x40 &&
     s[8]-(avrg0[8]-0x13)<0x40)              

///////////注意调整该值36***************      
     {
     
      /* if(PORTA_BIT6!=0||PORTA_BIT7!=0){
     		      
     		    if(PORTA_BIT6!

=0&&PORTA_BIT7==0)PWM_Init1(1900,200,1);
            else if(PORTA_BIT7!=0&&PORTA_BIT6==0)

PWM_Init1(1100,200,1);
     		  }
     		  	 */
     		     					

					
     }else{		
      
     	
     		     k=max(sum2[0],sum2[1],sum2[2],sum2[3],sum2[4],sum2[5],sum2[6],sum2[7]);
     		      //谁两和最大,黑道就在谁两之间
     		      if(k==sum2[0]){
     		        p=0;
     		        flagg0=2;
     		        if(fla==1)
     		        control_11();
     		        else if(fla==0) control_1();
     		      }
     		      else{
     		           if(k==sum2[1]){
     		           p=0;
     		           p1=0;
     		            fla=0;
     		            control_2(s[1],s[2],ss[1],ss[2],cha[1],cha[2],avrg0[1],avrg0[2]); 
     		           }
                    else{if(k==sum2[2]){
                    p=0;
                    p1=0;
                      fla=0;
                      control_3(s[2],s[3],ss[2],ss[3],cha[2],cha[3],avrg0[2],avrg0[3]);
                    }
                         else{if(k==sum2[3]){
                         p=0;
                         p1=0;
                          fla=0;
                          control_4(s[3],s[4],ss[3],ss[4],cha[3],cha[4],avrg0[3],avrg0[4]); 
                         }
                              else{if(k==sum2[4]){
                                fla=0;
                                p1=0;
                                control_5(s[4],s[5],ss[4],ss[5],cha[4],cha[5],avrg0[4],avrg0[5]);	 
                              }
                                   else{if(k==sum2[5]){
                                    fla=0;
                                    p1=0;
                                    control_6(s[5],s[6],ss[5],ss[6],cha[5],cha[6],avrg0[5],avrg0[6]);
                                   }
                                        else{if(k==sum2[6]){
                                        p=0;
                                        p1=0;
                                          fla=0;
                                          control_7(s[6],s[7],ss[6],ss[7],cha[6],cha[7],avrg0[6],avrg0[7]); 
                                        }
                                             else{if(k==sum2[7]){
                                             p=0;
                                              flagg0=1;
                                              if(fla==0)
                                              control_8();
                                              else if(fla==1)
                                              control_88();
                                             } else{
                                             }
                                             }
                                        }
                                   }
                              }
                         }
                    }
     		      }
     }						
    }
     }
} 

⌨️ 快捷键说明

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