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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機循跡、避障、遙控綜合小車程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:560735 發表于 2019-6-24 10:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
智能小車可以完成循跡避障等功能

單片機源程序如下:
  1.     #include<AT89x51.H>
  2.     #include<intrins.h>
  3.         #include<HJ-4WD_PWM.H>                  //定義函數
  4.     #define Left_1_led        P3_7         //左循跡   
  5.        
  6.     #define Right_1_led       P3_6         //右循跡
  7.        
  8.     #define LeftIRBZ          P3_5         //左避障          
  9.        
  10.         #define RightIRBZ         P3_4         //右避障

  11.         //#define Left_led                  p2_2   //左光傳感器
  12.        
  13.         //#define Right_led         p2_4         //右光傳感器   

  14. sbit SB1=P2^3;                            //定義蜂鳴器
  15. sbit IRIN=P3^3;                                       //定義紅外接收端口

  16. unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定義數碼管顯示數據
  17.                                    0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
  18. unsigned char code  RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};
  19. unsigned char IRCOM[7];

  20. #define ShowPort P0                                   //定義數碼管顯示端口
  21. unsigned char temp = 1;

  22. void Delay1ms(unsigned int i)
  23. {
  24. unsigned char j,k;
  25. do{
  26.   j = 10;
  27.   do{
  28.    k = 50;
  29.    do{
  30.     _nop_();
  31.    }while(--k);     
  32.   }while(--j);
  33. }while(--i);
  34. }

  35. void delay_nus(unsigned int i)  //延時:i>=12 ,i的最小延時單12 us
  36. {
  37.   i=i/10;
  38.   while(--i);
  39. }   
  40. void delay_nms(unsigned int n)  //延時n ms
  41. {
  42.   n=n+1;
  43.   while(--n)  
  44.   delay_nus(900);         //延時 1ms
  45.   
  46. }  

  47. void delayms(unsigned char x)                         //0.14mS延時
  48. {
  49.   unsigned char i;                                 
  50.   while(x--)                                          
  51.   {
  52.     for (i = 0; i<13; i++) {}                         //14mS延時
  53.   }
  54. }

  55. void Delay()                                          //定義延時子程序
  56. {
  57.   unsigned int DelayTime=30000;                     
  58.   while(DelayTime--);                                 //開始進行延時循環
  59.   return;                                            
  60. }

  61. void ControlCar_yaokong(unsigned char ConType)    //定義電機控制子程序       
  62. {

  63.   stop();
  64. switch(ConType)                          //判斷設定電機形式
  65. {
  66.   case 1:  //前進                         //判斷是否選擇形式1
  67.   {
  68.     stop();                                                     
  69.         Delay1ms(150);
  70. //        LeftLed = 0 ;
  71.         run();
  72.     break;
  73.   }
  74.   case 2: //后退                          //判斷是否選擇形式2
  75.   {
  76.     stop();                                                                     
  77.     Delay1ms(150);
  78.   //  LeftLed = 1 ;          
  79.         back();                                 //M2電機反轉
  80.     break;
  81.   }
  82.   case 3: //右轉                          //判斷是否選擇形式3
  83.   {
  84.      stop();                                                                  
  85.          Delay1ms(150);
  86.          rightrun();                                //M2電機正轉
  87.          break;
  88.   }
  89.   case 4: //左轉                          //判斷是否選擇形式4
  90.   {
  91.      stop();                                                                  
  92.          Delay1ms(150);
  93.      leftrun();                                  //M1電機正轉  M2電機反轉
  94.          break;
  95.   }
  96.   case 8: //停止                          //判斷是否選擇形式8
  97.   {
  98.     stop();
  99.         break;                                //退出當前選擇
  100.   }
  101. }
  102. }
  103. void Robot_Avoidance()                   //避障子程序
  104. {
  105.             
  106.               if(LeftIRBZ==1&&RightIRBZ ==1)          //LeftIRBZ RightIRBZ

  107.                     {         
  108.                       run();
  109.               delay_nms (10);
  110.                            SB1=1;
  111.                           }
  112.                           else
  113.                          {                          
  114.                                       if(LeftIRBZ==1&&RightIRBZ ==0)            //右邊檢測到紅外信號
  115.                                   {
  116.                                           rightrun();                          
  117.                      delay_nms (300);                                          

  118.                              }
  119.                           
  120.                                            if(RightIRBZ ==1&&LeftIRBZ==0)               
  121.                                   {          
  122.                                      
  123.                                           leftrun();                     
  124.                      delay_nms (300);                                          

  125.                                   }
  126.                                   if(RightIRBZ==0&&LeftIRBZ==0)                //兩邊傳感器同時檢測到紅外
  127.                                   {          
  128.                                      SB1=0;
  129.                                          stop();                     //停止
  130.                      delay_nms (300);                       
  131.                                          back();                         //調用電機后退函數
  132.                                          delay_nms (300);                //后退50毫秒
  133.                                          rightrun();                     //調用電機右轉函數
  134.                                         delay_nms (400);
  135.                                   }
  136.                         }
  137.        
  138.                         run();
  139.                   
  140. }

  141. void Robot_Traction()                     //循跡子程序
  142. {
  143.   
  144.    //SB1=1;
  145.    if(Left_1_led  == 0 && Right_1_led == 0)    //三個紅外檢測到黑線,就前進         Left_1_led           Right_1_led
  146.    {
  147.       run();                     //左側沒有信號時,開始向右轉一定的角度
  148.       delay_nms (10);
  149.           SB1=0;
  150.    }
  151.    
  152.    else if(Left_1_led  == 0 && Right_1_led == 1)
  153.    {
  154.       rightrun();                       //右側檢測到黑線,開始向右轉一定的角度
  155.       delay_nms (10);
  156.    }

  157.    else if(Left_1_led  == 1 &&  Right_1_led == 0)
  158.    {
  159.       leftrun();                         //左側檢測到黑線,開始向左轉一定的角度
  160.           
  161.       delay_nms (10);
  162.    }
  163.    else if(Left_1_led  == 1 &&  Right_1_led == 1)
  164.    {
  165.       SB1=1;
  166.           stop();                         //左側檢測到黑線,開始向左轉一定的角度
  167.           
  168.       delay_nms (10);
  169.    }
  170.      
  171. }

  172. //----------紅外遙控-------------------------------------------------------------
  173. void IR_IN() interrupt 2 using 0                      //定義INT2外部中斷函數
  174. {
  175.   unsigned char j,k,N=0;                              //定義臨時接收變量
  176.   
  177.   EX1 = 0;                                            //關閉外部中斷,防止再有信號到達   
  178.   delayms(15);                                        //延時時間,進行紅外消抖
  179.   if (IRIN==1)                                        //判斷紅外信號是否消失
  180.   {  
  181.      EX1 =1;                                          //外部中斷開
  182.          return;                                          //返回
  183.   }
  184.                            
  185.   while (!IRIN)                                       //等IR變為高電平,跳過9ms的前導低電平信號。
  186.   {
  187.       delayms(1);                                     //延時等待
  188.   }

  189.   for (j=0;j<4;j++)                                   //采集紅外遙控器數據
  190.   {
  191.     for (k=0;k<8;k++)                                 //分次采集8位數據
  192.     {
  193.        while (IRIN)                                   //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
  194.        {
  195.          delayms(1);                                  //延時等待
  196.        }
  197.       
  198.        while (!IRIN)                                  //等 IR 變為高電平
  199.        {
  200.          delayms(1);                                  //延時等待
  201.        }
  202.    
  203.        while (IRIN)                                   //計算IR高電平時長
  204.        {
  205.          delayms(1);                                  //延時等待
  206.          N++;                                         //計數器加加
  207.          if (N>=30)                                   //判斷計數器累加值
  208.              {
  209.            EX1=1;                                     //打開外部中斷功能
  210.                return;                                    //返回
  211.          }                  
  212.        }
  213.                                        
  214.       IRCOM[j]=IRCOM[j] >> 1;                         //進行數據位移操作并自動補零
  215.      
  216.       if (N>=8)                                       //判斷數據長度
  217.       {
  218.          IRCOM[j] = IRCOM[j] | 0x80;                  //數據最高位補1
  219.       }
  220.       N=0;                                            //清零位數計錄器
  221.     }
  222.   }
  223.    
  224.   if (IRCOM[2]!=~IRCOM[3])                            //判斷地址碼是否相同
  225.   {
  226.      EX1=1;                                           //打開外部中斷
  227.      return;                                          //返回
  228.   }

  229.   for(j=0;j<10;j++)                                   //循環進行鍵碼解析
  230.    {
  231.       if(IRCOM[2]==RecvData[j])                       //進行鍵位對應
  232.       {
  233.        // ControlCar(j);
  234.                 ControlCar_yaokong(j);                               //數碼管顯示相應數碼
  235.       }
  236.    }
  237.    EX1 = 1;                                           //外部中斷開
  238. }
  239. //----------尋光子程序-------------------------------------------------------------
  240. void Robot_Lightseek()
  241. {       

  242.         //unsigned char i;
  243.     P1=0X00; //關電車電機       

  244.                          /*TMOD=0X01;
  245.                 TH0= 0XFc;                  //1ms定時
  246.                  TL0= 0X18;
  247.                    TR0= 1;
  248.                 ET0= 1;
  249.                 EA = 1;        */             //開總中斷
  250.         while(1)        //無限循環
  251.         {
  252.          
  253.                          //有信號為0  沒有信號為1

  254.               if(Left_led==0&&Right_led==0)

  255.                           run();         //調用前進函數

  256.                           else
  257.                          {                          
  258.                                       if(Left_led==1&&Right_led==0)            //右邊檢測到紅外信號
  259.                                   {
  260.                                            rightrun();         //調用小車右轉函數
  261.                                           delay(40);

  262.                              }
  263.                           
  264.                                            if(Right_led==1&&Left_led==0)                //左邊檢測到紅外信號
  265.                                   {          
  266.                                      
  267.                                           leftrun();          //調用小車左轉函數
  268.                                           delay(40);

  269.                                   }
  270.                                                                   if(Right_led==1&&Left_led==1)                //兩邊傳感器沒有檢測到光
  271.                                   {          
  272.                                     stop();                    //調用電機停止函數
  273.                                         delay(40);
  274.                                   }
  275.                         }         
  276.          }
  277. }

  278. //------------------------------超聲波避障、測距---------------------------------------------------------



  279. //-------------------------------------------------------------------------------------------------------
  280. void main()                               //主程序入口
  281. {
  282.   TMOD=0X01;
  283.   TH0= 0XFc;                  //1ms定時
  284.   TL0= 0X18;
  285.   TR0= 1;
  286.   ET0= 1;
  287.   EA = 1;                           //開總中斷
  288.   //EX1=1;                                               //同意開啟外部中斷1
  289.   IT1=1;   
  290.                                               //設定外部中斷1為低邊緣觸發類型
  291.   while(1)                                //程序主循環
  292.   {
  293.            if(P3_2 == 0)
  294.            {
  295.                    if(temp<=4)
  296.                 {
  297.                      temp=temp+1;
  298.                   while(!P3_2);
  299.                 }
  300.            }                  
  301.        
  302.             if(temp>4)
  303.             {
  304.                      temp=1;
  305.                 }
  306.           switch(temp)
  307.           {
  308.                    case 1:        ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break;
  309.                 case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break;
  310.                 case 3: ShowPort = LedShowData[3];SB1 = 1; EX1 = 1;break;
  311.                 case 4:        ShowPort = LedShowData[4];Robot_Lightseek();EX1 = 0;break;

  312.           }
  313.   }
  314. }
復制代碼

所有資料51hei提供下載:
循跡、避障、遙控綜合.zip (49.75 KB, 下載次數: 11)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美天堂 | 国产成人久久av免费高清密臂 | 色站综合 | 久久国产精品-国产精品 | 91久久久精品国产一区二区蜜臀 | 欧美成人一区二区三区 | 国产精品一区二区三区久久久 | 亚洲一区二区三区在线 | 精品一区二区三区入口 | 亚洲啪啪 | 欧美日韩综合一区 | 麻豆精品国产91久久久久久 | 欧美一级特黄aaa大片在线观看 | 久久久九九九九 | 日韩黄| 久久久国产一区二区三区 | 成人精品一区二区三区四区 | 日韩视频在线播放 | 国产激情视频在线观看 | 日韩一区二区免费视频 | 国产精品精品久久久 | 国产精品久久久久久久毛片 | 九九伦理电影 | 日本午夜精品 | 国产精品永久久久久久久www | 亚洲不卡视频 | 午夜欧美| 国产精品色 | 91精品国产91 | 亚洲 欧美 激情 另类 校园 | 国产成人精品一区二区在线 | 少妇一区在线观看 | 日日欧美 | 最新国产精品 | 中文字幕在线一区二区三区 | 91福利网址 | 成人在线视频免费观看 | 国产福利一区二区 | 久久大陆 | 久久久成人网 | 国产精品久久久久久久免费大片 |