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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21359|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:321792 發(fā)表于 2018-5-4 08:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機(jī)源程序如下:
  1. /*****************ZY08-C智能循跡、遙控、避障、尋光機(jī)器人*****************
  2. //=====================================================================//
  3.                    ZY08-C循跡、紅外避障、遙控綜合程序演示                         //
  4. //  本程序主要將循跡程序、紅外避障程序、遙控器程序綜合在一起,通過主板按鍵切換
  5. ,藍(lán)色小主板是右邊按鍵S4切換,如果客戶買的是綠色大主板 ,那么就是主板左邊的按鍵S1
  6. 切換,數(shù)碼管顯示1,就是循跡模式,按一下按鍵數(shù)碼管顯示2,就是避障模式,按一下按鍵
  7. 數(shù)碼管顯示3,就是紅外遙控程序,周而復(fù)始切換模式。
  8. //---------------------------------------------------------------------//

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

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

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

  26. sbit M1A=P0^0;                            //定義左側(cè)電機(jī)驅(qū)動A端
  27. sbit M1B=P0^1;                            //定義左側(cè)電機(jī)驅(qū)動B端

  28. sbit M2A=P0^2;                            //定義右側(cè)電機(jī)驅(qū)動A端
  29. sbit M2B=P0^3;                            //定義右側(cè)電機(jī)驅(qū)動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,  //定義數(shù)碼管顯示數(shù)據(jù)
  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;                         //定義閃動頻率計數(shù)變量
  38. bit EnableLight=0;                                    //定義指示燈使能位
  39. #define ShowPort P2                                   //定義數(shù)碼管顯示端口
  40. unsigned char temp = 1;
  41. void tingzhi()
  42. {
  43.    M1A=0;                                   //將M1電機(jī)A端初始化為0
  44.    M1B=0;                                   //將M1電機(jī)B端初始化為0
  45.    M2A=0;                                   //將M2電機(jī)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,同時進(jìn)行補(bǔ)償
  99.   
  100. }  

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

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

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

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

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

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

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

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

  247. void main()                               //主程序入口
  248. {
  249.   
  250.   bit RunFlag=0;                          //定義小車運行標(biāo)志位
  251.   LedFlash=3000;                                       //對閃燈數(shù)據(jù)進(jìn)行初始化
  252.   //EX1=1;                                               //同意開啟外部中斷1
  253.   IT1=1;                                               //設(shè)定外部中斷1為低邊緣觸發(fā)類型
  254.   EA=1;                                                //總中斷開啟
  255.   ControlCar(8);                          //初始化小車運行狀態(tài)
  256.   while(1)                                //程序主循環(huán)
  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外部中斷函數(shù)
  281. {
  282.   unsigned char j,k,N=0;                              //定義臨時接收變量
  283.    
  284.   EX1 = 0;                                            //關(guān)閉外部中斷,防止再有信號到達(dá)   
  285.   delayms(15);                                        //延時時間,進(jìn)行紅外消抖
  286.   if (IRIN==1)                                        //判斷紅外信號是否消失
  287.   {  
  288.      EX1 =1;                                          //外部中斷開
  289.          return;                                          //返回
  290.   }
  291.                            
  292.   while (!IRIN)                                       //等IR變?yōu)楦唠娖剑^9ms的前導(dǎo)低電平信號。
  293.   {
  294.       delayms(1);                                     //延時等待
  295.   }

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

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



評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:341867 發(fā)表于 2018-6-1 01:01 來自手機(jī) | 只看該作者
樓主代碼好多呀
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线小视频 | 久久成人免费视频 | 蜜桃精品视频在线 | 久久久久亚洲国产| 天堂资源最新在线 | 亚洲自拍一区在线观看 | 日本 欧美 国产 | 在线看日韩av | 午夜a v电影 | heyzo在线| 精品免费国产一区二区三区四区介绍 | 亚洲欧美另类在线观看 | 亚洲精品久久久久久国产精华液 | 亚洲一区二区视频在线播放 | 国产三级 | 久久毛片 | 天天拍天天操 | 精品视频一区二区 | 国产情侣久久 | 国产激情视频网站 | 欧美成ee人免费视频 | 干干干日日日 | 91在线一区二区 | 中文视频在线 | 日韩欧美国产电影 | 一区二区三区影院 | 亚洲毛片 | 91av在线影院| 99精品视频在线观看 | av在线免费观看不卡 | av网站在线看 | 91精品久久久久久久99 | 欧美 日韩 中文 | 久久久久久网 | 久久中文字幕一区 | 免费一级片 | 天天操天天干天天透 | www.一区二区三区.com | 欧美成人h版在线观看 | 91精品国产91久久综合桃花 | 久久精品免费一区二区三 |