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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

滅火小車傳感器接法與單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:258897 發表于 2017-12-8 02:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
傳感器接法
     紅外傳感器接法
       前紅外: 數字9
       左紅外: 數字15
       左45度角紅外: 數字10
       右45度角紅外: 數字8
       右紅外: 數字14
     火焰傳感器接法
       左火焰: 模擬3
       中火焰: 模擬5
       右火焰: 模擬4
     (底部)灰度傳感器:  模擬2
     聲控傳感器:  模擬6

     程序說明

  1.      #define p 120    //定義火焰傳感器檢測到火焰的返回值
  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)   //聲控啟動
  8.            {
  9.          }

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

  15.          pro=start_process(test());  //啟動地面標志線檢測進程

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

  27.      void migong()    //迷宮子程序
  28.      {   
  29.          if(digital(8)==0 II digital(9)==0)     //如果前方 或 右45度角紅外檢測到障礙物,左轉
  30.            {
  31.              motor(0,-70);       //根據情況,調節功率參數,以下雷同
  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        //如果沒有障礙物,右轉
  40.              {               
  41.                motor(0,100);
  42.                motor(1,-100);

  43.                motor(1,10);
  44.                motor(0,90);
  45.            }
  46.          if((i>2)&&(i>m))       //如果標志線數大于2且標志線有變化(針對1、2、3號房間)
  47.            {
  48.              stop();
  49.              while(analog(3)>150 && analog(5)>150 && analog(4)>150)   //如果沒有檢測到火焰
  50.                {
  51.                  motor(0,70);       //右轉
  52.                  motor(1,-70);
  53.                  if(digital(14)==0)       //右紅外檢測到障礙物,停止轉動
  54.                    break;
  55.              }
  56.              m=i+1;         //更改標志線的對比變量
  57.          }
  58.          if(i==1 && b && (analog(3)>150 && analog(5)>150 && analog(4)>150)) //4號房間,檢測到第1條標志線,且沒有火焰
  59.            {
  60.              while(digital(9)==0 II digital(8)==0 II digital(14)==0)   //任意右手紅外傳感器有障礙物,右轉
  61.                {            
  62.                  motor(0,70);
  63.                  motor(1,-70);
  64.              }
  65.              while(digital(9)==1)       //前方傳感器沒有障礙物,右前進
  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);        //強制直行一段
  82.              motor(1,60);       //主要是解決2號房間右手法則滅火時的碰墻的情況
  83.              sleep(0.6);
  84.              c=0;
  85.          }
  86.          while(analog(5)<10 && analog(2)<60)     //如果火焰距離合適 且 檢測到地面標志線,滅火
  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);      //關掉地面標志線檢測進程
  99.              select();       //進入回家子程序選擇子程序
  100.          }
  101.          while(analog(3)-analog(4)> 3)     //向右調整,如果調整較頻繁,修改最后的3
  102.            {
  103.              motor(0,50);
  104.              motor(1,-50);
  105.          }
  106.          while(analog(4)-analog(3)> 3)     //向左調整,同上
  107.            {
  108.              motor(0,-50);
  109.              motor(1,50);
  110.          }
  111.          motor(0,40);       //直行
  112.          motor(1,40);
  113.      }

  114.      void test()        //地面標志線檢測子程序
  115.      {     
  116.          while(1)
  117.            {
  118.              k=analog(2);
  119.              if(k<30 II k>150)      //30 和 150 分別為底部傳感器檢測到的的標志線和黑地面
  120.                j=k;        //的值,請根據實際測試值適當修改
  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)        //如果地面標志線條數小于3(即在4號房間)
  132.            gohome_4();       //進入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());   //開啟終(起)點停止進程序,下同
  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);    //滅完火后右轉一段
  157.          motor(1,-60);
  158.          sleep(0.2);
  159.          reset_system_time();   //系統時間復位
  160.          while(mseconds()<2100L)   //運行左手法則走迷宮2.1秒(時間長短為可以走出房間門口且不到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)   //如果前方有障礙物,右轉(調整姿勢)
  183.            {
  184.              motor(0,60);
  185.              motor(1,-60);
  186.          }
  187.          while(digital(9) == 1)   //如果前方沒有障礙物,左、右手法則并進,基本上直行到另一端(3號房間旁)
  188.            {
  189.              if(digital(8)==0 )   //右邊45度有障礙物,左轉
  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度有障礙物,右轉
  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());   //前方有障礙物時,退出循環,開啟終點停止進程
  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);    //終點剎車
  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());   //開啟終點停止進程
  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()     //終點停止進程子程序
  293.      {
  294.          while(1)
  295.            {
  296.              k=analog(2);    //檢測1次
  297.              sleep(0.02);    //間隔0.02秒,再檢測 //可適當縮短或延長時間
  298.              if(k<50 && analog(2)<50)  //如果2次都是白色,終點到,停止
  299.                {
  300.                  end=0;
  301.                  stop();
  302.                  sleep(1.0);            
  303.              }
  304.          }
  305.      }

  306.      //全部程序結束
復制代碼


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

使用道具 舉報

沙發
ID:266782 發表于 2017-12-25 21:37 | 只看該作者
正在學習中,謝謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区 | 久久久高清 | 一区二区三区免费 | 国产专区在线 | 玖玖在线免费视频 | 国产精品美女久久久久久免费 | 欧美男人天堂 | 日韩一区二区福利视频 | 在线第一页| 欧美精品欧美精品系列 | 国产精品入口 | 欧美一区二 | 国产乱码精品一区二区三区中文 | 欧美日日 | 九九热这里 | 中文精品视频 | 亚洲成人av在线播放 | 日日夜夜精品视频 | 久久天堂网 | 成人毛片网站 | 完全免费在线视频 | 久久久人成影片一区二区三区 | 在线91| 农村妇女毛片精品久久久 | 岛国精品| 91欧美精品成人综合在线观看 | 亚洲啊v在线| 在线视频亚洲 | 中文字幕日本一区二区 | 成人激情视频免费在线观看 | 99免费视频 | 欧美日韩一二区 | 琪琪午夜伦伦电影福利片 | 91精品国产一区二区三区蜜臀 | 精品国产乱码久久久久久丨区2区 | 黑人巨大精品 | 一区二区在线看 | 麻豆一区二区三区精品视频 | 久久国产精品一区二区 | 欧美日韩在线免费 | 日本午夜免费福利视频 |