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

標題: 51單片機多功能智能小車(循跡、紅外避障、遙控綜合源程序)帶詳細注釋 [打印本頁]

作者: banyu    時間: 2018-5-4 08:28
標題: 51單片機多功能智能小車(循跡、紅外避障、遙控綜合源程序)帶詳細注釋
單片機源程序如下:
  1. /*****************ZY08-C智能循跡、遙控、避障、尋光機器人*****************
  2. //=====================================================================//
  3.                    ZY08-C循跡、紅外避障、遙控綜合程序演示                         //
  4. //  本程序主要將循跡程序、紅外避障程序、遙控器程序綜合在一起,通過主板按鍵切換
  5. ,藍色小主板是右邊按鍵S4切換,如果客戶買的是綠色大主板 ,那么就是主板左邊的按鍵S1
  6. 切換,數碼管顯示1,就是循跡模式,按一下按鍵數碼管顯示2,就是避障模式,按一下按鍵
  7. 數碼管顯示3,就是紅外遙控程序,周而復始切換模式。
  8. //---------------------------------------------------------------------//

  9. *  平臺:ZY08-C智能循跡、遙控、避障、尋光機器人 + Keil U4 + STC89C52
  10. *  程序名稱:5、ZY08-C循跡、紅外避障、遙控綜合程序
  11. *  公司:湖南智宇科教設備有限公司
  12. *  編寫:智宇公司研發一部
  13. *  交流:智能車QQ:1018973181
  14. *  晶振:11.0592MHZ
  15. *  售后技術說明:免費開源,不支持客戶自己修改程序分析與改正,可以提供我公司程序說明
  16. *  視頻教程:本小車配套學習C語言詳細視頻教程,資料統一網盤下載
  17. ******************************************************************/  

  18. #include <REGX52.H> //包含51單片機相關的頭文件
  19. #include <intrins.h>
  20. sbit LeftLed=P2^0;                        //定義前方左側指示燈端口
  21. sbit RightLed=P0^7;                       //定義前方右側指示燈端口
  22. sbit FontLled=P1^7;

  23. sbit LeftIR=P3^5;                         //定義前方左側紅外探頭端口
  24. sbit RightIR=P3^6;                        //定義前方右側紅外探頭端口
  25. sbit FontIR=P3^7;                         //定義前方正前方紅外探頭端口

  26. sbit M1A=P0^0;                            //定義左側電機驅動A端
  27. sbit M1B=P0^1;                            //定義左側電機驅動B端

  28. sbit M2A=P0^2;                            //定義右側電機驅動A端
  29. sbit M2B=P0^3;                            //定義右側電機驅動B端

  30. sbit B1=P0^4;                             //定義語音識識別傳感器端口
  31. sbit SB1=P0^6;                            //定義蜂鳴器端口
  32. sbit IRIN=P3^3;                                       //定義紅外接收端口

  33. unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定義數碼管顯示數據
  34.                                    0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
  35. unsigned char code  RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};
  36. unsigned char IRCOM[7];
  37. static unsigned int LedFlash;                         //定義閃動頻率計數變量
  38. bit EnableLight=0;                                    //定義指示燈使能位
  39. #define ShowPort P2                                   //定義數碼管顯示端口
  40. unsigned char temp = 1;
  41. void tingzhi()
  42. {
  43.    M1A=0;                                   //將M1電機A端初始化為0
  44.    M1B=0;                                   //將M1電機B端初始化為0
  45.    M2A=0;                                   //將M2電機A端初始化為0
  46.    M2B=0;

  47. }

  48. void qianjin()
  49. {
  50.    M1A=1;                                   
  51.    M1B=0;                                   
  52.    M2A=1;                                   
  53.    M2B=0;
  54. }

  55. void houtui()
  56. {
  57.    M1A=0;                                   
  58.    M1B=1;                                   
  59.    M2A=0;                                   
  60.    M2B=1;
  61. }

  62. void zuozhuan()
  63. {
  64.    M1A=0;                                   
  65.    M1B=1;                                   
  66.    M2A=1;                                   
  67.    M2B=0;
  68. }

  69. void youzhuan()
  70. {
  71.    M1A=1;                                   
  72.    M1B=0;                                   
  73.    M2A=0;                                   
  74.    M2B=1;
  75. }

  76. void Delay1ms(unsigned int i)
  77. {
  78. unsigned char j,k;
  79. do{
  80.   j = 10;
  81.   do{
  82.    k = 50;
  83.    do{
  84.     _nop_();
  85.    }while(--k);     
  86.   }while(--j);
  87. }while(--i);

  88. }

  89. void delay_nus(unsigned int i)  //延時:i>=12 ,i的最小延時單12 us
  90. {
  91.   i=i/10;
  92.   while(--i);
  93. }   
  94. void delay_nms(unsigned int n)  //延時n ms
  95. {
  96.   n=n+1;
  97.   while(--n)  
  98.   delay_nus(900);         //延時 1ms,同時進行補償
  99.   
  100. }  

  101. void delayms(unsigned char x)                         //0.14mS延時程序
  102. {
  103.   unsigned char i;                                    //定義臨時變量
  104.   while(x--)                                          //延時時間循環
  105.   {
  106.     for (i = 0; i<13; i++) {}                         //14mS延時
  107.   }
  108. }

  109. void Delay()                                          //定義延時子程序
  110. {
  111.   unsigned int DelayTime=30000;                       //定義延時時間變量
  112.   while(DelayTime--);                                 //開始進行延時循環
  113.   return;                                             //子程序返回
  114. }
  115. void ControlCar(unsigned char ConType)    //定義電機控制子程序
  116. {

  117.   tingzhi();
  118. switch(ConType)                          //判斷用戶設定電機形式
  119. {
  120.   case 1:  //前進                         //判斷用戶是否選擇形式1
  121.   {
  122.     //tingzhi();                                                      //進入前進之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  123.         //Delay1ms(50);
  124.         LeftLed = 0 ;
  125.         qianjin();
  126.     break;
  127.   }
  128.   case 2: //后退                          //判斷用戶是否選擇形式2
  129.   {
  130.    // tingzhi();                                                              //進入后退之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  131.    // Delay1ms(50);
  132.     LeftLed = 1 ;         
  133.         houtui();                                //M2電機反轉
  134.     break;
  135.   }
  136.   case 3: //左轉                          //判斷用戶是否選擇形式3
  137.   {
  138.      //tingzhi();                                                                  //進入左轉之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  139.         // Delay1ms(50);
  140.          zuozhuan();                               //M2電機正轉
  141.          break;
  142.   }
  143.   case 4: //右轉                          //判斷用戶是否選擇形式4
  144.   {
  145.    // tingzhi();                                                                  //進入右轉之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  146. //        Delay1ms(50);
  147.         youzhuan();                                //M1電機正轉
  148.                                           //M2電機反轉
  149.         break;
  150.   }
  151.   case 8: //停止                          //判斷用戶是否選擇形式8
  152.   {
  153.     tingzhi();
  154.         break;                                //退出當前選擇
  155.   }
  156. }
  157. }

  158. void ControlCar_yaokong(unsigned char ConType)    //定義電機控制子程序        (紅外遙控單獨設置一個 switch  case  語句  )
  159. {

  160.   tingzhi();
  161. switch(ConType)                          //判斷用戶設定電機形式
  162. {
  163.   case 1:  //前進                         //判斷用戶是否選擇形式1
  164.   {
  165.     tingzhi();                                                      //進入前進之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  166.         Delay1ms(150);
  167.         LeftLed = 0 ;
  168.         qianjin();
  169.     break;
  170.   }
  171.   case 2: //后退                          //判斷用戶是否選擇形式2
  172.   {
  173.     tingzhi();                                                              //進入后退之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  174.     Delay1ms(150);
  175.     LeftLed = 1 ;         
  176.         houtui();                                //M2電機反轉
  177.     break;
  178.   }
  179.   case 3: //左轉                          //判斷用戶是否選擇形式3
  180.   {
  181.      tingzhi();                                                                  //進入左轉之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  182.          Delay1ms(150);
  183.          zuozhuan();                               //M2電機正轉
  184.          break;
  185.   }
  186.   case 4: //右轉                          //判斷用戶是否選擇形式4
  187.   {
  188.      tingzhi();                                                                  //進入右轉之前 先停止一段時間  防止電機反向電壓沖擊主板 導致系統復位
  189.          Delay1ms(150);
  190.      youzhuan();                                //M1電機正轉  //M2電機反轉
  191.           break;
  192.   }
  193.   case 8: //停止                          //判斷用戶是否選擇形式8
  194.   {
  195.     tingzhi();
  196.         break;                                //退出當前選擇
  197.   }
  198. }
  199. }
  200. void Robot_Avoidance()                   //機器人避障子程序
  201. {

  202.    LeftLed=LeftIR;                        //前方左側指示燈指示出前方左側紅外探頭狀態
  203.    RightLed=RightIR;                      //前方右側指示燈指示出前方右側紅外探頭狀態
  204.    FontLled= FontIR;
  205.    SB1=FontIR;

  206.     if(FontIR == 0)                          //如果前面避障傳感器檢測到障礙物
  207.    {
  208.       ControlCar(8);                       //停止
  209.       delay_nms (300);                                           //停止300MS   防止電機反相電壓沖擊  導致系統復位
  210.           ControlCar(2);                                           //后退  
  211.           delay_nms (1000);                                           //后退1500MS  
  212.           ControlCar(3);                                           //
  213.           delay_nms (1800);        
  214.   }
  215.    else
  216.    {
  217.       ControlCar(1);                      //右側沒有信號時,開始向左轉一定的角度
  218.       delay_nms (10);
  219.    }
  220.     ControlCar(1);
  221. }
  222. //機器人循跡子程序
  223. void Robot_Traction()                     //機器人循跡子程序
  224. {
  225.    LeftLed=LeftIR;                        //前方左側指示燈指示出前方左側紅外探頭狀態
  226.    RightLed=RightIR;                      //前方右側指示燈指示出前方右側紅外探頭狀態
  227.    FontLled= FontIR;
  228.    SB1=LeftIR;
  229.    if(LeftIR == 0 && RightIR == 0)    //三個紅外檢測到黑線,就前進
  230.    {
  231.       ControlCar(1);                      //左側沒有信號時,開始向右轉一定的角度
  232.       delay_nms (10);
  233.    }
  234.    
  235.    else if(LeftIR == 0 && RightIR == 1)
  236.    {
  237.       ControlCar(3);                      //右側沒有信號時,開始向左轉一定的角度
  238.       delay_nms (10);
  239.    }

  240.    else if(LeftIR == 1 && RightIR == 0)
  241.    {
  242.       ControlCar(4);                      //右側沒有信號時,開始向左轉一定的角度
  243.       delay_nms (10);
  244.    }
  245.     ControlCar(8);
  246. }

  247. void main()                               //主程序入口
  248. {
  249.   
  250.   bit RunFlag=0;                          //定義小車運行標志位
  251.   LedFlash=3000;                                       //對閃燈數據進行初始化
  252.   //EX1=1;                                               //同意開啟外部中斷1
  253.   IT1=1;                                               //設定外部中斷1為低邊緣觸發類型
  254.   EA=1;                                                //總中斷開啟
  255.   ControlCar(8);                          //初始化小車運行狀態
  256.   while(1)                                //程序主循環
  257.   {
  258.              if(P3_2 == 0)
  259.           {
  260.            delay_nms(10);
  261.            if(P3_2 == 0)
  262.            {
  263.                      temp++;
  264.                   while(!P3_2);
  265.            }
  266.           }
  267.           if(temp > 3)
  268.           {
  269.           temp = 1;
  270.           }
  271.           switch(temp)
  272.           {
  273.                    case 1:        ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break;
  274.                 case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break;
  275.                 case 3: ShowPort = LedShowData[3];EX1 = 1;break;
  276.           }
  277.   }
  278. }
  279. //----------紅外遙控-------------------------------------------------------------
  280. void IR_IN() interrupt 2 using 0                      //定義INT2外部中斷函數
  281. {
  282.   unsigned char j,k,N=0;                              //定義臨時接收變量
  283.    
  284.   EX1 = 0;                                            //關閉外部中斷,防止再有信號到達   
  285.   delayms(15);                                        //延時時間,進行紅外消抖
  286.   if (IRIN==1)                                        //判斷紅外信號是否消失
  287.   {  
  288.      EX1 =1;                                          //外部中斷開
  289.          return;                                          //返回
  290.   }
  291.                            
  292.   while (!IRIN)                                       //等IR變為高電平,跳過9ms的前導低電平信號。
  293.   {
  294.       delayms(1);                                     //延時等待
  295.   }

  296.   for (j=0;j<4;j++)                                   //采集紅外遙控器數據
  297.   {
  298.     for (k=0;k<8;k++)                                 //分次采集8位數據
  299.     {
  300.        while (IRIN)                                   //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
  301.        {
  302.          delayms(1);                                  //延時等待
  303.        }
  304.       
  305.        while (!IRIN)                                  //等 IR 變為高電平
  306.        {
  307.          delayms(1);                                  //延時等待
  308.        }
  309.    
  310.        while (IRIN)                                   //計算IR高電平時長
  311.        {
  312.          delayms(1);                                  //延時等待
  313.          N++;                                         //計數器加加
  314.          if (N>=30)                                   //判斷計數器累加值
  315.              {
  316.            EX1=1;                                     //打開外部中斷功能
  317.                return;                                    //返回
  318.          }                  
  319.        }
  320.                                        
  321.       IRCOM[j]=IRCOM[j] >> 1;                         //進行數據位移操作并自動補零
  322.      
  323.       if (N>=8)                                       //判斷數據長度
  324.       {
  325.          IRCOM[j] = IRCOM[j] | 0x80;                  //數據最高位補1
  326.       }
  327.       N=0;                                            //清零位數計錄器
  328.     }
  329.   }
  330.    
  331.   if (IRCOM[2]!=~IRCOM[3])                            //判斷地址碼是否相同
  332.   {
  333.      EX1=1;                                           //打開外部中斷
  334.      return;                                          //返回
  335.   }

  336.   for(j=0;j<10;j++)                                   //循環進行鍵碼解析
  337.    {
  338.       if(IRCOM[2]==RecvData[j])                       //進行鍵位對應
  339.       {
  340.        // ControlCar(j);
  341.                 ControlCar_yaokong(j);                               //數碼管顯示相應數碼
  342.       }
  343.    }
  344.    EX1 = 1;                                           //外部中斷開
  345. }
  346. //-------------------------------------------------------------------------------------------------------
復制代碼




作者: 1329890441    時間: 2018-6-1 01:01
樓主代碼好多呀
作者: 張濤boy    時間: 2019-4-29 07:44
樓主厲害了

作者: 太陽黑子1    時間: 2021-2-13 17:45
樓主好棒!
作者: Lesliec    時間: 2021-6-9 23:00
樓主請問這么控制小車的速度呀




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 午夜免费网站 | 一区二区三区四区视频 | 成人国产免费视频 | 美国十次成人欧美色导视频 | 国产精品成人国产乱一区 | 91一区二区三区在线观看 | 国产精品视频久久 | 亚洲精品国产成人 | 午夜男人视频 | 精品久久久久久久久久 | 欧美国产视频 | 精品日韩在线 | 91免费版在线 | 久久午夜视频 | 中文字幕第一页在线 | 亚洲国产精品一区在线观看 | 婷婷色国产偷v国产偷v小说 | 亚洲激情专区 | 黄色电影在线免费观看 | 在线视频亚洲 | 四虎精品在线 | 国产高清91 | 99re6在线| 精品国产精品一区二区夜夜嗨 | 福利片在线观看 | 欧洲精品一区 | 成人视屏在线观看 | 精品国产1区2区3区 一区二区手机在线 | 91超碰caoporn97人人 | 国产乱码精品一区二区三区五月婷 | 成人欧美日韩一区二区三区 | 视频1区2区 | 亚洲精选一区二区 | 色爽女 | 一级毛片免费视频 | 国产高清在线观看 | 精品麻豆剧传媒av国产九九九 | 国产一级片一区二区三区 | 亚洲综合婷婷 | 黄色欧美大片 | 成人免费淫片aa视频免费 |