標(biāo)題: 簡(jiǎn)單紅外避障小車(chē)單片機(jī)程序 [打印本頁(yè)]

作者: 123wer煩    時(shí)間: 2019-6-2 14:35
標(biāo)題: 簡(jiǎn)單紅外避障小車(chē)單片機(jī)程序
這次的紅外避障實(shí)驗(yàn)小車(chē)程序適合于初學(xué)者。

注意:每個(gè)小車(chē)轉(zhuǎn)速等特性都會(huì)不同,具體的轉(zhuǎn)向避障程序塊兒可以自己試著調(diào)試
要有耐心。


單片機(jī)源程序如下:
  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. //定義電機(jī)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. //定義數(shù)據(jù)部分
  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;// 左電機(jī)占空比N/10
  37. unsigned char pwm_val_right =0;
  38. unsigned char push_val_right=0;// 右電機(jī)占空比N/10
  39. /************************************************************************/
  40.      void  run(void)        //pwm調(diào)速函數(shù)
  41. {
  42.      push_val_left  =pwm;  //PWM 調(diào)節(jié)參數(shù)1-10   1為最慢,10是最快  改這個(gè)值可以改變其速度
  43.          push_val_right =pwm;         //PWM 調(diào)節(jié)參數(shù)1-10   1為最慢,10是最快         改這個(gè)值可以改變其速度
  44.                  if(pwm==10) pwm=0;
  45.                 if(pwm==0&&pwm<0) pwm=0;

  46. }
  47. /************************************************************************/
  48. /*                    PWM調(diào)制電機(jī)轉(zhuǎn)速                                   */
  49. /************************************************************************/


  50. /*                    左側(cè)電機(jī)調(diào)速                                        */
  51. /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比            */
  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. /*                    右側(cè)電機(jī)調(diào)速                                  */  
  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)//前進(jìn)
  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)        //停車(chē)
  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)         //向右旋轉(zhuǎn)
  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調(diào)速
  150.         TMOD=0X01;
  151.         TH0= 0XF8;                  //1ms定時(shí)
  152.         TL0= 0X30;
  153.         TR0= 1;
  154.         ET0= 1;
  155.         EA = 1;
  156.         while(1)
  157.         {
  158.                        //有信號(hào)為0  沒(méi)有信號(hào)為1
  159.         if(out_left==1&&out_right==1)
  160.                 {
  161.                 pwm=3;
  162.             Forward();   //調(diào)用前進(jìn)函數(shù)       
  163.                 }          
  164.                 if(out_left==1&&out_right==0)            //右邊檢測(cè)到障礙物
  165.                 {
  166.                        
  167.                         pwm=5;
  168.                         back();
  169.                         delay(300);
  170.                         Turn_Left;                       //調(diào)用小車(chē)左轉(zhuǎn)函數(shù)
  171.                         delay(500);
  172.                
  173.                 }                          
  174.                 if(out_left==0&&out_right==1 )                //左邊檢測(cè)到障礙物
  175.                 {          
  176.                        
  177.                         pwm=5;
  178.                         back();
  179.                         delay(300);
  180.                         Turn_Right();                   //調(diào)用小車(chē)右轉(zhuǎn)函數(shù)
  181.                         delay(500);
  182.                        
  183.                 }
  184.                         if(out_left==0&&out_right==0 )                //左邊檢測(cè)到障礙物
  185.                 {          
  186.                         pwm=3;
  187.                         back();                   //調(diào)用小車(chē)右轉(zhuǎn)函數(shù)
  188.                 }

  189.         }

  190. }
  191. ///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)*/
  192.         void timer0()interrupt 1   using 2
  193. {
  194.      TH0=0XF8;          //1Ms定時(shí)
  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)         //距離在范圍內(nèi)0  快要撞了
  203.         {
  204.                 Stop();
  205.                 back();
  206.                 delay(1000);
  207.         }
  208.         else            //距離超出定值1  離墻還遠(yuǎn)         
  209.         {
  210.                 Stop();
  211.                 Forward();
  212.         }*/
復(fù)制代碼

所有資料51hei提供下載:
紅外避障.zip (22.3 KB, 下載次數(shù): 140)




作者: ysn123    時(shí)間: 2020-6-19 10:13
謝謝樓主分享
作者: 呂小布不    時(shí)間: 2021-6-4 22:51
代碼很好,很適合初學(xué)者
作者: xuxuxuxuxuxuxu    時(shí)間: 2021-7-7 15:41
代碼不錯(cuò),值得學(xué)習(xí)
謝謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1