找回密码
 立即注册

QQ登录

只需一步,快速开始

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

五路超声波小车程序

[复制链接]
跳转到指定楼层
楼主
小车用的是52单片机的四驱wifi,两侧电机串联,超声波模块是便宜实用的HC-SR04


单片机源程序:
  1.                                                                                  /****************************************************************************
  2.          硬件连接


  3.         ****************************************************************************/

  4.         #include<reg52.h>
  5.         #include <intrins.h>

  6.         #define  ECHO1  P1_0                                   //超声波接口定义
  7.         #define  TX1  P1_1                                   //超声波接口定义

  8.         #define  ECHO2  P1_2                                   //超声波接口定义
  9.         #define  TX2  P1_3                                   //超声波接口定义

  10.         #define  ECHO3  P1_4                                   //超声波接口定义
  11.         #define  TX3  P1_5                                   //超声波接口定义

  12.         #define  ECHO4  P1_6                                   //超声波接口定义
  13.         #define  TX4  P1_7                                   //超声波接口定义


  14.         #define  ECHO5  P0_0                                   //超声波接口定义
  15.         #define  TX5  P0_1                                           //超声波接口定义

  16.     #define Left_moto_pwm P2_2 //PWM信号端
  17.     #define Right_moto_pwm P2_3 //PWM信号端


  18. sbit IN1=P2^0;
  19. sbit IN2=P2^1;
  20. sbit IN3=P2^4;
  21. sbit IN4=P2^5;
  22. sbit EN1=P2^2;
  23. sbit EN2=P2^3;
  24. bit Right_moto_stop=1;
  25. bit Left_moto_stop =1;
  26. #define Left_moto_go {IN1=0,IN2=1,EN1=1;} //左电机向前走
  27. #define Left_moto_back {IN1=1,IN2=0,EN1=1;} //左边电机向后走
  28. #define Left_moto_Stop {EN1=0;} //左边电机停转
  29. #define Right_moto_go {IN3=1,IN4=0,EN2=1;} //右边电机向前走
  30. #define Right_moto_back {IN3=0,IN4=1,EN2=1;} //右边电机向后走
  31. #define Right_moto_Stop {EN2=0;} //右边电机停转



  32.    unsigned char pwm_val_left =0;//变量定义
  33.    unsigned char push_val_left =0;// 左电机占空比N/20

  34.    unsigned char pwm_val_right =0;
  35.    unsigned char push_val_right=0;// 右电机占空比N/20
  36.         
  37.    unsigned int time=0;
  38.    unsigned int timer=0;


  39.         unsigned long S1=0;
  40.         unsigned long S2=0;
  41.         unsigned long S3=0;
  42.         unsigned long S4=0;
  43.         unsigned long S5=0;

  44.         unsigned char timer1=0;                        //扫描时间变量                                       
  45. /************************************************************************/
  46. void delay(unsigned char x) //1ms延时函数,100ms以内可用
  47. {
  48. unsigned char i;
  49. while(x--)
  50. for(i=124;i>0;i--);
  51. }



  52. void Conut1(void)                   //计算距离
  53.         {
  54.           while(!ECHO1);                       //当RX为零时等待
  55.            TR0=1;                               //开启计数
  56.           while(ECHO1);                           //当RX为1计数并等待
  57.             TR0=0;                                   //关闭计数
  58.             time=TH0*256+TL0;                   //读取脉宽长度
  59.             TH0=0;
  60.             TL0=0;
  61.             S1=(time*1.7)/100;        //算出来是CM

  62.         }
  63. void Conut2(void)                   //计算距离
  64.         {
  65.           while(!ECHO2);                       //当RX为零时等待
  66.            TR0=1;                               //开启计数
  67.           while(ECHO2);                           //当RX为1计数并等待
  68.             TR0=0;                                   //关闭计数
  69.             time=TH0*256+TL0;                   //读取脉宽长度
  70.             TH0=0;
  71.             TL0=0;
  72.             S2=(time*1.7)/100;        //算出来是CM
  73.         }
  74. void Conut3(void)                   //计算距离
  75.         {
  76.           while(!ECHO3);                       //当RX为零时等待
  77.            TR0=1;                               //开启计数
  78.           while(ECHO3);                           //当RX为1计数并等待
  79.             TR0=0;                                   //关闭计数
  80.             time=TH0*256+TL0;                   //读取脉宽长度
  81.             TH0=0;
  82.             TL0=0;
  83.             S3=(time*1.7)/100;        //算出来是CM
  84.         }

  85. void Conut4(void)                   //计算距离
  86.         {
  87.           while(!ECHO4);                       //当RX为零时等待
  88.            TR0=1;                               //开启计数
  89.           while(ECHO4);                           //当RX为1计数并等待
  90.             TR0=0;                                   //关闭计数
  91.             time=TH0*256+TL0;                   //读取脉宽长度
  92.             TH0=0;
  93.             TL0=0;
  94.             S4=(time*1.7)/100;        //算出来是CM
  95.         }

  96. void Conut5(void)                   //计算距离
  97.         {
  98.           while(!ECHO5);                       //当RX为零时等待
  99.            TR0=1;                               //开启计数
  100.           while(ECHO5);                           //当RX为1计数并等待
  101.             TR0=0;                                   //关闭计数
  102.             time=TH0*256+TL0;                   //读取脉宽长度
  103.             TH0=0;
  104.             TL0=0;
  105.             S5=(time*1.7)/100;        //算出来是CM
  106.         }

  107. //全速前进
  108. void  run(void)
  109.     {
  110.         push_val_left=20; //左电机调速,速度调节变量 0-20。。。0最小,20最大,四驱大轮>6
  111.     push_val_right=18; //右电机调速                                   
  112.     Left_moto_go ; //左电机往前走
  113.     Right_moto_go ; //右电机往前走
  114.         
  115.     }
  116. /************************************************************************/
  117. //全速后退
  118. void  backrun(void)
  119.     {  
  120.            push_val_left=20;
  121.        push_val_right=18                                                          ;
  122.        Left_moto_back ; //左电机往前走
  123.        Right_moto_back ; //右电机往前走
  124.     }
  125. /************************************************************************/
  126. //左转
  127. void  leftrun(void)
  128.     {
  129.            push_val_left=13;
  130.       push_val_right=10;
  131.       Left_moto_back ; //左电机往后走
  132.       Right_moto_go ; //右电机往前走
  133.    }
  134. /************************************************************************/
  135. //右转
  136. void  rightrun(void)
  137.    {
  138.            push_val_left=13;
  139.     push_val_right=10;
  140.     Left_moto_go ; //左电机往前走
  141.     Right_moto_back ; //右电机往后走
  142.    }
  143. /************************************************************************/
  144. //STOP
  145. void  stoprun(void)
  146.     {
  147.      Left_moto_Stop ; //左电机停
  148.      Right_moto_Stop ; //右电机停

  149.     }
  150. /************************************************************************/
  151. void  COMM( void )                       
  152. {
  153.                   
  154.                    TX1=1;
  155.            delay(1);
  156.            TX1=0;          //启动超声波测距
  157.           Conut1();                           //计算距离
  158.                  
  159.                   TX2=1;
  160.          delay(1);
  161.           TX2=0;          //启动超声波测距
  162.           Conut2();                          //计算距离
  163.                           
  164.                   TX3=1;
  165.            delay(1);
  166.            TX3=0;          //启动超声波测距
  167.           Conut3();                          //计算距离

  168.                   TX4=1;
  169.            delay(1);
  170.            TX4=0;          //启动超声波测距
  171.           Conut4();                          //计算距离

  172.                   TX5=1;
  173.            delay(1);
  174.            TX5=0;          //启动超声波测距
  175.           Conut5();                          //计算距离
  176.                  
  177.     if(S1<20 && S3<30 && S5<20) //进入狭窄通道
  178.      {
  179.        backrun(); //倒车
  180.       }        

  181.     if(S2<20 && S3<30 && S4<20) //进入狭窄通道
  182.      {
  183.        backrun(); //倒车
  184.            if(S2>30 && S3>30)
  185.               leftrun();
  186.            if(S4>30 && S3>30)
  187.               rightrun();
  188.       }

  189. else
  190.     if(S1<20)
  191.     {
  192.       rightrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转

  193.     }
  194.   else
  195.     if(S2<20)
  196.     {
  197.       rightrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转
  198.     }
  199.    else
  200.     if(S3<30  ) //车子与障碍物90度垂直,右边距离小左转
  201.      {
  202.         backrun();
  203.     if(S2>20&&S4<20)
  204.      {
  205.       leftrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转
  206.           if(S2<20&&S4>20)
  207.         { backrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转
  208.              delay(90);
  209.              delay(90);
  210.                  }
  211.       }
  212.      }
  213.   else
  214.     if(S4<20)
  215.     {
  216.       leftrun(); //车与障碍物呈45度角时,车的右边比车的左边距离小,左转
  217.     }
  218.   else
  219.     if(S5<20)
  220.     {
  221.       leftrun(); //车与障碍物呈45度角时,车的右边比车的左边距离小,左转
  222.     }  

  223.   else
  224.       if(S3<30 && S1<S5 ) //车子与障碍物90度垂直,左边距离小右转
  225.      {
  226.         rightrun();
  227.      }
  228.   else
  229.     if(S3<30 && S1>S5 ) //车子与障碍物90度垂直,右边距离小左转
  230.      {
  231.        leftrun();
  232.      }
  233.     else
  234.     if(S1<20&&S5<20)
  235.     {
  236.        backrun();
  237.     }

  238.   else
  239.     if(S3<30&&S2<20)
  240.     {
  241.       rightrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转
  242.     }
  243.   else
  244.     if(S3<30&&S4<20)
  245.     {
  246.       leftrun(); //车与障碍物呈45度角时,车的右边比车的左边距离小,左转
  247.     }
  248.   else
  249.     if(S3>30&&S4<20)
  250.     {
  251.       leftrun(); //车与障碍物呈45度角时,车的右边比车的左边距离小,左转
  252.     }
  253.          else
  254.     if(S3>30&&S2<20)
  255.     {
  256.       rightrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转

  257.     }
  258.                  
  259.           else
  260.     if(S2>20&&S4<20)
  261.     {
  262.       leftrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转
  263.           if(S2<20&&S4>20)
  264.         { backrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转
  265.              delay(90);
  266.              delay(90);
  267.                  }
  268.     }



  269.   else
  270.    {
  271.       run();

  272.         }

  273. }
  274. /************************************************************************/
  275. /* PWM调制电机转速 */
  276. /************************************************************************/
  277. /* 左电机调速 */
  278. /*调节push_val_left的值改变电机转速,占空比 */
  279. void pwm_out_left_moto(void)
  280. {
  281.    if(Left_moto_stop)
  282.       {
  283.           if(pwm_val_left<=push_val_left)
  284.            {
  285.              Left_moto_pwm=1;
  286.            }
  287.        else
  288.          {
  289.            Left_moto_pwm=0;
  290.          }
  291.        if(pwm_val_left>=20)
  292.            pwm_val_left=0;
  293.      }
  294.    else
  295.     {
  296.      Left_moto_pwm=0;
  297.     }
  298. }
  299. /******************************************************************/
  300. /* 右电机调速 */
  301. void pwm_out_right_moto(void)
  302. {
  303.       if(Right_moto_stop)
  304.        {
  305.            if(pwm_val_right<=push_val_right)
  306.             {
  307.               Right_moto_pwm=1;
  308.             }
  309.         else
  310.             {
  311.                Right_moto_pwm=0;
  312.             }
  313.          if(pwm_val_right>=20)
  314.           pwm_val_right=0;
  315.       }
  316.     else
  317.       {
  318.         Right_moto_pwm=0;
  319.        }
  320. }



  321. ///*TIMER1中断服务子函数产生PWM信号*/
  322.          void time1()interrupt 3            using 2
  323. {        
  324.      TH1=(65536-100)/256;          //100US定时
  325.          TL1=(65536-100)%256;
  326.          timer++;
  327.          pwm_val_left++;
  328.      pwm_val_right++;
  329.      pwm_out_left_moto();
  330.      pwm_out_right_moto();                                  //定时器100US为准。在这个基础上延时
  331. }
  332. /***************************************************/
  333. ///*TIMER0中断服务子函数产生PWM信号*/
  334.          void timer0()interrupt 1            
  335. {        

  336. }

  337. /***************************************************/

  338. void main(void)
  339. {

  340.         TMOD=0X11;
  341.         TH1=(65536-100)/256;          //100US定时
  342.         TL1=(65536-100)%256;
  343.         TH0=0;
  344.         TL0=0;  
  345.         TR1= 1;
  346.         ET1= 1;
  347.         ET0= 1;
  348.         EA = 1;

  349.         delay(100);
  350.           while(1)                       /*无限循环*/
  351.         {
  352.           COMM();
  353.         }
  354. }

复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65956 发表于 2018-3-31 16:52 | 只看该作者
很牛,一下子用那么多个超声波,不过在运行时会不会时不时撞头呢
回复

使用道具 举报

板凳
ID:65956 发表于 2018-3-31 16:53 | 只看该作者
建议超声波模块改用那种模拟量的超声波,反应会快点
回复

使用道具 举报

地板
ID:304041 发表于 2018-4-12 12:57 | 只看该作者
TX1=1;                               
TX1=0;    大哥请问下,为什么我编译你程序时,提示这句话周围有错误
回复

使用道具 举报

5#
ID:301604 发表于 2018-4-14 16:14 | 只看该作者
大神,这么多个超声波模块可以有办法用一个程序驱动触发么?
回复

使用道具 举报

6#
ID:397735 发表于 2020-3-6 18:33 | 只看该作者
huanghu 发表于 2018-4-12 12:57
TX1=1;                               
TX1=0;    大哥请问下,为什么我编译你程序时,提示这句话周围有错误

大哥问下 你这个问题解决了么
回复

使用道具 举报

7#
ID:696418 发表于 2020-12-31 18:20 | 只看该作者
这个 程序好使吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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