Z.W 发表于 2018-11-29 23:05

超声波避障小车

#include <reg52.h>
#define uchar unsigned char
#define uintunsigned 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()
* 功能 : 两个电机停止。
***********************************************************************/
voidting()
{
   IN1=0;   
   IN2=0;
   IN3=0;      
   IN4=0;
}   
/********************************************************************
* 名称 :hou()
* 功能 : 两个电机后退。
***********************************************************************/
void hou()
{
   IN1=1;   
   IN2=0;
   IN3=0;      
   IN4=1;
}   
/********************************************************************
* 名称 :manyou()
* 功能 : 右停左前。
***********************************************************************/
voidmanyou()
{
   IN1=0;   
   IN2=1;
   IN3=0;      
   IN4=0;
}
/********************************************************************
* 名称 :kuaiyou()
* 功能 : 右前左后。
***********************************************************************/
voidkuaiyou()
{
   IN1=0;   
   IN2=1;
   IN3=0;      
   IN4=1;
}
/********************************************************************
* 名称 :manzuo()
* 功能 : 左停右前。
***********************************************************************/
voidmanzuo()
{
   IN1=0;   
   IN2=0;
   IN3=1;      
   IN4=0;
}
   /********************************************************************
* 名称 :kuaizuo()
* 功能 : 右后左前。
***********************************************************************/
voidkuaizuo()
{
   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;
}

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

这是啥板的代码
页: [1] 2 3
查看完整版本: 超声波避障小车