吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5484|回复: 23
收起左侧

[其他转载] 超声波避障小车

  [复制链接]
Z.W 发表于 2018-11-29 23:05
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit Trig = P3^2 ; //超声波TX管脚
sbit Echo = P3^3 ; //超声波EX管脚
sbit pwm  = P3^7;  //PWM信号输出口
sbit IN1=P1^0; //定义电机驱动信号输出端
sbit IN2=P1^1; //定义电机驱动信号输出端
sbit IN3=P1^2; //定义电机驱动信号输出端
sbit IN4=P1^3; //定义电机驱动信号输出端

uchar count; //0.5ms计数次数
uchar jd;    //转动的角度
uint time,S,S1,S2,S3,S4,S5;   //距离变量 ,从左到右为各个方向距离变量180度舵机转5个方位
void DelayUs2x(uchar t) //延时函数
{   
while(--t);
}
void DelayMs(uint t)
{
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
}
}
/********************************************************************
* 名称 :qian()
* 功能 : 两个电机前进。  34为左电机
***********************************************************************/
void qian()
{
   IN1=0;   
   IN2=1;
   IN3=1;      
   IN4=0;
}

/********************************************************************
* 名称 :ting()
* 功能 : 两个电机停止。
***********************************************************************/
void  ting()
{
   IN1=0;   
   IN2=0;
   IN3=0;      
   IN4=0;
}   
/********************************************************************
* 名称 :hou()
* 功能 : 两个电机后退。
***********************************************************************/
void hou()
{
   IN1=1;   
   IN2=0;
   IN3=0;      
   IN4=1;
}   
/********************************************************************
* 名称 :manyou()
* 功能 : 右停左前。
***********************************************************************/
void  manyou()
{
   IN1=0;   
   IN2=1;
   IN3=0;      
   IN4=0;
}
/********************************************************************
* 名称 :kuaiyou()
* 功能 : 右前左后。
***********************************************************************/
void  kuaiyou()
{
   IN1=0;   
   IN2=1;
   IN3=0;      
   IN4=1;
}
/********************************************************************
* 名称 :manzuo()
* 功能 : 左停右前。
***********************************************************************/
void  manzuo()
{
   IN1=0;   
   IN2=0;
   IN3=1;      
   IN4=0;
}
   /********************************************************************
* 名称 :kuaizuo()
* 功能 : 右后左前。
***********************************************************************/
void  kuaizuo()
{
   IN1=1;   
   IN2=0;
   IN3=1;      
   IN4=0;
}
/*------------------------------------------------
                    定时器1初始化
------------------------------------------------*/
void Timer1Init(void)  //500微秒@11.0592MHz
{
    TMOD = 0x10;
    TH1 = 0x0FE;
    TL1 = 0x33;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
}
/*------------------------------------------------
                    定时器0初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响      
}
void chaoshengbo ()
{
    TR0=0;           //定时器开关
TH0=0;
TL0=0;
    Trig=0;
    Echo=0;
Trig=1;
DelayUs2x(20);
Trig=0;
while(Echo==0); //等待Echo回波引脚变高电平
TR0=1;           //定时器0开关打开
while(Echo); //等待
time=TH0*256+TL0;
S=time*0.0172;  //厘米
if(S>400)S=400;
  }
/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
  jd=3;
  count=0;
  Timer1Init();    //初始化定时器
  Init_Timer0();
  while(1)
  {         
         chaoshengbo();
         if (S>25)
         {
     qian();
    }
         else           
         {
                 ting();
              jd=5;count=0;
    DelayMs(600);
                chaoshengbo();
                S5=S;
     
                jd=4;count=0;
    DelayMs(600);
                chaoshengbo();
                S4=S;

                jd=3;count=0;
    DelayMs(600);
                chaoshengbo();
                S3=S;
                jd=2;count=0;
    DelayMs(600);
                chaoshengbo();
                S2=S;

               jd=1;count=0;
                DelayMs(600);
                chaoshengbo();
                S1=S;
                jd=3;count=0;
    DelayMs(600);
    if(S3<25)
    {
     hou();
        DelayMs(300);
   }
      if((S5>25||S4>25)&&(S3<=25||S2<=25))
        {
            manyou();
            DelayMs(600);
        }
      else if((S3>25||S2>25)&&(S5<=25||S4<=25))
        {
           manzuo();
            DelayMs(600);
        }
       else
   {
        hou();
        DelayMs(300);                 
        if(S5>S5||S4>S4){kuaiyou();
  }
  else {
   kuaizuo();
    }
        DelayMs(600);
         }        
  }
}
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Time1_Int() interrupt 3
{
    TH1 = 0xFE;
    TL1 = 0x33;
    if(count< jd)pwm=1;                  
    else pwm=0;         
    count++;
    count%=40;  
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
52P + 1 + 1 欢迎加入

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

369750711 发表于 2018-11-29 23:52
这是51单片机的吧,你这一堆没头没脑的代码是想表达什么意思呢
逍遥游0222 发表于 2018-12-4 10:09
Z.W 发表于 2018-11-30 22:06
哈哈,是的。点错了,不好意思啊。感谢指教!
后半部分写的是超声波的算法。这个需要将超声波避障器安装 ...

你打算把超声波模块装在哪个位置  太低的话 有可能被小车自身硬件干扰  太高的话又无法检测到小块的障碍物   或者你是打算只在车头位置安装  但是如果就车头的话 并不需要五个方向的数据啊  
留块钱吃早饭 发表于 2018-11-29 23:39
记得初中的时候老师讲过,然鹅,啥都记不住了
dpqlovehack 发表于 2018-11-30 00:30
请楼主对每一行代码进行解释说明,就更完美了!
刚刚、、好 发表于 2018-11-30 00:34 来自手机
…………
sileny 发表于 2018-11-30 01:04
留块钱吃早饭 发表于 2018-11-29 23:39
记得初中的时候老师讲过,然鹅,啥都记不住了

这么优秀的吗
gamer8263 发表于 2018-11-30 01:21
不明觉厉~~
838384855 发表于 2018-11-30 08:59
不明觉厉~~
逍遥游0222 发表于 2018-11-30 09:29
这是51单片机的代码  然而  小车类的代码网上一搜一大堆    你这个有什么特殊之处吗
kaka0000 发表于 2018-11-30 12:41
这是啥板的代码
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 01:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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