找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1851|回復(fù): 4
收起左側(cè)

最近在做一個類似超聲波小車避障項目求大佬幫忙看看程序

[復(fù)制鏈接]
ID:927279 發(fā)表于 2021-6-1 20:47 | 顯示全部樓層 |閱讀模式
最近在做一個類似超聲波小車避障項目求大佬幫忙看看程序,設(shè)計一個小船,當(dāng)超聲波測距小于20舵機右轉(zhuǎn),繼續(xù)前進如果距離減小則舵機左轉(zhuǎn),如果距離大于20則舵機置中間位

下面是我寫的代碼  (剛開始寫 求放過)
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#include <math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit Trig=P2^3;            //控制端
sbit Echo=P2^4;          //接收端
sbit PWM_OUT=P2^1;                                //PWM輸出口


uint PWM_Value;                        //定義pwm值
uchar order=0;
unsigned char T0RH=0;
unsigned char T0RL=0;
uchar flag;                                                                        //舵機按鍵標(biāo)志
void Delay(unsigned int s);      //延時函數(shù)聲明


uchar flag;                                                                        //舵機按鍵標(biāo)志

/*延時函數(shù)*/
void Delay_us(unsigned char t)
{
        while(--t);
}         //大約延時t*2+5us         超聲波模塊用
void time_init()
{
        EA=1;
        TMOD=0x11;
        TH0 = 0;
        TL0 = 0;
        ET0 = 1;
        TR0 = 1;
    PT0=1;
} //初始化定時器


void main()
{
        unsigned int time,distance,last;
        Trig=0;
        Echo=0;
Delay_us(6000);
PWM_Value =1190;                                        //pwm初值為1190中位
time_init();
while(1)
       {
        Trig=1;
        Delay_us(5);
                Trig=0;
                while(Echo==0);
                TR0=1;
                while(Echo);
                TR0=0;
                time=TH0*256+TL0;
                distance=(int)(time*0.017);                           //計算路程 單位為cm
        if(distance<20)                                        //如果距離小于20cm 舵機右轉(zhuǎn)
                {
                        flag = 1;
                        last=distance;
                }      
                else
                {
                flag=0;
                }
                Delay_us(5);
                        if(distance<last)
                        {
                        flag=2;
                        }
                        else
                {
                flag=0;
                }
                }
}
/*****中斷程序*******/
void timer0(void) interrupt 1


{


if(flag==1)        PWM_Value += 1;                                                        //如果標(biāo)志位1時,pwm的值加1


if(flag==2)        PWM_Value -= 3;                                                        //如果標(biāo)志位為2時,pwm減1
if(PWM_Value>=2500)                                                                                //如果pwm的值大于2500
PWM_Value = 2500;                                                                                                //則保持在2500
if(PWM_Value<=500)                                                                                        //如果pwm的值小于500
PWM_Value=500;                                                                                                        //則保持在500
switch(order)
{
        case 1:PWM_OUT=1;
                   TH0=(65536-PWM_Value)>>8;
                   TL0=(uchar)(65536-PWM_Value);
                   break;
        case 2:PWM_OUT=0;
                   TH0=(65536-(5000-PWM_Value))>>8;
                   TL0=(uchar)(65536-(5000-PWM_Value));
                   break;
        case 3:
                   TH0=60536>>8;
                   TL0=(uchar)60536;
                   break;
        case 4:
                   TH0=60536>>8;
                   TL0=(uchar)60536;
                   order=0;
                   break;
default: order=0;
                   break;
}
          order++;
}
回復(fù)

使用道具 舉報

ID:849913 發(fā)表于 2021-6-2 19:39 | 顯示全部樓層
程序是一方面 但是超聲波避障用在水里 不太好 傳感器十分怕水
回復(fù)

使用道具 舉報

ID:927279 發(fā)表于 2021-6-4 08:11 | 顯示全部樓層
老董 發(fā)表于 2021-6-2 19:39
程序是一方面 但是超聲波避障用在水里 不太好 傳感器十分怕水

防水肯定要考慮的
回復(fù)

使用道具 舉報

ID:844772 發(fā)表于 2021-6-4 09:11 | 顯示全部樓層
while(Echo); 這句的邏輯是不是沒有收到回音,就一直等待呢?大部分時間都是沒有回音的啊。另外,轉(zhuǎn)向的邏輯有點問題,沒考慮船速,不可能一右轉(zhuǎn)馬上就拉大距離,所以最終都是左轉(zhuǎn)了。還有,超聲波避障最好測幾次取平均值,我覺得僅測一次,經(jīng)常有偶然誤差。
回復(fù)

使用道具 舉報

ID:927279 發(fā)表于 2021-6-15 20:03 來自手機 | 顯示全部樓層
glinfei 發(fā)表于 2021-6-4 09:11
while(Echo); 這句的邏輯是不是沒有收到回音,就一直等待呢?大部分時間都是沒有回音的啊。另外,轉(zhuǎn)向的邏 ...

好的  謝謝
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表