就這一段時間,做了一個超聲波避障的小車,單獨的超聲波,和舵機程序測試的時候都很準確,但是合在一起的時候,就讓避障變得不太靈敏,可能是代碼寫的有些瑕疵吧。可以躲避障礙物,但是不是每次都能準確躲避,大多數情況下,轉幾次彎就會撞墻,但是網上看到別人的小車都很靈敏,基本是大多數的障礙都可以躲避。下面附上部分代碼,希望大家看看有什么問題吧。初學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); */
}
}
|