微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大师们,帮忙看一下这个循迹小车程序为什么会有停顿啊.

大师们,帮忙看一下这个循迹小车程序为什么会有停顿啊.

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0 ;   
//**左边电机的占空比**//
unsigned char zkb2=0 ;   
//**右边电机的占空比**//
unsigned char t=0;      
//**定时器中断计数器**//
sbit LSEN1=P1^0;
sbit LSEN2=P1^1;
sbit MSEN1=P1^2;
sbit RSEN1=P1^3;
sbit RSEN2=P1^4;
//**传感器***/
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;
sbit ENA=P2^4;
sbit ENB=P2^5;
//**********初始化定时器中断***********//
void init()
{  
TMOD=0x01;   
TH0=(65536-100)/256;   
TL0=(65536-100)%256;   
EA=1;   
ET0=1;   
  TR0=1;  
}
//***********中断函数+脉宽调制***********//
void timer0() interrupt 1
{
if(t<zkb1)      
ENA=1;   
else      
ENA=0;   
if(t<zkb2)      
ENB=1;   
else      
  ENB=0;     
  t++;   
if(t>=50)     
{t=0;} }
//******************直行******************//
void qianjin()
{
   zkb1=30;   
   zkb2=30;
}
//***************小左转函数***************//
void turn_left1()
{  zkb1=10;   
   zkb2=25;
}
//***************大左转函数***************//
void turn_left2()
{  zkb1=5;   
   zkb2=25;
}
//***************中左转函数***************//
void turn_left3()
{  zkb1=10;   
   zkb2=20;
}  
//***************小右转函数***************//
void turn_right1()
{   zkb1=25;   
   zkb2=10;
}
//***************大右转函数***************//
void turn_right2()
{   zkb1=25;   
   zkb2=5;
}
//***************中右转函数***************//
void turn_right3()
{   zkb1=20;   
   zkb2=10;
}
//***************循迹函数*****************//
void xunji()  
{
uchar flag;   
if((RSEN1==1)&&(RSEN2==1)&&(MSEN1==0)&&(LSEN1==1)&&(LSEN2==1))     
{ flag=0; }
//*******直行*******//   
else
  if((RSEN2==0)&&(RSEN1==1)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))   
  { flag=1;} //***左偏1,小右转***//   
  else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==0)&&(MSEN1==1))     
{ flag=2; } //***右偏1,小左转***//
  else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1)&&(MSEN1==1))     
{ flag=3; } //***右偏2,大左转***//
  else
  if((RSEN2==1)&&(RSEN1==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))   
  { flag=4;} //***左偏2,大右转***//
  else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==1))     
{ flag=5; } //***右偏3,中左转***//
  else
if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))     
{ flag=6; } //***左偏3,中右转***//   
switch (flag)      
{  case 0:
          qianjin();            
  break;        
  case 1:
          turn_right1();            
  break;         
  case 2:
       turn_left1();
  break;
  case 3:
          turn_left2();
  break;
  case 4:
          turn_right2();
  break;
  case 5:
          turn_left3();
  break;
  case 6:
          turn_right3();
  break;
default: break;       }
}
//****************主程序****************//
void main()
{ init();  
zkb1=30;   
zkb2=30;  
while(1)   
{  IN1=1; //******给电机加电启动******//
     IN2=0;   
  IN3=1;     
IN4=0;     
ENA=1;     
ENB=1;
while(1)   
  {  
   xunji(); //*********寻迹**********//      
  }     
}
}

不懂帮顶

额。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0 ;   
//**左边电机的占空比**//
unsigned char zkb2=0 ;   
//**右边电机的占空比**//
unsigned char t=0;      
//**定时器中断计数器**//
sbit LSEN1=P1^0;
sbit LSEN2=P1^1;
sbit MSEN1=P1^2;
sbit RSEN1=P1^3;
sbit RSEN2=P1^4;
//**传感器***/
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;
sbit ENA=P2^4;
sbit ENB=P2^5;
//**********初始化定时器中断***********//
void init()
{  
TMOD=0x01;   
TH0=(65536-100)/256;   
TL0=(65536-100)%256;   
EA=1;   
ET0=1;   
  TR0=1;  
}
//***********中断函数+脉宽调制***********//
void timer0() interrupt 1
{
TH0=(65536-100)/256;   
TL0=(65536-100)%256;   
if(t<zkb1)      
ENA=1;   
else      
ENA=0;   
if(t<zkb2)      
ENB=1;   
else      
  ENB=0;     
  t++;   
if(t>=50)     
{t=0;} }
//******************直行******************//
void qianjin()
{
   zkb1=30;   
   zkb2=30;
}
//***************小左转函数***************//
void turn_left1()
{  zkb1=10;   
   zkb2=25;
}
//***************大左转函数***************//
void turn_left2()
{  zkb1=5;   
   zkb2=25;
}
//***************中左转函数***************//
void turn_left3()
{  zkb1=10;   
   zkb2=20;
}  
//***************小右转函数***************//
void turn_right1()
{   zkb1=25;   
   zkb2=10;
}
//***************大右转函数***************//
void turn_right2()
{   zkb1=25;   
   zkb2=5;
}
//***************中右转函数***************//
void turn_right3()
{   zkb1=20;   
   zkb2=10;
}
//***************循迹函数*****************//
void xunji()  
{
uchar flag;   
if((RSEN1==1)&&(RSEN2==1)&&(MSEN1==0)&&(LSEN1==1)&&(LSEN2==1))     
{ flag=0; }
//*******直行*******//   
else
  if((RSEN2==0)&&(RSEN1==1)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))   
  { flag=1;} //***左偏1,小右转***//   
  else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==0)&&(MSEN1==1))     
{ flag=2; } //***右偏1,小左转***//
  else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1)&&(MSEN1==1))     
{ flag=3; } //***右偏2,大左转***//
  else
  if((RSEN2==1)&&(RSEN1==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))   
  { flag=4;} //***左偏2,大右转***//
  else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==1))     
{ flag=5; } //***右偏3,中左转***//
  else
if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))     
{ flag=6; } //***左偏3,中右转***//   
switch (flag)      
{  case 0:
          qianjin();            
  break;        
  case 1:
          turn_right1();            
  break;         
  case 2:
       turn_left1();
  break;
  case 3:
          turn_left2();
  break;
  case 4:
          turn_right2();
  break;
  case 5:
          turn_left3();
  break;
  case 6:
          turn_right3();
  break;
default: break;       }
}
//****************主程序****************//
void main()
{ init();  
zkb1=30;   
zkb2=30;  
while(1)   
{  IN1=1; //******给电机加电启动******//
     IN2=0;   
  IN3=1;     
IN4=0;     
ENA=1;     
ENB=1;
while(1)   
  {  
   xunji(); //*********寻迹**********//      
  }     
}
}
你重新试下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top