有关循迹小车程序

2019-07-16 03:26发布

我做了个循迹小车,但是速度太快,改掉PWM数值后,小车的停顿的时间就变长了,是不是要改下定时器的数值?该怎么改?而且我的循迹小车不够灵敏,程序也容易跑飞....怎么办
times New Roman">#include<reg51.h>#define uchar unsigned char#define uint unsigned intunsigned char zkb1=0 ;    //**左边电机的占空比**//unsigned char zkb2=0 ;    //**右边电机的占空比**//unsigned char t=0;        //**定时器中断计数器**//sbit RSEN1=P1^0;       // 右光对管1sbit RSEN2=P1^1;       //右光对管2sbit LSEN1=P1^2;        //左光对管1sbit LSEN2=P1^3;        //左光对管2sbit IN1=P0^0;sbit IN2=P0^1;sbit IN3=P0^2;sbit IN4=P0^3;sbit ENA=P0^4;sbit ENB=P0^5;//****************延时函数****************//void delay(int z)   {   while (z--);  }//**********初始化定时器,中断***********//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>=100)    {t=0;}}//******************直行******************//void qianjin(){  zkb1=30;    zkb2=30;}//***************左转函数1***************//void turn_left1(){  zkb1=0;    zkb2=50;}//***************左转函数2***************//void turn_left2(){  zkb1=0;    zkb2=60;}//***************右转函数1***************//void turn_right1(){  zkb1=50;    zkb2=0;}//***************右转函数2***************//void turn_right2(){  zkb1=60;    zkb2=0;}//***************循迹函数*****************//void xunji() { uchar flag;  if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))    { flag=0; }//*******直行*******//   else  if((RSEN1==0)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))    { flag=1;} //***左偏1,右转1***//   else  if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))    { flag=2;} //***左偏2,右转2***//   else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1))    { flag=3; }//***右偏1,左转1***//  else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))    { flag=4; }//***右偏2,左转2***// switch (flag)     {  case 0:qianjin();              break;        case 1:turn_right1();              break;         case 2:turn_right2();              break;         case 3:turn_left1();              break;         case 4:turn_left2();              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(); //*********寻迹**********//     }    }}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
wolfwyf
2019-07-17 03:13
void xunji()
{ uchar flag;
  if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
    { flag=0; }//*******直行*******//
   else  if((RSEN1==0)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
    { flag=1;} //***左偏1,右转1***//
   else  if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))
    { flag=2;} //***左偏2,右转2***//
   else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1))
    { flag=3; }//***右偏1,左转1***//
  else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
    { flag=4; }//***右偏2,左转2***//
switch (flag)
     {  case 0:qianjin();
              break;
        case 1:turn_right1();
              break;
        case 2:turn_right2();
              break;
        case 3:turn_left1();
              break;
        case 4:turn_left2();
              break;  
        default: break;
      }
}


我也刚刚独立做了一辆 目前用涂黑了的纸测试轮子转动正常,转弯是差动转弯还没加pwm
我编写循迹时用的是总线控制 比如p1=0x01的话 车就往左转 如果P1=0x08 车就往右转 我想知道一下我这样写和你这样的区别 c语言是个二把手 不专业 麻烦楼主赐教~
                                                                                     谢谢

一周热门 更多>