找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机超声波摇头避障小车源码

[复制链接]
跳转到指定楼层
楼主
最初是在arduino的论坛看到的,觉得很好玩,就有了用51做的想法。从硬件搭建到程序编写都是我一个人完成的(当时单片机啥都不懂
用了一两个月,现在终于做好了。现在拿出来给大家参考,希望对大家能有所帮助。如果大家有什么好的意见和想法,欢迎在下面留言


全部源码下载:
超声波摇头避障小车.zip (48.74 KB, 下载次数: 86)



部分单片机源程序:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include"duoji.h"
  4. #include"ultrasonic.h"
  5. #include"serial_port.h"

  6. uint flag_front,flag_left,flag_right,left_distance,right_distance;

  7. /******定义电机控制接口********/
  8. sbit in1=P1^4;
  9. sbit in2=P1^5;
  10. sbit in3=P1^6;
  11. sbit in4=P1^7;
  12. sbit ENA=P1^0;
  13. sbit ENB=P1^1;

  14. /**************小车运动控制****************/
  15. void forward(void)
  16. {
  17.    in1=0;
  18.    in2=1;
  19.    in3=0;
  20.    in4=1;
  21. }

  22. void backward(void)
  23. {
  24.    in1=1;
  25.    in2=0;
  26.    in3=1;
  27.    in4=0;
  28. }


  29. void turn_left(void)
  30. {                        
  31.    in1=1;
  32.    in2=1;
  33.    in3=0;
  34.    in4=1;
  35. }


  36. void turn_right(void)
  37. {
  38.    in1=0;
  39.    in2=1;
  40.    in3=1;
  41.    in4=1;
  42. }


  43. void stop(void)
  44. {
  45.    in1=1;
  46.    in2=1;
  47.    in3=1;
  48.    in4=1;
  49. }


  50. /*******************延时(单位1ms)*******************/
  51. void dianji_delayms(unsigned int ms)
  52. {
  53.         unsigned int a,b;
  54.     for(b=ms;b>0;b--)
  55.     for(a=110;a>0;a--);
  56. }





  57. /**************云台控制****************/                                                  
  58. void yuntai_control()
  59. {                                                                                                                                 
  60. /************舵机摆正后测距************/                                                   
  61.   get_wave();
  62.   if(get_distance()<=16)
  63.    {
  64.             stop();
  65.             dianji_delayms(400);           
  66.                 get_wave();
  67.                 if(get_distance()<=16)
  68.                 {
  69.                      flag_front=1;
  70.                      if(get_distance()<=4)
  71.                       {
  72.                                   backward();
  73.                                   dianji_delayms(300);
  74.                                   stop();
  75.                           }
  76.                               dianji_delayms(1000);
  77.                       duoji_positive_90degree();                 //测得前方有障碍,舵机向左旋转90°
  78.                       dianji_delayms(100);
  79.                 }                                                                                                                                         
  80. /************舵机左转90°后测距************/
  81.         get_wave();
  82.                 left_distance=get_distance();                                                                                          
  83.         if(left_distance<=8)
  84.           {
  85.             flag_left=1;
  86.           }
  87.             duoji_negative_90degree();                 //舵机向右旋转180°
  88.                 dianji_delayms(100);

  89. /************舵机右转180°后测距************/
  90.               get_wave();
  91.                           right_distance=get_distance();
  92.               if(right_distance<=8)
  93.                 {
  94.                   flag_right=1;
  95.                 }
  96.                   duoji_zero_degree();                 //舵机摆正                          
  97.                                   dianji_delayms(100);
  98.    }
  99. }





  100. /**************电机控制****************/                                                                  
  101. void car_operational_control()
  102. {
  103.   yuntai_control();
  104.   if(1==flag_front)
  105.    {                                 
  106.      if(1==flag_front&&1==flag_left&&0==flag_right)                  
  107.         {
  108.                  flag_front=0;
  109.                  flag_left=0;
  110.                  flag_right=0;
  111.          turn_right();
  112.              dianji_delayms(500);
  113.                  stop();
  114.         }
  115.          else if(1==flag_front&&0==flag_left&&1==flag_right)
  116.                {
  117.                             flag_front=0;
  118.                         flag_left=0;
  119.                         flag_right=0;
  120.                 turn_left();
  121.                     dianji_delayms(500);
  122.                                 stop();
  123.                }
  124.                                   else if(1==flag_front&&0==flag_left&&0==flag_right)
  125.                                           {
  126.                                               flag_front=0;
  127.                                   flag_left=0;
  128.                                   flag_right=0;
  129.                                                   turn_right();
  130.                                                   dianji_delayms(500);
  131.                                                   stop();
  132.                                           }                          
  133.                                else if(1==flag_front&&1==flag_left&&1==flag_right)
  134.                                {
  135.                                                        flag_front=0;
  136.                                            flag_left=0;
  137.                                            flag_right=0;
  138.                                                        if(left_distance<=right_distance)
  139.                                                              {
  140.                                                               turn_right();
  141.                                                               dianji_delayms(250);
  142.                                                              }
  143.                                                                 else
  144.                                                                           {
  145.                                                                                  turn_left();
  146.                                                                                      dianji_delayms(250);
  147.                                                                               }
  148.                                }               
  149.    }
  150.      else
  151.               {
  152.                      forward();
  153.                   }
  154. }
复制代码

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-1-7 15:27 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:149774 发表于 2017-2-14 15:42 | 只看该作者
小车速度太快了,有PWM更好
回复

使用道具 举报

地板
ID:262587 发表于 2017-12-20 11:14 | 只看该作者
学习参考下~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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