找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1303|回复: 4
打印 上一主题 下一主题
收起左侧

最近在做一个类似超声波小车避障项目求大佬帮忙看看程序

[复制链接]
跳转到指定楼层
楼主
ID:927279 发表于 2021-6-1 20:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做一个类似超声波小车避障项目求大佬帮忙看看程序,设计一个小船,当超声波测距小于20舵机右转,继续前进如果距离减小则舵机左转,如果距离大于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;                                                                        //舵机按键标志
void Delay(unsigned int s);      //延时函数声明


uchar flag;                                                                        //舵机按键标志

/*延时函数*/
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 舵机右转
                {
                        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;                                                        //如果标志位1时,pwm的值加1


if(flag==2)        PWM_Value -= 3;                                                        //如果标志位为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++;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:849913 发表于 2021-6-2 19:39 | 只看该作者
程序是一方面 但是超声波避障用在水里 不太好 传感器十分怕水
回复

使用道具 举报

板凳
ID:927279 发表于 2021-6-4 08:11 | 只看该作者
老董 发表于 2021-6-2 19:39
程序是一方面 但是超声波避障用在水里 不太好 传感器十分怕水

防水肯定要考虑的
回复

使用道具 举报

地板
ID:844772 发表于 2021-6-4 09:11 | 只看该作者
while(Echo); 这句的逻辑是不是没有收到回音,就一直等待呢?大部分时间都是没有回音的啊。另外,转向的逻辑有点问题,没考虑船速,不可能一右转马上就拉大距离,所以最终都是左转了。还有,超声波避障最好测几次取平均值,我觉得仅测一次,经常有偶然误差。
回复

使用道具 举报

5#
ID:927279 发表于 2021-6-15 20:03 来自手机 | 只看该作者
glinfei 发表于 2021-6-4 09:11
while(Echo); 这句的逻辑是不是没有收到回音,就一直等待呢?大部分时间都是没有回音的啊。另外,转向的逻 ...

好的  谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表