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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機多功能智能小車(循跡、紅外避障、遙控綜合源程序)帶詳細注釋

  [復制鏈接]
跳轉到指定樓層
樓主
ID:321792 發表于 2018-5-4 08:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  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. //-------------------------------------------------------------------------------------------------------
復制代碼



評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:341867 發表于 2018-6-1 01:01 來自觸屏版 | 只看該作者
樓主代碼好多呀
回復

使用道具 舉報

板凳
ID:431514 發表于 2019-4-29 07:44 | 只看該作者
樓主厲害了
回復

使用道具 舉報

地板
ID:305511 發表于 2021-2-13 17:45 | 只看該作者
樓主好棒!
回復

使用道具 舉報

5#
ID:927901 發表于 2021-6-9 23:00 | 只看該作者
樓主請問這么控制小車的速度呀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产区视频在线观看 | 亚洲v区 | 亚洲成人av在线播放 | 国产伦精品一区二区三区四区视频 | 亚洲国产精选 | 五月天婷婷久久 | 一区二区视频 | 久久蜜桃资源一区二区老牛 | 久草视频观看 | 国产在线一区二区三区 | 视频在线一区 | 最新免费黄色网址 | 九九精品久久久 | 日韩在线中文字幕 | 国产精品毛片av一区 | 久久国产区 | 国产一区 日韩 | 国产视频一区在线 | jlzzxxxx18hd护士| 中文字字幕一区二区三区四区五区 | 亚洲精品福利视频 | 国产精品区一区二区三 | 日韩中文字幕2019 | 黄色在线免费网站 | 婷婷激情在线 | 欧美一a| 日本不卡免费新一二三区 | 欧美性猛交一区二区三区精品 | a网站在线观看 | 精品国产第一区二区三区 | 国产精品日韩一区二区 | av一区在线 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美另类视频在线 | 91大片| 性色在线 | 五月婷六月丁香 | 久热爱| 日韩欧美亚洲一区 | 日本综合在线观看 | 91精品麻豆日日躁夜夜躁 |