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

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

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)尋跡避障小車(chē)源程序

  [復(fù)制鏈接]
ID:372259 發(fā)表于 2018-7-16 08:21 | 顯示全部樓層 |閱讀模式
單片機(jī)避障程序源程序如下:
  1. /*
  2. * 作者:趙新
  3. * 功能:實(shí)現(xiàn)小車(chē)躲避障礙,通過(guò)檢測(cè)三個(gè)方向的距離,選擇最大距離轉(zhuǎn)彎
  4. * 日期:3/14
  5. * 說(shuō)明:STC89c52RC,12MHz
  6. * 注意:1000ms和100ms待測(cè),完成后刪除此行
  7. *—————————————————管腳說(shuō)明——————————————
  8. * Trig = P1^0
  9. * Echo = P3^2
  10. * PWM_OUT = P0^4
  11. *————————————————————————————————————————
  12. */
  13. #include "stc89c5x.h"
  14. #include "intrins.h"
  15. #include "Motor.h"
  16. #define X 20   //最短距離參考值 約為12厘米 受溫度影響,會(huì)存在10%左右的誤差

  17. sbit Trig = P1^0;//發(fā)送端
  18. sbit Echo = P3^2;//接收端 若用外部中斷0,則此引腳必須是P3.2

  19. sbit PWM_OUT = P0^4;//PWM信號(hào)輸出端
  20. u8 counts = 0;      //設(shè)置初值
  21. u8 PWM =6;                        //設(shè)置初值,任意值也可不設(shè)
  22. u8 Flag_Angle = 1;  //0 左45度 1 右45度 在函數(shù)Scan()中調(diào)用
  23. u8 Distance_Middle;
  24. u8 Distance_Temp[2];//0 左45度 1 右45度

  25. void Delay20us();
  26. void Delay100ms();
  27. void Delay1000ms();  //@12.000MHz  用于等待
  28. u8 Compute(u8 th,u8 tl);
  29. void Scan_Around();  //掃描左右
  30. void Scan_Middle();  //掃描正中前進(jìn)方向距離
  31. void main()
  32. {
  33.   TMOD = 0x11;//設(shè)置T0,T1 T0用于電平檢測(cè) T1用于產(chǎn)生舵機(jī)需要的PWM信號(hào)
  34.   
  35.   TH0 = 0x00;           //轉(zhuǎn)載初值
  36.   TL0 = 0x00;
  37.   ET0 = 1;           //打開(kāi)定時(shí)器中斷
  38.   TF0 = 0;           //失能定時(shí)器中斷標(biāo)志,也可忽略此語(yǔ)句
  39.   TR0 = 0;           //開(kāi)始時(shí)T0關(guān)閉

  40.   TH1 =        0xff;  //產(chǎn)生時(shí)基100us定時(shí),用于組成舵機(jī)各個(gè)角度的信號(hào)
  41.   TL1 = 0x9c;
  42.   ET1 = 1;
  43.   TF0 = 0;     //可忽略此語(yǔ)句,51復(fù)位此位為0
  44.   TR1 = 0;           //暫時(shí)關(guān)閉T1
  45.    
  46.   EX0 = 1;     //開(kāi)外部中斷   
  47.   IT0 = 1;     //下降沿觸發(fā)中斷

  48.   EA = 1;           //全局中斷開(kāi)
  49.                                    
  50.   Trig = 0;           //觸發(fā)端拉低
  51.   Echo = 0;
  52.   while(1)
  53.   {
  54.     //Scan_Around();
  55.     Scan_Middle();
  56.         if(Distance_Middle<=X)
  57.         {
  58.            Stop();
  59.            Scan_Around();
  60.            if((Distance_Temp[0]>Distance_Temp[1])&&Distance_Temp[0]>=X)
  61.            {
  62.              Turn_Left(0);
  63.                  Delay100ms();
  64.                  //Delay100ms();
  65.            }else
  66.             if((Distance_Temp[0]<Distance_Temp[1])&&Distance_Temp[1]>=X)
  67.                 {
  68.                   Turn_Right(0);
  69.                   Delay100ms();
  70.                   //Delay100ms();
  71.                 }else
  72.                  if((Distance_Temp[0]==Distance_Temp[1])&&Distance_Temp[0]>=X)
  73.                  {
  74.                    Turn_Right(0);
  75.                    Delay100ms();
  76.                    //Delay100ms();
  77.                  }else
  78.                   {
  79.                     Back();
  80.                         Delay100ms();
  81.                         Delay100ms();
  82.                         Delay100ms();
  83.                         Delay100ms();
  84.                         Delay100ms();
  85.                         Turn_Right(0);
  86.                         Delay100ms();
  87.                         //Delay100ms();
  88.                   }
  89.         }else
  90.          {
  91.            Go();
  92.          }
  93.   }
  94. }

  95. void Timer1(void) interrupt 3 //PWM產(chǎn)生
  96. {
  97.   TH1 = 0xff;
  98.   TL1 = 0x9c;
  99.   if(counts<PWM)
  100.     {
  101.           PWM_OUT = 1;
  102.          
  103.         }
  104.   else
  105.     {
  106.          PWM_OUT = 0;
  107.          if(counts==200)
  108.          {
  109.            counts = 0;
  110.          }
  111.         }
  112.          ++counts;
  113. }

  114. void Timer0(void) interrupt 1 //T0溢出中斷函數(shù),一般來(lái)說(shuō)T0溢出是不可能發(fā)生的,原因是傳感器最大探測(cè)距離為4m左右,所用時(shí)間不會(huì)超過(guò)65536us
  115. {
  116.   
  117. }
  118. void INT0_Test(void) interrupt 0  //下降沿到來(lái)之后,進(jìn)入外部中斷函數(shù),停止T0計(jì)數(shù),計(jì)算并發(fā)送計(jì)算值到計(jì)算機(jī)
  119. {
  120.   TR0 = 0;
  121.   switch(Flag_Angle)
  122.   {
  123.     case 0:Distance_Temp[0]=Compute(TH0,TL0);TH0 = TL0 = 0x00;break;  //左
  124.         case 1:Distance_Temp[1]=Compute(TH0,TL0);TH0 = TL0 = 0x00;break;  //右
  125.     default:break;
  126.   }
  127.                     //為了下一次準(zhǔn)確計(jì)數(shù),必須清空  
  128. }

  129. void Scan_Around()   //掃描左右
  130. {
  131.    Flag_Angle = 0;
  132.    PWM = 17;//左轉(zhuǎn)45度
  133.    TR1 = 1;
  134.    Delay1000ms();
  135.    TR1 = 0;                                 

  136.    Trig = 1;                //觸發(fā)一次檢測(cè)
  137.    Delay20us();
  138.    Trig = 0;
  139.    while(!Echo);        //如果沒(méi)有檢測(cè)到返回信號(hào),等
  140.    TR0 = 1;                //檢測(cè)到高電平,開(kāi)T0計(jì)數(shù),一直計(jì)到下降沿到來(lái)
  141.    Delay100ms();

  142.    Flag_Angle = 1;
  143.    PWM = 8; //右轉(zhuǎn)45度
  144.    TR1 = 1;
  145.    Delay1000ms();
  146.    TR1 = 0;

  147.    Trig = 1;                //觸發(fā)一次檢測(cè)
  148.    Delay20us();
  149.    Trig = 0;
  150.    while(!Echo);        //如果沒(méi)有檢測(cè)到返回信號(hào),等
  151.    TR0 = 1;                //檢測(cè)到高電平,開(kāi)T0計(jì)數(shù),一直計(jì)到下降沿到來(lái)
  152.    Delay100ms();

  153.    PWM = 12; //測(cè)完回到正中
  154.    TR1 = 1;
  155.    Delay1000ms();
  156.    TR1 = 0;
  157. }

  158. void Scan_Middle() //掃描正中前進(jìn)方向距離
  159. {
  160.   //Stop();
  161.   Flag_Angle = 3;
  162.   Trig = 1;                //觸發(fā)一次檢測(cè)
  163.   Delay20us();
  164.   Trig = 0;
  165.   while(!Echo);        //如果沒(méi)有檢測(cè)到返回信號(hào),等
  166.   TR0 = 1;                //檢測(cè)到高電平,開(kāi)T0計(jì)數(shù),一直計(jì)到下降沿到來(lái)
  167.   Delay100ms();
  168.   Distance_Middle = Compute(TH0,TL0);
  169.   TH0 = TL0 = 0x00;
  170.   //Go();
  171. }

  172. u8 Compute(u8 th,u8 tl)
  173. {
  174.    u16 times = 0x0000;
  175.    times = th;
  176.    times = times<<8;
  177.    times |= tl;

  178.    return (times/58);
  179. }
  180. void Delay20us()                //@12.000MHz  用于產(chǎn)生超聲波觸發(fā)信號(hào)
  181. {
  182.         unsigned char i;

  183.         _nop_();
  184.         i = 7;
  185.         while (--i);
  186. }

  187. void Delay100ms()                //@12.000MHz
  188. {
  189.         unsigned char i, j;

  190.         i = 195;
  191.         j = 138;
  192.         do
  193.         {
  194.                 while (--j);
  195.         } while (--i);
  196. }

  197. void Delay1000ms()                //@12.000MHz  用于等待
  198. {

  199.         unsigned char i, j, k;

  200.         _nop_();
  201.         i = 8;
  202.         j = 154;
  203.         k = 122;
  204.         do
  205.         {
  206.                 do
  207.                 {
  208.                         while (--k);
  209.                 } while (--j);
  210.         } while (--i);

  211. }
復(fù)制代碼


  1. /*
  2. * 作者:趙新
  3. * 功能:尋跡小車(chē)主函數(shù)
  4. * 日期:2015/3/10 進(jìn)行PWM的修改
  5. * 說(shuō)明:編譯器會(huì)有一些警告,主要是定義的一些函數(shù)在這里沒(méi)有用到,可以注釋掉或者寫(xiě)成條件編譯  2015/9/15
  6. */
  7. #include "reg51.h"
  8. #include "intrins.h"
  9. #include "Motor.h"
  10. #define LEFT  0  //左側(cè)觸到黑線(xiàn)
  11. #define RIGHT 1  //右側(cè)觸到黑線(xiàn)
  12. #define ALL   2         //同時(shí)觸到黑線(xiàn)
  13. #define NONE  3         //正常運(yùn)行沒(méi)有觸到黑線(xiàn)

  14. u8 i = 0;
  15. sbit Left = P0^4;
  16. sbit Right = P0^5;
  17. sbit PWM_LEFT  = P1^0;
  18. sbit PWM_RIGHT = P1^1;

  19. u8 JudgeMode();
  20. //void Delay100ms();
  21. void main()
  22. {
  23.   TMOD = 0x01;//定時(shí)器0,2工作在模式1 50ms時(shí)基
  24.   TH0 = 0xfc;
  25.   TL0 = 0x18;
  26.   ET0 = 1;
  27.   EA  = 1;
  28.   TR0 = 1;
  29.   Go();
  30.   while(1)
  31.   {
  32.      switch(JudgeMode())
  33.          {
  34.             case 0: {
  35.                        Turn_Left(0);
  36.                            //Delay100ms();
  37.                            }break;
  38.             case 1: {
  39.                          Turn_Right(0);
  40.                                  //Delay100ms();
  41.                                  }break;
  42.                 case 2: Stop();       break;
  43.                 case 3: Go();         break;
  44.          }
  45.   }
  46. }

  47. u8 JudgeMode()//用于判斷小車(chē)此時(shí)狀態(tài)
  48. {
  49.    if(Left==0&&Right==1)//左側(cè)觸到黑線(xiàn),應(yīng)向左轉(zhuǎn)
  50.      return LEFT;

  51.    if(Left==1&&Right==0)//右側(cè)觸到黑線(xiàn),應(yīng)向右轉(zhuǎn)
  52.      return RIGHT;

  53.    if(Left==0&Right==0)//同時(shí)觸到黑線(xiàn),應(yīng)進(jìn)一步判斷是‘T’型還是‘十’型路況
  54.      return ALL;

  55.    if(Left==1&&Right==1)//沒(méi)有觸到黑線(xiàn),可能正常運(yùn)行,可能小車(chē)跑偏了
  56.      return NONE;

  57. }






  58. void Time0(void) interrupt 1  //初定周期200ms,空占比50%
  59. {
  60.      
  61.      TH0 = 0xfc;
  62.      TL0 = 0x18;
  63.             ++i;
  64.          if(i>=2) //>=2 1/4空占比
  65.          {
  66.             PWM_LEFT  =         1;
  67. ……………………

  68. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
循跡避障小車(chē).rar (58.16 KB, 下載次數(shù): 121)
回復(fù)

使用道具 舉報(bào)

ID:416370 發(fā)表于 2018-10-27 23:06 | 顯示全部樓層
你好,能私發(fā)程序給我嗎,我沒(méi)黑幣下載不了,1115204179@qq.com            謝謝
回復(fù)

使用道具 舉報(bào)

ID:416370 發(fā)表于 2018-10-27 23:17 | 顯示全部樓層
樓主可以私發(fā)給我嗎,1115204179@qq.com  謝謝
回復(fù)

使用道具 舉報(bào)

ID:449181 發(fā)表于 2018-12-20 20:53 | 顯示全部樓層
可以私法嗎?1173459156@qq.com
回復(fù)

使用道具 舉報(bào)

ID:492360 發(fā)表于 2019-3-17 14:27 | 顯示全部樓層
非常不錯(cuò),感謝分享!
回復(fù)

使用道具 舉報(bào)

ID:945628 發(fā)表于 2021-6-29 09:12 | 顯示全部樓層
能用嗎正常使用嗎?
回復(fù)

使用道具 舉報(bào)

ID:974680 發(fā)表于 2021-11-12 00:08 來(lái)自手機(jī) | 顯示全部樓層
請(qǐng)問(wèn)可以正常使用嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产在线精品一区二区三区 | 久久国产亚洲 | 日本黄色免费视频 | 日韩美香港a一级毛片免费 国产综合av | 91成人免费看 | 一区二区三区精品 | 91 久久 | 日韩精品一区二区三区 | 夜夜摸天天操 | 91在线精品一区二区 | 久久高清| 日本网站免费在线观看 | 亚洲精品大片 | 国产午夜精品一区二区三区嫩草 | 日日干天天操 | 久久国产亚洲精品 | 国产精品五月天 | 在线观看国产www | 欧美理伦片在线播放 | 亚洲成人av一区二区 | 午夜精品久久久久久久久久久久 | 伊人导航| 成人黄色在线视频 | 精品日韩 | 精国产品一区二区三区四季综 | 天天拍天天插 | 国产精品区一区二 | 中文字幕丁香5月 | 成人欧美一区二区三区在线播放 | 亚洲一区二区三区四区五区午夜 | 精品99久久 | 成人欧美一区二区三区在线播放 | 成人av在线网站 | 自拍偷拍视频网 | 国产最新视频在线 | 久久久久亚洲精品 | 色婷婷亚洲一区二区三区 | 久久99这里只有精品 | 欧美日韩国产在线观看 | av在线播放网址 | 亚洲成人日韩 |