PID算法 单片机 智能车 新手啊

PID算法 单片机 智能车 新手求救啊~~
这个P(比例系数)可以用,D(微分系数)也可以用,但是I(积分系数)用不了,一用就错……为什么啊???郁闷死我了。。。一用积分系数就要死命的往左偏,没用的话可以用传感器巡线走。PS:智能车里的程序,L1、2、3、4、R1、2、3、4、I表示车前面的9个传感器


#include"sst89c51rd2.h"

sbit L1=P2^0;  
sbit L2=P2^1;
sbit L3=P2^2;
sbit L4=P2^3;
sbit I=P2^4;
sbit R4=P2^5;
sbit R3=P2^6;
sbit R2=P2^7;
sbit R1=P0^0;
sbit D_PWM=P1^5; //舵机脉冲输出
sbit M_PWM=P1^3;  //电机
sbit S=P0^7; //光电开关
sbit IN1=P1^2;    //l298n的IN1口
sbit IN2=P1^7;    //l298n的IN2口   用来控制电机正反转及停止

int t=0,i=0;
unsigned int k;
int turn_angle=24;  //舵机角度控制
#define cycle 400

void delay(int t)
{
   int i,j;
   for(i=0;i<t;i++)
   for(j=0;j<t;j++);  //还没用到程序中,看调试时,哪里需要再加
}

void set_speed(unsigned int k)
{
  CCAP0L=k;
  CCAP0H=k;


void line_following()
  {
    
    if(!L4&&!L3&&!L2&&!L1&&I&&R1&&!R2&&!R3&&!R4) //右偏1
          {turn_angle=25;
  set_speed(0xff);}
 else if(!L4&&!L3&&!L2&&L1&&I&&!R1&&!R2&&!R3&&!R4)  //左偏1
      {turn_angle=23;
  set_speed(0xff); }
    
 
  
 else if(!L4&&!L3&&!L2&&L1&&!I&&!R1&&!R2&&!R3&&!R4 )   //左偏2
      {turn_angle=21;
  set_speed(0xff);}
else if(!L4&&!L3&&!L2&&!L1&&!I&&R1&&!R2&&!R3&&!R4) //右偏2
          {turn_angle=27;
  set_speed(0xff);}
     
 else if(!L4&&!L3&&L2&&L1&&!I&&!R1&&!R2&&!R3&&!R4)   //左偏3
      {turn_angle=21;
  set_speed(0xff);}
 else if(!L4&&!L3&&!L2&&!L1&&!I&&R1&&R2&&!R3&&!R4) //右偏3
          {turn_angle=27;
  set_speed(0xff);}
     
 else if(!L4&&!L3&&L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4)   //左偏4
     { turn_angle=20;
  set_speed(0xff);}
 else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&R2&&!R3&&!R4) //右偏4
          {turn_angle=28;
  set_speed(0xff);}

 else if(!L4&&!L3&&L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4)   //左偏5
      {turn_angle=19;
  set_speed(0xff);}
  else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&R2&&R3&&!R4) //右偏5
      {turn_angle=29;
  set_speed(0xff);}

 else if(!L4&&L3&&!L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4)   //左偏6
      {turn_angle=18;
  set_speed(0xff);}
  else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&!R2&&R3&&!R4) //右偏6
     { turn_angle=30;
  set_speed(0xff); }
 
 else if(L4&&L3&&!L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4)   //左偏7
      {turn_angle=16;
  set_speed(0xff);}
    else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&!R2&&R3&&R4) //右偏7   
     { turn_angle=32;
  set_speed(0xff);}
 
else if(L4&&!L3&&!L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4)  //左偏8
      {turn_angle=16;
  set_speed(0xff);}
    else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&!R2&&!R3&&R4)// 右偏8
      {turn_angle=32;
  set_speed(0xff);}
    else if(L4&&L3&&L2&&L1&&I&&R1&&R2&&R3&&R4)// 交叉口直走(与车子在赛道方向跑的有关)
     { turn_angle=24;
  set_speed(0xff); }
 }
void main()
 {
 IN1=1;
 IN2=0;  //电机正转
 
 CMOD=0x02;
 CL=0x00;
 CH=0x00;
 CCAP0L=0xff;
 CCAP0H=0xff;
 CCAPM0=0x42;
 EC=1;
 CR=1;
 

   TMOD=0x12;//00100010定时器工作方式设置:工作方式2:8位自动重装