標(biāo)題: 滅火小車傳感器接法與單片機(jī)源程序 [打印本頁]

作者: fmy11256    時(shí)間: 2017-12-8 02:02
標(biāo)題: 滅火小車傳感器接法與單片機(jī)源程序
傳感器接法
     紅外傳感器接法
       前紅外: 數(shù)字9
       左紅外: 數(shù)字15
       左45度角紅外: 數(shù)字10
       右45度角紅外: 數(shù)字8
       右紅外: 數(shù)字14
     火焰?zhèn)鞲衅鹘臃?br />        左火焰: 模擬3
       中火焰: 模擬5
       右火焰: 模擬4
     (底部)灰度傳感器:  模擬2
     聲控傳感器:  模擬6

     程序說明

  1.      #define p 120    //定義火焰?zhèn)鞲衅鳈z測到火焰的返回值
  2.      int k,j,i=0,n,b=1,c=1;   //程序控制變量,不必更改
  3.      int m=i;
  4.      int pro,end=1;

  5.      void main()    //主程序
  6.      {
  7.          while(analog(6)>100)   //聲控啟動(dòng)
  8.            {
  9.          }

  10.          while(!(analog(2)>100))  //走出白色超始區(qū)
  11.            {
  12.              motor(0,80);  
  13.              motor(1,80);
  14.          }

  15.          pro=start_process(test());  //啟動(dòng)地面標(biāo)志線檢測進(jìn)程

  16.          while(1)    //滅火與迷宮程序切換
  17.            {
  18.              if (analog(3)               {
  19.                  fire();
  20.              }
  21.              else        //沒有發(fā)現(xiàn)火焰,進(jìn)入迷宮子程序
  22.                {
  23.                  migong();
  24.              }
  25.          }
  26.      }

  27.      void migong()    //迷宮子程序
  28.      {   
  29.          if(digital(8)==0 II digital(9)==0)     //如果前方 或 右45度角紅外檢測到障礙物,左轉(zhuǎn)
  30.            {
  31.              motor(0,-70);       //根據(jù)情況,調(diào)節(jié)功率參數(shù),以下雷同
  32.              motor(1,70);
  33.          }
  34.          else if(digital(14)==0 && digital(9)==1 && digital(8)==1)  //如果只右方有障礙物,直行
  35.              {
  36.                motor(0,100);
  37.                motor(1,100);
  38.            }
  39.            else        //如果沒有障礙物,右轉(zhuǎn)
  40.              {               
  41.                motor(0,100);
  42.                motor(1,-100);

  43.                motor(1,10);
  44.                motor(0,90);
  45.            }
  46.          if((i>2)&&(i>m))       //如果標(biāo)志線數(shù)大于2且標(biāo)志線有變化(針對1、2、3號房間)
  47.            {
  48.              stop();
  49.              while(analog(3)>150 && analog(5)>150 && analog(4)>150)   //如果沒有檢測到火焰
  50.                {
  51.                  motor(0,70);       //右轉(zhuǎn)
  52.                  motor(1,-70);
  53.                  if(digital(14)==0)       //右紅外檢測到障礙物,停止轉(zhuǎn)動(dòng)
  54.                    break;
  55.              }
  56.              m=i+1;         //更改標(biāo)志線的對比變量
  57.          }
  58.          if(i==1 && b && (analog(3)>150 && analog(5)>150 && analog(4)>150)) //4號房間,檢測到第1條標(biāo)志線,且沒有火焰
  59.            {
  60.              while(digital(9)==0 II digital(8)==0 II digital(14)==0)   //任意右手紅外傳感器有障礙物,右轉(zhuǎn)
  61.                {            
  62.                  motor(0,70);
  63.                  motor(1,-70);
  64.              }
  65.              while(digital(9)==1)       //前方傳感器沒有障礙物,右前進(jìn)
  66.                {
  67.                  motor(0,100);
  68.                  motor(1,70);
  69.              }
  70.              b=0;         //控制變量
  71.          }   
  72.      }

  73.      void fire()    //滅火子程序
  74.      {
  75.          if((i>4 II i<8) && c)      //如果在2號房間
  76.            {
  77.              while(analog(3)               {
  78.                  motor(0,-60);
  79.                  motor(1,60);
  80.              }
  81.              motor(0,60);        //強(qiáng)制直行一段
  82.              motor(1,60);       //主要是解決2號房間右手法則滅火時(shí)的碰墻的情況
  83.              sleep(0.6);
  84.              c=0;
  85.          }
  86.          while(analog(5)<10 && analog(2)<60)     //如果火焰距離合適 且 檢測到地面標(biāo)志線,滅火
  87.            {
  88.              motor(0,-10);       //后退一段
  89.              motor(1,-10);
  90.              sleep(0.15);
  91.              stop();
  92.              motor(2,100);       //滅火
  93.              sleep(2.000);
  94.              stop();
  95.              motor(0,-70);       //滅完火,后退一段
  96.              motor(1,-100);
  97.              sleep(0.2);

  98.              kill_process(pro);      //關(guān)掉地面標(biāo)志線檢測進(jìn)程
  99.              select();       //進(jìn)入回家子程序選擇子程序
  100.          }
  101.          while(analog(3)-analog(4)> 3)     //向右調(diào)整,如果調(diào)整較頻繁,修改最后的3
  102.            {
  103.              motor(0,50);
  104.              motor(1,-50);
  105.          }
  106.          while(analog(4)-analog(3)> 3)     //向左調(diào)整,同上
  107.            {
  108.              motor(0,-50);
  109.              motor(1,50);
  110.          }
  111.          motor(0,40);       //直行
  112.          motor(1,40);
  113.      }

  114.      void test()        //地面標(biāo)志線檢測子程序
  115.      {     
  116.          while(1)
  117.            {
  118.              k=analog(2);
  119.              if(k<30 II k>150)      //30 和 150 分別為底部傳感器檢測到的的標(biāo)志線和黑地面
  120.                j=k;        //的值,請根據(jù)實(shí)際測試值適當(dāng)修改
  121.              if((j<30) && (n>150))      //如果更改,此處也一并更改
  122.                {
  123.                  i++;
  124.                  beep();
  125.              }
  126.              n=j;
  127.          }
  128.      }

  129.      void select()        //回家程序選擇子程序
  130.      {
  131.          if(i<3)        //如果地面標(biāo)志線條數(shù)小于3(即在4號房間)
  132.            gohome_4();       //進(jìn)入4號房間回家子程序,下同
  133.          else if(i<5)
  134.              gohome_3();
  135.            else if(i<8)
  136.                gohome_2();
  137.              else
  138.                gohome_1();
  139.      }

  140.      void gohome_4()     //4號房間回家子程序
  141.      {
  142.          start_process(endstop());   //開啟終(起)點(diǎn)停止進(jìn)程序,下同
  143.          mg_right();     //右手法則回家
  144.          stop();     //停止
  145.          sleep(100.0);
  146.      }

  147.      void gohome_3()     //3號房間回家子程序
  148.      {
  149.          start_process(endstop());
  150.          mg_left();     //左手法則回家
  151.          stop();
  152.          sleep(100.0);
  153.      }

  154.      void gohome_2()     //2號房間的特殊回家程序
  155.      {   
  156.          motor(0,60);    //滅完火后右轉(zhuǎn)一段
  157.          motor(1,-60);
  158.          sleep(0.2);
  159.          reset_system_time();   //系統(tǒng)時(shí)間復(fù)位
  160.          while(mseconds()<2100L)   //運(yùn)行左手法則走迷宮2.1秒(時(shí)間長短為可以走出房間門口且不到3號房間的走廊)
  161.            {
  162.              while(digital(9)==0 II digital(10)==0)
  163.                {
  164.                  motor(0,60);
  165.                  motor(1,-50);
  166.              }
  167.              while(digital(15)==0 && digital(9)==1 && digital(10)==1)
  168.                {
  169.                  motor(0,50);
  170.                  motor(1,50);
  171.              }
  172.              while(digital(15)==1 && digital(9)==1 && digital(10)==1)
  173.                {
  174.                  motor(0,-80);
  175.                  motor(1,80);

  176.                  motor(0,45);
  177.                  motor(1,80);
  178.              }
  179.          }
  180.          stop();
  181.          sleep(0.1);
  182.          while(digital(9)==0)   //如果前方有障礙物,右轉(zhuǎn)(調(diào)整姿勢)
  183.            {
  184.              motor(0,60);
  185.              motor(1,-60);
  186.          }
  187.          while(digital(9) == 1)   //如果前方?jīng)]有障礙物,左、右手法則并進(jìn),基本上直行到另一端(3號房間旁)
  188.            {
  189.              if(digital(8)==0 )   //右邊45度有障礙物,左轉(zhuǎn)
  190.                {
  191.                  motor(0,-50);
  192.                  motor(1,50);
  193.              }
  194.              if(digital(14)==0 && digital(8)==1) //右邊有障礙物且右45度角無障礙物,直行
  195.                {
  196.                  motor(0,50);
  197.                  motor(1,50);
  198.              }
  199.              if(digital(10)==0)   //左邊45度有障礙物,右轉(zhuǎn)
  200.                {
  201.                  motor(0,50);
  202.                  motor(1,-50);
  203.              }
  204.              if(digital(15)==0 && digital(10)==1) //左邊有障礙物且左45度角無障礙物,直行
  205.                {
  206.                  motor(0,50);
  207.                  motor(1,50);
  208.              }
  209.              motor(0,50);    //直行
  210.              motor(1,50);
  211.          }
  212.          start_process(endstop());   //前方有障礙物時(shí),退出循環(huán),開啟終點(diǎn)停止進(jìn)程
  213.          while(end)     //左手法則走迷宮
  214.            {
  215.              if(digital(9)==0 II digital(10)==0)
  216.                {
  217.                  motor(0,60);
  218.                  motor(1,-50);
  219.              }
  220.              else if (digital(15)==0 && digital(9)==1 && digital(10)==1)
  221.                {
  222.                  motor(0,70);
  223.                  motor(1,70);
  224.              }
  225.              else
  226.                {
  227.                  motor(0,-80);
  228.                  motor(1,80);

  229.                  motor(0,40);
  230.                  motor(1,100);
  231.              }
  232.          }
  233.          motor(0,-100);    //終點(diǎn)剎車
  234.          motor(1,-100);
  235.          sleep(0.1);
  236.          stop();     //停止
  237.          sleep(100.0);   
  238.      }

  239.      void gohome_1()     //1號房間回家
  240.      {
  241.          start_process(endstop());   //開啟終點(diǎn)停止進(jìn)程
  242.          mg_right();     //右手法則走迷宮
  243.          stop();
  244.          sleep(100.0);
  245.      }

  246.      void mg_right()     //右手法則走迷宮子程序
  247.      {
  248.          while(end)
  249.            {
  250.              if(digital(8)==0 II digital(9)==0)
  251.                {
  252.                  motor(0,-70);
  253.                  motor(1,70);
  254.              }
  255.              else if(digital(14)==0 && digital(9)==1 && digital(8)==1)
  256.                  {
  257.                    motor(0,100);
  258.                    motor(1,100);
  259.                }
  260.                else
  261.                  {               
  262.                    motor(0,100);
  263.                    motor(1,-100);

  264.                    motor(1,20);
  265.                    motor(0,100);
  266.                }
  267.          }   
  268.      }

  269.      void mg_left()     //左手法則走迷宮子程序
  270.      {
  271.          while(end)
  272.            {        
  273.              if(digital(9)==0 II digital(10)==0 )
  274.                {
  275.                  motor(0,60);
  276.                  motor(1,-50);
  277.              }
  278.              else if(digital(15)==0 && digital(9)==1 && digital(10)==1)
  279.                {
  280.                  motor(0,70);
  281.                  motor(1,70);
  282.              }
  283.              else
  284.                {
  285.                  motor(0,-100);
  286.                  motor(1,100);

  287.                  motor(0,30);
  288.                  motor(1,100);
  289.              }
  290.          }   
  291.      }

  292.      void endstop()     //終點(diǎn)停止進(jìn)程子程序
  293.      {
  294.          while(1)
  295.            {
  296.              k=analog(2);    //檢測1次
  297.              sleep(0.02);    //間隔0.02秒,再檢測 //可適當(dāng)縮短或延長時(shí)間
  298.              if(k<50 && analog(2)<50)  //如果2次都是白色,終點(diǎn)到,停止
  299.                {
  300.                  end=0;
  301.                  stop();
  302.                  sleep(1.0);            
  303.              }
  304.          }
  305.      }

  306.      //全部程序結(jié)束
復(fù)制代碼



作者: xiangxinziji33    時(shí)間: 2017-12-25 21:37
正在學(xué)習(xí)中,謝謝分享




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1