找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5979|回復(fù): 6
收起左側(cè)

五路超聲波小車程序

[復(fù)制鏈接]
ID:240289 發(fā)表于 2017-10-17 16:30 | 顯示全部樓層 |閱讀模式
小車用的是52單片機(jī)的四驅(qū)wifi,兩側(cè)電機(jī)串聯(lián),超聲波模塊是便宜實(shí)用的HC-SR04

0.png
單片機(jī)源程序:
  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信號(hào)端
  17.     #define Right_moto_pwm P2_3 //PWM信號(hào)端


  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;} //左電機(jī)向前走
  27. #define Left_moto_back {IN1=1,IN2=0,EN1=1;} //左邊電機(jī)向后走
  28. #define Left_moto_Stop {EN1=0;} //左邊電機(jī)停轉(zhuǎn)
  29. #define Right_moto_go {IN3=1,IN4=0,EN2=1;} //右邊電機(jī)向前走
  30. #define Right_moto_back {IN3=0,IN4=1,EN2=1;} //右邊電機(jī)向后走
  31. #define Right_moto_Stop {EN2=0;} //右邊電機(jī)停轉(zhuǎn)



  32.    unsigned char pwm_val_left =0;//變量定義
  33.    unsigned char push_val_left =0;// 左電機(jī)占空比N/20

  34.    unsigned char pwm_val_right =0;
  35.    unsigned char push_val_right=0;// 右電機(jī)占空比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;                        //掃描時(shí)間變量                                       
  45. /************************************************************************/
  46. void delay(unsigned char x) //1ms延時(shí)函數(shù),100ms以內(nèi)可用
  47. {
  48. unsigned char i;
  49. while(x--)
  50. for(i=124;i>0;i--);
  51. }



  52. void Conut1(void)                   //計(jì)算距離
  53.         {
  54.           while(!ECHO1);                       //當(dāng)RX為零時(shí)等待
  55.            TR0=1;                               //開啟計(jì)數(shù)
  56.           while(ECHO1);                           //當(dāng)RX為1計(jì)數(shù)并等待
  57.             TR0=0;                                   //關(guān)閉計(jì)數(shù)
  58.             time=TH0*256+TL0;                   //讀取脈寬長度
  59.             TH0=0;
  60.             TL0=0;
  61.             S1=(time*1.7)/100;        //算出來是CM

  62.         }
  63. void Conut2(void)                   //計(jì)算距離
  64.         {
  65.           while(!ECHO2);                       //當(dāng)RX為零時(shí)等待
  66.            TR0=1;                               //開啟計(jì)數(shù)
  67.           while(ECHO2);                           //當(dāng)RX為1計(jì)數(shù)并等待
  68.             TR0=0;                                   //關(guān)閉計(jì)數(shù)
  69.             time=TH0*256+TL0;                   //讀取脈寬長度
  70.             TH0=0;
  71.             TL0=0;
  72.             S2=(time*1.7)/100;        //算出來是CM
  73.         }
  74. void Conut3(void)                   //計(jì)算距離
  75.         {
  76.           while(!ECHO3);                       //當(dāng)RX為零時(shí)等待
  77.            TR0=1;                               //開啟計(jì)數(shù)
  78.           while(ECHO3);                           //當(dāng)RX為1計(jì)數(shù)并等待
  79.             TR0=0;                                   //關(guān)閉計(jì)數(shù)
  80.             time=TH0*256+TL0;                   //讀取脈寬長度
  81.             TH0=0;
  82.             TL0=0;
  83.             S3=(time*1.7)/100;        //算出來是CM
  84.         }

  85. void Conut4(void)                   //計(jì)算距離
  86.         {
  87.           while(!ECHO4);                       //當(dāng)RX為零時(shí)等待
  88.            TR0=1;                               //開啟計(jì)數(shù)
  89.           while(ECHO4);                           //當(dāng)RX為1計(jì)數(shù)并等待
  90.             TR0=0;                                   //關(guān)閉計(jì)數(shù)
  91.             time=TH0*256+TL0;                   //讀取脈寬長度
  92.             TH0=0;
  93.             TL0=0;
  94.             S4=(time*1.7)/100;        //算出來是CM
  95.         }

  96. void Conut5(void)                   //計(jì)算距離
  97.         {
  98.           while(!ECHO5);                       //當(dāng)RX為零時(shí)等待
  99.            TR0=1;                               //開啟計(jì)數(shù)
  100.           while(ECHO5);                           //當(dāng)RX為1計(jì)數(shù)并等待
  101.             TR0=0;                                   //關(guān)閉計(jì)數(shù)
  102.             time=TH0*256+TL0;                   //讀取脈寬長度
  103.             TH0=0;
  104.             TL0=0;
  105.             S5=(time*1.7)/100;        //算出來是CM
  106.         }

  107. //全速前進(jìn)
  108. void  run(void)
  109.     {
  110.         push_val_left=20; //左電機(jī)調(diào)速,速度調(diào)節(jié)變量 0-20。。。0最小,20最大,四驅(qū)大輪>6
  111.     push_val_right=18; //右電機(jī)調(diào)速                                   
  112.     Left_moto_go ; //左電機(jī)往前走
  113.     Right_moto_go ; //右電機(jī)往前走
  114.         
  115.     }
  116. /************************************************************************/
  117. //全速后退
  118. void  backrun(void)
  119.     {  
  120.            push_val_left=20;
  121.        push_val_right=18                                                          ;
  122.        Left_moto_back ; //左電機(jī)往前走
  123.        Right_moto_back ; //右電機(jī)往前走
  124.     }
  125. /************************************************************************/
  126. //左轉(zhuǎn)
  127. void  leftrun(void)
  128.     {
  129.            push_val_left=13;
  130.       push_val_right=10;
  131.       Left_moto_back ; //左電機(jī)往后走
  132.       Right_moto_go ; //右電機(jī)往前走
  133.    }
  134. /************************************************************************/
  135. //右轉(zhuǎn)
  136. void  rightrun(void)
  137.    {
  138.            push_val_left=13;
  139.     push_val_right=10;
  140.     Left_moto_go ; //左電機(jī)往前走
  141.     Right_moto_back ; //右電機(jī)往后走
  142.    }
  143. /************************************************************************/
  144. //STOP
  145. void  stoprun(void)
  146.     {
  147.      Left_moto_Stop ; //左電機(jī)停
  148.      Right_moto_Stop ; //右電機(jī)停

  149.     }
  150. /************************************************************************/
  151. void  COMM( void )                       
  152. {
  153.                   
  154.                    TX1=1;
  155.            delay(1);
  156.            TX1=0;          //啟動(dòng)超聲波測(cè)距
  157.           Conut1();                           //計(jì)算距離
  158.                  
  159.                   TX2=1;
  160.          delay(1);
  161.           TX2=0;          //啟動(dòng)超聲波測(cè)距
  162.           Conut2();                          //計(jì)算距離
  163.                           
  164.                   TX3=1;
  165.            delay(1);
  166.            TX3=0;          //啟動(dòng)超聲波測(cè)距
  167.           Conut3();                          //計(jì)算距離

  168.                   TX4=1;
  169.            delay(1);
  170.            TX4=0;          //啟動(dòng)超聲波測(cè)距
  171.           Conut4();                          //計(jì)算距離

  172.                   TX5=1;
  173.            delay(1);
  174.            TX5=0;          //啟動(dòng)超聲波測(cè)距
  175.           Conut5();                          //計(jì)算距離
  176.                  
  177.     if(S1<20 && S3<30 && S5<20) //進(jìn)入狹窄通道
  178.      {
  179.        backrun(); //倒車
  180.       }        

  181.     if(S2<20 && S3<30 && S4<20) //進(jìn)入狹窄通道
  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度角時(shí),車的左邊比車的右邊距離小,右轉(zhuǎn)

  193.     }
  194.   else
  195.     if(S2<20)
  196.     {
  197.       rightrun(); //車與障礙物呈45度角時(shí),車的左邊比車的右邊距離小,右轉(zhuǎn)
  198.     }
  199.    else
  200.     if(S3<30  ) //車子與障礙物90度垂直,右邊距離小左轉(zhuǎn)
  201.      {
  202.         backrun();
  203.     if(S2>20&&S4<20)
  204.      {
  205.       leftrun(); //車與障礙物呈45度角時(shí),車的左邊比車的右邊距離小,右轉(zhuǎn)
  206.           if(S2<20&&S4>20)
  207.         { backrun(); //車與障礙物呈45度角時(shí),車的左邊比車的右邊距離小,右轉(zhuǎn)
  208.              delay(90);
  209.              delay(90);
  210.                  }
  211.       }
  212.      }
  213.   else
  214.     if(S4<20)
  215.     {
  216.       leftrun(); //車與障礙物呈45度角時(shí),車的右邊比車的左邊距離小,左轉(zhuǎn)
  217.     }
  218.   else
  219.     if(S5<20)
  220.     {
  221.       leftrun(); //車與障礙物呈45度角時(shí),車的右邊比車的左邊距離小,左轉(zhuǎn)
  222.     }  

  223.   else
  224.       if(S3<30 && S1<S5 ) //車子與障礙物90度垂直,左邊距離小右轉(zhuǎn)
  225.      {
  226.         rightrun();
  227.      }
  228.   else
  229.     if(S3<30 && S1>S5 ) //車子與障礙物90度垂直,右邊距離小左轉(zhuǎn)
  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度角時(shí),車的左邊比車的右邊距離小,右轉(zhuǎn)
  242.     }
  243.   else
  244.     if(S3<30&&S4<20)
  245.     {
  246.       leftrun(); //車與障礙物呈45度角時(shí),車的右邊比車的左邊距離小,左轉(zhuǎn)
  247.     }
  248.   else
  249.     if(S3>30&&S4<20)
  250.     {
  251.       leftrun(); //車與障礙物呈45度角時(shí),車的右邊比車的左邊距離小,左轉(zhuǎn)
  252.     }
  253.          else
  254.     if(S3>30&&S2<20)
  255.     {
  256.       rightrun(); //車與障礙物呈45度角時(shí),車的左邊比車的右邊距離小,右轉(zhuǎn)

  257.     }
  258.                  
  259.           else
  260.     if(S2>20&&S4<20)
  261.     {
  262.       leftrun(); //車與障礙物呈45度角時(shí),車的左邊比車的右邊距離小,右轉(zhuǎn)
  263.           if(S2<20&&S4>20)
  264.         { backrun(); //車與障礙物呈45度角時(shí),車的左邊比車的右邊距離小,右轉(zhuǎn)
  265.              delay(90);
  266.              delay(90);
  267.                  }
  268.     }



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

  272.         }

  273. }
  274. /************************************************************************/
  275. /* PWM調(diào)制電機(jī)轉(zhuǎn)速 */
  276. /************************************************************************/
  277. /* 左電機(jī)調(diào)速 */
  278. /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比 */
  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. /* 右電機(jī)調(diào)速 */
  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中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)*/
  322.          void time1()interrupt 3            using 2
  323. {        
  324.      TH1=(65536-100)/256;          //100US定時(shí)
  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();                                  //定時(shí)器100US為準(zhǔn)。在這個(gè)基礎(chǔ)上延時(shí)
  331. }
  332. /***************************************************/
  333. ///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)*/
  334.          void timer0()interrupt 1            
  335. {        

  336. }

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

  338. void main(void)
  339. {

  340.         TMOD=0X11;
  341.         TH1=(65536-100)/256;          //100US定時(shí)
  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)                       /*無限循環(huán)*/
  351.         {
  352.           COMM();
  353.         }
  354. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:65956 發(fā)表于 2018-3-31 16:52 | 顯示全部樓層
很牛,一下子用那么多個(gè)超聲波,不過在運(yùn)行時(shí)會(huì)不會(huì)時(shí)不時(shí)撞頭呢
回復(fù)

使用道具 舉報(bào)

ID:65956 發(fā)表于 2018-3-31 16:53 | 顯示全部樓層
建議超聲波模塊改用那種模擬量的超聲波,反應(yīng)會(huì)快點(diǎn)
回復(fù)

使用道具 舉報(bào)

ID:304041 發(fā)表于 2018-4-12 12:57 | 顯示全部樓層
TX1=1;                               
TX1=0;    大哥請(qǐng)問下,為什么我編譯你程序時(shí),提示這句話周圍有錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

ID:301604 發(fā)表于 2018-4-14 16:14 | 顯示全部樓層
大神,這么多個(gè)超聲波模塊可以有辦法用一個(gè)程序驅(qū)動(dòng)觸發(fā)么?
回復(fù)

使用道具 舉報(bào)

ID:397735 發(fā)表于 2020-3-6 18:33 | 顯示全部樓層
huanghu 發(fā)表于 2018-4-12 12:57
TX1=1;                               
TX1=0;    大哥請(qǐng)問下,為什么我編譯你程序時(shí),提示這句話周圍有錯(cuò)誤

大哥問下 你這個(gè)問題解決了么
回復(fù)

使用道具 舉報(bào)

ID:696418 發(fā)表于 2020-12-31 18:20 | 顯示全部樓層
這個(gè) 程序好使嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表