大家看看我的小车程序!
时间:10-02
整理:3721RD
点击:
大家看看我的C程序!
为什么小车在跑的时候,不会转弯,
?
#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=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>=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***//
else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))
{ flag=2;} //***右转2***//
else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1))
{ flag=3; }//***左转1***//
else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
{ flag=4; }//***左转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;
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 RSEN1=P1^0; // 右光对管1
sbit RSEN2=P1^1; //右光对管2
sbit LSEN1=P1^2; //左光对管1
sbit LSEN2=P1^3; //左光对管2
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>=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***//
else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))
{ flag=2;} //***右转2***//
else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1))
{ flag=3; }//***左转1***//
else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
{ flag=4; }//***左转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;
IN1=1; //******给电机加电启动******//
IN2=0;
IN3=1;
IN4=0;
ENA=1;
ENB=1;
while(1)
{
xunji(); //*********寻迹**********//
}
}
求助啊~~~~
你确定你的光对管正确工作了么
对的呀~~检测弯道时,相应指示灯会亮灭,可是电机依然是直行的!
确定占空比调节对电机有效么?
转弯的时候你没定时啊,,假如转弯的时候执行转弯1ms,你根本看不出来,并且在1ms内可能只专1度的弯
直流电机可以的
改善下控制算法吧,多调试
好的~
我用的是定时中断啊
晕,假如检测到黑线是1ms,在这1ms你那个定时有用,只要检测不到黑线,你那定时就会改变。
我说的是你那个定时是用于pwm输出。
必须要有一个定时是独立于pwm之外的。
pwm与timer 不一致哈
好像有点问题
转弯定时没搞好吧。要一边调一边改才可以发现问题。
我都看不懂啊!
lz搞定了没有?这个不是你自己写的吧,在一个文档里面的