就这一段时间,做了一个超声波避障的小车,单独的超声波,和舵机程序测试的时候都很准确,但是合在一起的时候,就让避障变得不太灵敏,可能是代码写的有些瑕疵吧。可以躲避障碍物,但是不是每次都能准确躲避,大多数情况下,转几次弯就会撞墙,但是网上看到别人的小车都很灵敏,基本是大多数的障碍都可以躲避。下面附上部分代码,希望大家看看有什么问题吧。初学51,请多指教!
这一块是超声波部分:
void Conut(void) //超声波计算距离
{
time1=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time1*1.7)/100; //算出来是CM
}
void jiance() //检测障碍物是否在范围内
{
if((S>=600)||flag==1)
{
flag=0;
leftqian();
rightqian();
OLED_ShowChar(0, 4, ASCII[11]);
OLED_ShowChar(18, 4, ASCII[10]); //显示点
OLED_ShowChar(36, 4, ASCII[11]);
OLED_ShowChar(54, 4, ASCII[11]);
OLED_ShowChar(72, 4, ASCII[12]); //显示M
}
else if(S<40)
{
leftqian();
righthou();
delay(200);
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
OLED_ShowChar(0, 4, ASCII[disbuff[0]]);
OLED_ShowChar(18, 4, ASCII[10]); //显示点
OLED_ShowChar(36, 4, ASCII[disbuff[1]]);
OLED_ShowChar(54, 4, ASCII[disbuff[2]]);
OLED_ShowChar(72, 4, ASCII[12]); //显示M
}
else
{
leftqian();
rightqian();
led7=0;
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
OLED_ShowChar(0, 4, ASCII[disbuff[0]]);
OLED_ShowChar(18, 4, ASCII[10]); //显示点
OLED_ShowChar(36, 4, ASCII[disbuff[1]]);
OLED_ShowChar(54, 4, ASCII[disbuff[2]]);
OLED_ShowChar(72, 4, ASCII[12]); //显示M
}
void StartModule() //启动模块
{
uint k;
Trig=1;
for(k=0;k<21;k++) //启动一次模块
_nop_();
Trig=0;
}
这一块是舵机部分:
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0xFE;
TL1 = 0x0C;
if(count<jd)
pwm=1;
else
pwm=0;
count=count+1;
count=count%40;
}
下面是主程序:
void main()
{
InitTimer0();
InitTimer1();
IrInit();
OLED_Init(); //初始化OLED
leftqian();
rightqian();
jd=2;
OLED_Clear();
OLED_ShowCHinese2(0,0,0);//
OLED_ShowCHinese2(18,0,1);//
OLED_ShowCHinese2(36,0,2);//
OLED_ShowCHinese2(54,0,3);//作
OLED_ShowCHinese2(72,0,4);//品
OLED_ShowCHinese2(90,0,5);//答
OLED_ShowCHinese2(108,0,6);//辩
OLED_ShowCHinese(0,2,0); //测
OLED_ShowCHinese(18,2,1);//量
OLED_ShowCHinese(36,2,2);//距
OLED_ShowCHinese(54,2,3);//离
OLED_ShowCHinese(72,2,4);//:
while(1)
{
// delay500ms();
jd=jd+2;
if(jd>5)
jd=2;
switch(IrValue[2])
{
case 24: leftqian();rightqian(); break;
case 82: lefthou();righthou(); break;
case 8: lefthou();rightqian(); break;
case 90: leftqian();righthou(); break;
case 28: leftting();rightting(); break;
default : break;
}
if(IrValue[2]==71)
{
StartModule();
led8=0;
while(!Echo); //当RX为零时等待
TR0=1; //开启计数
while(Echo); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
jiance();
led8=1;
// delayms(80); //处理速度不够,导致转弯不灵敏
}
if(IrValue[2]==70)
{
StartModule();
led8=0;
while(!Echo); //当RX为零时等待
TR0=1; //开启计数
while(Echo); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
jd=3;
while(S>20)
{
leftqian();
rightqian();
Conut();
}
leftting();
rightting();
}
delay_ms(100);
// OLED_Clear();
/* delay_ms(500);
OLED_Clear();
delay_ms(500);
OLED_DrawBMP(0,0,128,8,BMP1); //显示图片1
delay_ms(500);
OLED_DrawBMP(0,0,128,8,BMP2); //显示图片2
delay_ms(500); */
}
}
|