就是下面的程序,2.5口连的舵机上安装超声模块,舵机不断摇头,检测各个角度前方障碍物的距离,取有最远距离的那个角度,传给转向舵机让小车转向。Keil C编译通过,但就是小车跑不对。错在哪?初学请指教。
#include<at89x51.h>
#include<intrins.h>
unsigned long S=0;
unsigned long D[9]; //方向指示变量
unsigned char pwm_val_left_1 = 0;//变量定义
unsigned char pwm_val_left_2 = 0;//变量定义
unsigned char push_val_left_1 =14;//舵机归中,产生约,1.5MS 信号
unsigned char push_val_left_2 =14;//舵机归中,产生约,1.5MS 信号
unsigned int time=0; //时间变量
unsigned int timer=0; //延时基准变量1
unsigned char timer1=0; //延时时间变量2
sbit Sevro_moto_pwm_1 = P2^5; //接转向舵舵机信号端
sbit Sevro_moto_pwm_2 = P2^6; //接超声舵舵机信号端
sbit ECHO = P1^1; //超声波接口定义 P1.1
sbit TRIG = P1^0; //超声波接口定义 P1.0
/***********************************************/
void delay(unsigned int k) //延时函数
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
void StartModule() //启动测距信号
{
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
/**************************************************/
void Conut(void) //计算距离
{
while(!ECHO); //当RX为零时等待
TR0=1; //开启计数
while(ECHO); //当RX为1计数并等待
TR0=0; //关闭计数
time=TH0*256+TL0; //读取脉宽长度
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
}
/***************************************************/
void ShakeHead() //超声波舵机转动
{ int i=0,a=10;
for(i=0;i<=8;i++,a++)
{
push_val_left_2=a;
timer=0;
while(timer<=1000);
StartModule();
Count();
D[i]=S;
}
}
/***************************************************/
unsigned char Compare() //比较函数
{
int Smax=0,i=0,a=0;
for(i=0;i<9;i++)
{
if(D[i]>Smax)
{
Smax=D[i];
a=i;
}
}
return(a+10);
}
/***************************************************/
void COMM( void ) //转向函数
{
push_val_left_1=Compare();
timer1=0;
while(timer1<=2000);
}
/************************************************************************/
void pwm_Servomoto_1(void) /*转向舵机驱动函数*/
{
if(pwm_val_left_1<=push_val_left_1)
{ Sevro_moto_pwm_1=1;}
else
{ Sevro_moto_pwm_1=0;}
if(pwm_val_left_1>=200)
pwm_val_left_1=0;
}
/************************************************************************/
void pwm_Servomoto_2(void) /*超声舵机驱动函数*/
{
if(pwm_val_left_2<=push_val_left_2)
{ Sevro_moto_pwm_2=1;}
else
{ Sevro_moto_pwm_2=0;}
if(pwm_val_left_2>=200)
pwm_val_left_2=0;
}
///*TIMER1中断服务子函数产生PWM信号*/
void time1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
timer++; //定时器100US为准。在这个基础上延时
timer1++;
pwm_val_left_1++;
pwm_val_left_2++;
pwm_Servomoto_1();
pwm_Servomoto_2();
}
/***************************************************/
void time2()interrupt 1 using 1
{
}
/***************************************************/
void main(void)
{
TMOD=0X11;
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
TH0=0;
TL0=0;
TR1=1;
ET1=1;
ET2=1;
EA = 1;
delay(100);
while(1)
{
ShakeHead();
delay(5000);
COMM();
}
} |