| 
 | 
 
是用1MS的定时中断程序来控制小车的前进。 
当FLAG=0时,小车停止前进, 
当FLAG=1时,小车前进。 
假设如楼主所说遇到故障反而转的更快了,我认为应该是TMDAT2电平与楼主所认为相反的原因,由于没有具体的电路图所以没法更加详细的分析。现在仅仅把楼主程序的思路分析一下,楼主可以自己修改。 
#include <reg52.h> 
#define uint unsigned int 
unsigned int i; 
unsigned int j; 
unsigned int k; 
unsigned char flag; 
sbit PWM1=P1^1;     //后轮驱动前进 
sbit PWM2=P1^2;     //后轮驱动后退 
sbit PWM3=P1^3;    //前轮右转 
sbit PWM4=P1^4;    //前轮左转 
sbit TMDAT1=P0^1;    //前左红外接口 
sbit TMDAT2=P0^2;    //前中红外接口 
sbit TMDAT3=P0^3;    //前右红外接口 
sbit TMDAT4=P0^4;    //后轮记数红外接口 
 
void delay(unsigned int cnt) 
 
{ 
     while(--cnt); 
}                              //无限循环 
 
void timer0() interrupt 1                ///*  定时中断*/ 
{ 
 
   PWM1=flag;     //此中断的作用在于产生一个脉冲波,即周期1MS,为正时间为1500时钟周期的脉冲。此脉冲用于驱动小车前进,即当FLAG为1时,小车能产生为正的脉冲,小车前进,当FLAG为0时,产生脉冲恒为0,小车停止。楼主所想的改变周期可以改变定时时间,改变脉宽可以改变DELAY(1500) 
   delay(1500); 
   PWM1=0; 
} 
 
void IR_decode1()                       //红外解码程序==进入外部中断后的TMDAT电平应为0 
{ 
  //    PWM1=0;  
   PWM3=1; //左转              
//   delay1(5); 
   PWM3=0; 
} 
void IR_decode3()                       //红外解码程序==进入外部中断后的TMDAT电平应为0 
{ 
 
} 
void IR_decode4()                       //后轮记数红外接口 
{ 
   if(j==1) //从程序来看此段程序的作用是当后轮每计数I到5此时,小车运行方向改变,先往左,在5次后往右,然后再5次后往坐,如此往复。 
 { 
     j=0; 
     i++;//后轮转动圈速 
     if(i==5) 
      { 
         if(k==1)//以右为先转,k==1时左转 
        { 
          PWM4=1; 
          k=0; 
        } 
       else   //k==0时右转 
        { 
         PWM3=1; 
         k=1; 
        } 
       PWM1=0;//停车 
       flag=0; 
      //  TR0=0; 
       delay(10000); 
     //   TR0=1; 
       PWM4=0; 
       PWM3=0; 
       PWM1=1;//重起 开车 
       flag=1; 
       i=0; 
      } 
   } 
} 
 
main() 
{ 
     TMOD=0x01;//定时器设置 1ms in 12M crystal 
     TCON=0x10;  
     TH0=(65536-1000)/128;  
     TL0=(65536-1000)%128;//定时1mS 
  PWM1=0; 
  PWM2=0; 
  PWM3=0; 
  PWM4=0; 
  flag=1; 
     delay(1200); 
     IE=0x82;  //打开中断 
  while(1){ 
   //     while(!TMDAT1)IR_decode1(); 
    //    while(!TMDAT3)IR_decode3(); 
          while(TMDAT4)j=1;   //此处为等待TMDAT4变为低电平。 
    while(!TMDAT4)IR_decode4();  //当变为低电平时运行IR_DECODE4(); 
          while(!TMDAT2)flag=0;//此处等待TMDAT2变为高电平。等待期间小车停止。 
    while(flag==0) 
    { 
    while(TMDAT2)flag=1; //此处当TMDAT2为高电平时,小车运行。 
    } 
       } 
}  
 |   
 
 
 
 |