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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13090|回復: 7
打印 上一主題 下一主題
收起左側

舵機超聲波避障的單片機程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:147905 發(fā)表于 2017-11-15 23:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
舵機超聲波避障和警燈閃爍
用別人的程序改的自己加了一些別的功能(我也是邊學邊做的這輛車可能有的地方不對大家多指點
有需要的可以拿去用,肯定成功
單片機用的是 89c52
超聲波是rs04
電機驅動L298N
程序注釋的已經很詳細了!
  1. /******************************************************************************
  2. 2017.11.14修改
  3. 刪除額外數碼管功能
  4. 加入閃爍警燈程序
  5. ******************************************************************************/
  6.         #include <AT89x52.H>
  7.         #include <intrins.h>
  8.         #define led1 {P2_0=1,P2_1=0;}
  9.         #define led2 {P2_0=0,P2_1=1;}
  10.         
  11.         /**********如果io口不夠用可以去掉2^4~2^7口將298使能接口接高電平即可***********/
  12.         #define Right_moto_go     {P0_0=1,P0_1=0,P0_2=1,P0_3=0,P2_7=1,P2_6=1,P2_5=1,P2_4=1;}        //右邊電機向前走
  13.         #define Right_moto_back   {P0_0=0,P0_1=1,P0_2=0,P0_3=1,P2_7=1,P2_6=1,P2_5=1,P2_4=1;}        //右邊電機向后走
  14.         #define Right_moto_Stop   {P0_0=1,P0_1=1,P0_2=1,P0_3=1,P2_7=1,P2_6=1,P2_5=1,P2_4=1;}        //右邊電機停轉   

  15.         #define Left_moto_go      {P0_4=0,P0_5=1,P0_6=0,P0_7=1,P2_7=1,P2_6=1,P2_5=1,P2_4=1;}  //左邊電機向前走
  16.         #define Left_moto_back    {P0_4=1,P0_5=0,P0_6=1,P0_7=0,P2_7=1,P2_6=1,P2_5=1,P2_4=1;}         //左邊電機向后轉
  17.         #define Left_moto_Stop    {P0_4=1,P0_5=1,P0_6=1,P0_7=1,P2_7=1,P2_6=1,P2_5=1,P2_4=1;}  //左邊電機停轉                     
  18.         /*****************************************************************************/
  19.         
  20.         #define Sevro_moto_pwm  P1_2      //接舵機信號端輸入PWM信號調節(jié)速度
  21.         #define  ECHO  P1_1                                        //超聲波接口定義
  22.         #define  TRIG  P1_0                                        //超聲波接口定義
  23.         
  24.         
  25.   unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
  26.         unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
  27.         unsigned char disbuff[4]={ 0,0,0,0,};
  28.   unsigned char posit=0;

  29.   unsigned char pwm_val_left  = 0;//變量定義
  30.         unsigned char push_val_left =14;//舵機歸中,產生約,1.5MS 信號
  31.   unsigned long S=0;
  32.         unsigned long S1=0;
  33.         unsigned long S2=0;
  34.         unsigned long S3=0;
  35.         unsigned long S4=0;
  36.         unsigned int  time=0;                    //時間變量
  37.         unsigned int  timer=0;                        //延時基準變量
  38.         unsigned char timer1=0;                        //掃描時間變量                                       
  39.    
  40. /************************************************************************/        
  41. //延時函數        
  42.    void delay(unsigned int k)
  43.                         {                                
  44.                                  unsigned int x,y;
  45.                                  for(x=0;x<k;x++)
  46.                                  for(y=0;y<2000;y++);
  47.                         }
  48. /************************************************************************/        
  49. //前速前進
  50.     void  run(void)
  51. {
  52.    
  53.          Left_moto_go;    //左電機往前走
  54.          Right_moto_go ;  //右電機往前走
  55. }

  56. //前速后退
  57.     void  backrun(void)
  58. {
  59.    
  60.          Left_moto_back ;   //左電機往前走
  61.          Right_moto_back ;  //右電機往前走
  62. }

  63. //左轉
  64.     void  leftrun(void)
  65. {
  66.    
  67.          Right_moto_go ;  //右電機往前走 ;
  68.          Left_moto_Stop ;   //左電機停止
  69. }

  70. //右轉
  71.     void  rightrun(void)
  72. {
  73.    
  74.          Left_moto_go ;   //左電機往前走
  75.          Right_moto_Stop ;  //右電機停止
  76. }
  77. //停
  78.     void  stoprun(void)
  79. {
  80.    
  81.          Left_moto_Stop ;   //左電機往前走
  82.          Right_moto_Stop ;  //右電機往前走
  83. }


  84. //****************************去除額外功能********************************/
  85. //  void Display(void)                                  //掃描數碼管
  86. //        {
  87. //         if(posit==0)
  88. //         {P3=(discode[disbuff[posit]])&0x7f;}//產生點
  89. //         else
  90. //         {P3=discode[disbuff[posit]];}
  91. //          if(posit==0)
  92. //         { P1_3=0;P1_4=1;P1_5=1;}
  93. //          if(posit==1)
  94. //          {P1_3=1;P1_4=0;P1_5=1;}
  95. //          if(posit==2)
  96. //          {P1_3=1;P1_4=1;P1_5=0;}
  97. //          if(++posit>=3)
  98. //          posit=0;
  99. //        }
  100. //************************************************************************/


  101. void  StartModule()                       //啟動測距信號
  102.    {
  103.           TRIG=1;                                       
  104.           _nop_();
  105.           _nop_();
  106.           _nop_();
  107.           _nop_();
  108.           _nop_();
  109.           _nop_();
  110.           _nop_();
  111.           _nop_();
  112.           _nop_();
  113.           _nop_();
  114.           _nop_();
  115.           _nop_();
  116.           _nop_();
  117.           _nop_();
  118.           _nop_();
  119.           _nop_();
  120.           _nop_();
  121.           _nop_();
  122.           _nop_();
  123.           _nop_();
  124.           _nop_();
  125.           TRIG=0;
  126.    }
  127. /***************************************************/
  128. void Conut(void)                   //計算距離
  129.         {
  130.           while(!ECHO);                       //當RX為零時等待
  131.           TR0=1;                               //開啟計數
  132.           while(ECHO);                           //當RX為1計數并等待
  133.           TR0=0;                                   //關閉計數
  134.           time=TH0*256+TL0;                   //讀取脈寬長度
  135.           TH0=0;
  136.           TL0=0;
  137.           S=(time*1.7)/100;        //算出來是CM
  138.           disbuff[0]=S%1000/100;   //更新顯示
  139.           disbuff[1]=S%1000%100/10;
  140.           disbuff[2]=S%1000%10 %10;
  141.         }
  142. /************************************************************************/
  143. void  COMM( void )                       
  144.   {
  145.                
  146.                  
  147.                   push_val_left=5;          //舵機向左轉90度
  148.                   timer=0;
  149.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  150.                   StartModule();          //啟動超聲波測距
  151.           Conut();                           //計算距離
  152.                   S2=S;  
  153.   
  154.                   push_val_left=23;          //舵機向右轉90度
  155.                   timer=0;
  156.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  157.                   StartModule();          //啟動超聲波測距
  158.           Conut();                          //計算距離
  159.                   S4=S;         
  160.         

  161.                   push_val_left=14;          //舵機歸中
  162.                   timer=0;
  163.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  164.                   StartModule();          //啟動超聲波測距
  165.           Conut();                          //計算距離
  166.                   S1=S;         

  167.           if((S2<20)||(S4<20)) //只要左右各有距離小于,20CM小車后退
  168.                   {
  169.                   backrun();                   //后退
  170.                   timer=0;
  171.                   while(timer<=4000);
  172.                   }
  173.                   
  174.                   if(S2>S4)                 
  175.                      {
  176.                                     rightrun();          //車的左邊比車的右邊距離小        右轉        
  177.                         timer=0;
  178.                         while(timer<=3500);//原4000
  179.                      }                                      
  180.                        else
  181.                      {
  182.                        leftrun();                //車的左邊比車的右邊距離大        左轉
  183.                        timer=0;
  184.                        while(timer<=3500);//原4000
  185.                      }
  186.                                              

  187. }
  188. /*調節(jié)push_val_left的值改變電機轉速,占空比            */
  189.                 void pwm_Servomoto(void)
  190. {  

  191.   if(pwm_val_left<=push_val_left)
  192.                Sevro_moto_pwm=1;
  193.         else
  194.                Sevro_moto_pwm=0;
  195.         if(pwm_val_left>=200)
  196.         pwm_val_left=0;
  197. }
  198. /***************************************************/
  199. ///*TIMER1中斷服務子函數產生PWM信號*/
  200.          void time1()interrupt 3   using 2
  201. {        
  202.    TH1=(65536-100)/256;          //100US定時
  203.          TL1=(65536-100)%256;
  204.          timer++;                                  //定時器100US為準。在這個基礎上延時
  205.          pwm_val_left++;
  206.          pwm_Servomoto();
  207. //         timer1++;                                 //2MS掃一次數碼管
  208. //         if(timer1>=20)
  209. //         {
  210. //         timer1=0;
  211. //         Display();        
  212. //         }
  213. }
  214. /************************************************************************/

  215. /*****************************閃爍燈中斷延時函數****************************/
  216. void delay1()
  217. {
  218.         unsigned char i,j,k;
  219.         for(i=1;i>0;i--)
  220.         for(j=100;j>0;j--)
  221.         for(k=250;k>0;k--);
  222. }
  223. void shansuo()
  224.          {
  225.                  led1;
  226.                  delay1();
  227.                  led2;
  228.                  delay1();                 
  229.          }
  230. /***********************************************************************/
  231. /*********************************************************************/                 
  232. /*--主函數--*/
  233.         void main(void)
  234. {
  235.   stoprun();
  236.         TMOD=0X11;
  237.         TH1=(65536-100)/256;          //100US定時
  238.         TL1=(65536-100)%256;
  239.         TH0=0;
  240.         TL0=0;  
  241.         TR1= 1;
  242.         ET1= 1;
  243.         ET0= 1;
  244.         EA = 1;

  245.         delay(100);
  246.   push_val_left=14;          //舵機歸中


  247.         while(1)                       /*無限循環(huán)*/
  248.         {
  249.          shansuo();        //閃爍燈函數
  250.          if(timer>=200)          //100MS檢測啟動檢測一次 原來500
  251.            {
  252.              timer=0;
  253.                    StartModule(); //啟動檢測
  254.        Conut();                  //計算距離
  255.        if(S<35)                  //距離小于20CM
  256.                    {
  257.                     stoprun();          //小車停止
  258.                     COMM();                                  //方向函數
  259.                    }
  260.                    else
  261.                    if(S>40)                  //距離大于,35CM往前走
  262.                    run();
  263.            }
  264.         }
  265. }
復制代碼
全部資料51hei下載地址:
避障加警燈完.rar (38.36 KB, 下載次數: 200)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:262587 發(fā)表于 2017-12-17 10:55 | 只看該作者
很不錯,正需要,感謝樓主
回復

使用道具 舉報

板凳
ID:292103 發(fā)表于 2018-5-8 19:03 來自手機 | 只看該作者
好!寫的不錯
回復

使用道具 舉報

地板
ID:297685 發(fā)表于 2018-5-9 08:41 | 只看該作者
有照片嗎?
回復

使用道具 舉報

5#
ID:292103 發(fā)表于 2018-5-19 10:29 | 只看該作者
為什么不能解壓呢?
回復

使用道具 舉報

6#
ID:382500 發(fā)表于 2018-8-9 23:27 | 只看該作者
電機怎么接線
回復

使用道具 舉報

7#
ID:879227 發(fā)表于 2021-6-18 16:49 | 只看該作者
感謝樓主的分析,學到了不少知識,現在去進行測試。
回復

使用道具 舉報

8#
ID:969453 發(fā)表于 2022-2-28 18:02 | 只看該作者
就想單純的想小車避障,把數碼管相關的刪掉就行了吧,博主大佬
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品黄视频 | 国产综合视频 | 亚洲 欧美 日韩 在线 | 久久久91精品国产一区二区三区 | 亚洲欧美一区二区三区国产精品 | 国产在线一区二区三区 | 天堂视频中文在线 | av黄色在线| 欧美午夜视频 | 国产91观看| 久久国产精品-国产精品 | 成人性视频在线 | 日日碰狠狠躁久久躁96avv | 国产婷婷精品 | 亚洲综合在线一区 | 亚洲精品在线视频 | 最新黄色在线观看 | 久久久精彩视频 | 欧美日韩在线观看视频 | 国产精品jizz在线观看老狼 | 精品日韩 | 一级片在线免费播放 | 一级做a爰片久久毛片免费看 | 免费在线成人 | av网站免费 | 亚洲精品大全 | 欧美精品中文字幕久久二区 | av一级毛片| 国产一区欧美 | 亚洲视频免费在线 | 国产欧美日韩综合精品一区二区 | h视频在线看 | 欧美中文在线 | 中文字幕11页 | 国产精品爱久久久久久久 | 日韩www| 国产性色视频 | 亚洲美女网站 | 91久久看片| 久久久福利 | 欧美日韩一卡二卡 |