久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5930|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 高清欧美性猛交 | 久久一区二区三区四区 | 精品免费国产一区二区三区四区 | 亚洲91精品 | 狠狠av | 99久久婷婷国产综合精品电影 | 亚洲婷婷六月天 | 久久国产传媒 | 欧美一级在线视频 | 91人人视频在线观看 | 99精品欧美一区二区蜜桃免费 | 日韩美女一区二区三区在线观看 | 91精品亚洲 | 精品人伦一区二区三区蜜桃网站 | 国产成人网 | 91精品导航| 亚洲 欧美 精品 | 欧美日韩中文在线 | 久久中文字幕一区 | 偷拍自拍在线观看 | www日本在线播放 | 国产视频黄色 | av影片在线 | 国产精品一区二区三区四区五区 | 中文字幕日韩av | 91色在线 | 久久视频免费看 | 一区二区三区四区免费视频 | 操人网站| 久草精品在线 | 亚洲区一区二 | 毛片免费观看 | 精品一区二区三区四区 | 亚洲精品综合一区二区 | 国产欧美在线视频 | 男人天堂网址 | 亚洲福利网站 | 少妇性l交大片免费一 | 自拍视频网站 | 黄色中文字幕 | 国产精品一区二区三区在线 |