找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5425|回复: 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 单片机教程网

快速回复 返回顶部 返回列表