找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12881|回复: 3
收起左侧

简单红外避障小车单片机程序

  [复制链接]
ID:497325 发表于 2019-6-2 14:35 | 显示全部楼层 |阅读模式
这次的红外避障实验小车程序适合于初学者。

注意:每个小车转速等特性都会不同,具体的转向避障程序块儿可以自己试着调试
要有耐心。

实验照片

实验照片


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define   Left_moto2_pwm           qy_enb
  6. #define   Right_moto2_pwm         qz_ena
  7. #define   Left_moto_pwm          hy_enb
  8. #define  Right_moto_pwm                 hz_ena
  9. void delay(uint i)
  10. {
  11.         uint j,k;
  12.         for(j=i;j>0;j--)
  13.         for(k=114;k>0;k--);
  14. }
  15. sbit out_left=P2^0;
  16. sbit out_right=P2^1;
  17. //定义电机IO口
  18. sbit qz_ena=P1^0;
  19. sbit qz_in1=P1^1;
  20. sbit qz_in2=P1^2;

  21. sbit qy_enb=P1^3;
  22. sbit qy_in3=P1^4;
  23. sbit qy_in4=P1^5;

  24. sbit hz_ena=P1^6;
  25. sbit hz_in1=P1^7;
  26. sbit hz_in2=P2^2;

  27. sbit hy_enb=P2^6;
  28. sbit hy_in3=P2^4;
  29. sbit hy_in4=P2^5;
  30. //定义数据部分
  31. bit Right_moto_stop=1;          
  32. bit Left_moto_stop =1;               
  33. unsigned  int  time=0;               
  34. int pwm=3;
  35. unsigned char pwm_val_left  =0;//变量定义
  36. unsigned char push_val_left =0;// 左电机占空比N/10
  37. unsigned char pwm_val_right =0;
  38. unsigned char push_val_right=0;// 右电机占空比N/10
  39. /************************************************************************/
  40.      void  run(void)        //pwm调速函数
  41. {
  42.      push_val_left  =pwm;  //PWM 调节参数1-10   1为最慢,10是最快  改这个值可以改变其速度
  43.          push_val_right =pwm;         //PWM 调节参数1-10   1为最慢,10是最快         改这个值可以改变其速度
  44.                  if(pwm==10) pwm=0;
  45.                 if(pwm==0&&pwm<0) pwm=0;

  46. }
  47. /************************************************************************/
  48. /*                    PWM调制电机转速                                   */
  49. /************************************************************************/


  50. /*                    左侧电机调速                                        */
  51. /*调节push_val_left的值改变电机转速,占空比            */
  52. void pwm_out_left_moto(void)
  53. {  
  54.    if(Left_moto_stop)
  55.    {
  56.     if(pwm_val_left<=push_val_left)
  57.              {  Left_moto_pwm=1;
  58.                     Left_moto2_pwm=1;  }
  59.         else
  60.               { Left_moto_pwm=0;Left_moto2_pwm=0;                 }

  61.         if(pwm_val_left>=10)
  62.         pwm_val_left=0;
  63.    }
  64.    else { Left_moto_pwm=0;Left_moto2_pwm=0;          }
  65. }
  66. /******************************************************************/
  67. /*                    右侧电机调速                                  */  
  68.    void pwm_out_right_moto(void)
  69. {
  70.   if(Right_moto_stop)
  71.    {
  72.     if(pwm_val_right<=push_val_right)
  73.              {  Right_moto_pwm=1;
  74.                    Right_moto2_pwm=1;           }
  75.         else
  76.                {Right_moto_pwm=0;
  77.                     Right_moto2_pwm=0;}
  78.         if(pwm_val_right>=10)
  79.             pwm_val_right=0;
  80.    }
  81.    else    {Right_moto_pwm=0;Right_moto2_pwm=0;        }
  82. }
  83. /***************************************************************************/
  84. void Forward(void)//前进
  85. {
  86.         ET0=1;
  87.         run();
  88.         qz_in1=0;//右后轮
  89.         qz_in2=1;
  90.         qy_in3=1;//后坐
  91.         qy_in4=0;
  92.         hz_in1=1;  //前右
  93.         hz_in2=0;
  94.         hy_in3=1;        //前左
  95.         hy_in4=0;
  96. }

  97. void Stop(void)        //停车
  98. {

  99.         qz_in1=0;
  100.         qz_in2=0;
  101.         qy_in3=0;
  102.         qy_in4=0;
  103.         hz_in1=0;
  104.         hz_in2=0;
  105.         hy_in3=0;
  106.         hy_in4=0;
  107. }

  108. void back(void)        //后退
  109. {
  110.         ET0=1;
  111.         run();
  112.         qz_in1=1;
  113.         qz_in2=0;
  114.         qy_in3=0;
  115.         qy_in4=1;
  116.         hz_in1=0;
  117.         hz_in2=1;
  118.         hy_in3=0;
  119.         hy_in4=1;       
  120. }   
  121. void Turn_Right(void)         //向右旋转
  122. {
  123.         ET0=1;
  124.         run();
  125.            qz_in1=0;
  126.         qz_in2=0;
  127.         qy_in3=1;
  128.         qy_in4=0;
  129.         hz_in1=1;
  130.         hz_in2=0;
  131.         hy_in3=0;
  132.         hy_in4=0;
  133. }
  134. void Turn_Left()
  135. {
  136.         ET0=1;
  137.         run();
  138.         qz_in1=0;
  139.         qz_in2=1;
  140.         qy_in3=0;
  141.         qy_in4=0;
  142.         hz_in1=0;
  143.         hz_in2=0;
  144.         hy_in3=1;
  145.         hy_in4=0;
  146. }
  147. void main()
  148. {       
  149.         //用于初始化pwm调速
  150.         TMOD=0X01;
  151.         TH0= 0XF8;                  //1ms定时
  152.         TL0= 0X30;
  153.         TR0= 1;
  154.         ET0= 1;
  155.         EA = 1;
  156.         while(1)
  157.         {
  158.                        //有信号为0  没有信号为1
  159.         if(out_left==1&&out_right==1)
  160.                 {
  161.                 pwm=3;
  162.             Forward();   //调用前进函数       
  163.                 }          
  164.                 if(out_left==1&&out_right==0)            //右边检测到障碍物
  165.                 {
  166.                        
  167.                         pwm=5;
  168.                         back();
  169.                         delay(300);
  170.                         Turn_Left;                       //调用小车左转函数
  171.                         delay(500);
  172.                
  173.                 }                          
  174.                 if(out_left==0&&out_right==1 )                //左边检测到障碍物
  175.                 {          
  176.                        
  177.                         pwm=5;
  178.                         back();
  179.                         delay(300);
  180.                         Turn_Right();                   //调用小车右转函数
  181.                         delay(500);
  182.                        
  183.                 }
  184.                         if(out_left==0&&out_right==0 )                //左边检测到障碍物
  185.                 {          
  186.                         pwm=3;
  187.                         back();                   //调用小车右转函数
  188.                 }

  189.         }

  190. }
  191. ///*TIMER0中断服务子函数产生PWM信号*/
  192.         void timer0()interrupt 1   using 2
  193. {
  194.      TH0=0XF8;          //1Ms定时
  195.          TL0=0X30;
  196.          time++;
  197.          pwm_val_left++;
  198.          pwm_val_right++;
  199.          pwm_out_left_moto();
  200.          pwm_out_right_moto();
  201. }
  202. /*         if(out==0)         //距离在范围内0  快要撞了
  203.         {
  204.                 Stop();
  205.                 back();
  206.                 delay(1000);
  207.         }
  208.         else            //距离超出定值1  离墙还远         
  209.         {
  210.                 Stop();
  211.                 Forward();
  212.         }*/
复制代码

所有资料51hei提供下载:
红外避障.zip (22.3 KB, 下载次数: 138)

评分

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

查看全部评分

回复

使用道具 举报

ID:783876 发表于 2020-6-19 10:13 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:931523 发表于 2021-6-4 22:51 | 显示全部楼层
代码很好,很适合初学者
回复

使用道具 举报

ID:922888 发表于 2021-7-7 15:41 | 显示全部楼层
代码不错,值得学习
谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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