有关循迹小车程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0 ; //**左边电机的占空比**//
unsigned char zkb2=0 ; //**右边电机的占空比**//
unsigned char t=0; //**定时器中断计数器**//
sbit RSEN1=P1^0; // 右光对管1
sbit RSEN2=P1^1; //右光对管2
sbit LSEN1=P1^2; //左光对管1
sbit LSEN2=P1^3; //左光对管2
sbit 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(); //*********寻迹**********//
}
}
}
提高PWM频率,降低占空比试一下
我降低了那个占空比,但是程序容易跑飞。您能帮我检查下这个程序吗?
小编解决了没?
我试了一下你的程序,我怎么总是只有一边轮子跑,求解!
这个可能不是程序的问题吧,可能是硬件或是电机的问题,我也遇到过这种情况
我们的小车也有同样的问题,不知道现在该怎么解决了 ?哪位大神帮帮忙 !
检查下硬件 看它输出是否是对的 你的定时时间怎么取得 可以直接对IN1,2,3,4输出pwm吧,一样是两路啊
最近也在弄小车 试下用电平驱动 循迹是一边正转一边反转
最近也在搞小车 在程序出问题了
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语言是个二把手 不专业 麻烦小编赐教~
谢谢
定时器没有重新赋值哦
有红外的吗?我正在做一个红外的,需要程序
扎心了,看不懂,还在自学中
寻迹小车主程序void main()
{
init();
zkb1=50;
zkb2=50;
while(1)
{
//******给电机加电启动******
IN1=1;
IN2=0;
IN3=1;
IN4=0;
ENA=1;
ENB=1;
while(1)
{
xunji(); //*********寻迹******
为什么有两个while 循环 这不就一直执行循环 寻迹程序啊,上电不是加了while 也只执行一次啊,本人刚学,谢谢大神