灭火机器人C语言程序,灭火小车传感器接法与单片机源程序

#define p 120    //定义火焰传感器检测到火焰的返回值

int k,j,i=0,n,b=1,c=1;   //程序控制变量,不必更改

int m=i;

int pro,end=1;

void main()    //主程序

{

while(analog(6)>100)   //声控启动

{

}

while(!(analog(2)>100))  //走出白色超始区

{

motor(0,80);

motor(1,80);

}

pro=start_process(test());  //启动地面标志线检测进程

while(1)    //灭火与迷宫程序切换

{

if (analog(3)               {

fire();

}

else        //没有发现火焰,进入迷宫子程序

{

migong();

}

}

}

void migong()    //迷宫子程序

{

if(digital(8)==0 II digital(9)==0)     //如果前方 或 右45度角红外检测到障碍物,左转

{

motor(0,-70);       //根据情况,调节功率参数,以下雷同

motor(1,70);

}

else if(digital(14)==0 && digital(9)==1 && digital(8)==1)  //如果只右方有障碍物,直行

{

motor(0,100);

motor(1,100);

}

else        //如果没有障碍物,右转

{

motor(0,100);

motor(1,-100);

motor(1,10);

motor(0,90);

}

if((i>2)&&(i>m))       //如果标志线数大于2且标志线有变化(针对1、2、3号房间)

{

stop();

while(analog(3)>150 && analog(5)>150 && analog(4)>150)   //如果没有检测到火焰

{

motor(0,70);       //右转

motor(1,-70);

if(digital(14)==0)       //右红外检测到障碍物,停止转动

break;

}

m=i+1;         //更改标志线的对比变量

}

if(i==1 && b && (analog(3)>150 && analog(5)>150 && analog(4)>150)) //4号房间,检测到第1条标志线,且没有火焰

{

while(digital(9)==0 II digital(8)==0 II digital(14)==0)   //任意右手红外传感器有障碍物,右转

{

motor(0,70);

motor(1,-70);

}

while(digital(9)==1)       //前方传感器没有障碍物,右前进

{

motor(0,100);

motor(1,70);

}

b=0;         //控制变量

}

}

void fire()    //灭火子程序

{

if((i>4 II i<8) && c)      //如果在2号房间

{

while(analog(3)               {

motor(0,-60);

motor(1,60);

}

motor(0,60);        //强制直行一段

motor(1,60);       //主要是解决2号房间右手法则灭火时的碰墙的情况

sleep(0.6);

c=0;

}

while(analog(5)<10 && analog(2)<60)     //如果火焰距离合适 且 检测到地面标志线,灭火

{

motor(0,-10);       //后退一段

motor(1,-10);

sleep(0.15);

stop();

motor(2,100);       //灭火

sleep(2.000);

stop();

motor(0,-70);       //灭完火,后退一段

motor(1,-100);

sleep(0.2);

kill_process(pro);      //关掉地面标志线检测进程

select();       //进入回家子程序选择子程序

}

while(analog(3)-analog(4)> 3)     //向右调整,如果调整较频繁,修改最后的3

{

motor(0,50);

motor(1,-50);

}

while(analog(4)-analog(3)> 3)     //向左调整,同上

{

motor(0,-50);

motor(1,50);

}

motor(0,40);       //直行

motor(1,40);

}

void test()        //地面标志线检测子程序

{

while(1)

{

k=analog(2);

if(k<30 II k>150)      //30 和 150 分别为底部传感器检测到的的标志线和黑地面

j=k;        //的值,请根据实际测试值适当修改

if((j<30) && (n>150))      //如果更改,此处也一并更改

{

i++;

beep();

}

n=j;

}

}

void select()        //回家程序选择子程序

{

if(i<3)        //如果地面标志线条数小于3(即在4号房间)

gohome_4();       //进入4号房间回家子程序,下同

else if(i<5)

gohome_3();

else if(i<8)

gohome_2();

else

gohome_1();

}

void gohome_4()     //4号房间回家子程序

{

start_process(endstop());   //开启终(起)点停止进程序,下同

mg_right();     //右手法则回家

stop();     //停止

sleep(100.0);

}

void gohome_3()     //3号房间回家子程序

{

start_process(endstop());

mg_left();     //左手法则回家

stop();

sleep(100.0);

}

void gohome_2()     //2号房间的特殊回家程序

{

motor(0,60);    //灭完火后右转一段

motor(1,-60);

sleep(0.2);

reset_system_time();   //系统时间复位

while(mseconds()<2100L)   //运行左手法则走迷宫2.1秒(时间长短为可以走出房间门口且不到3号房间的走廊)

{

while(digital(9)==0 II digital(10)==0)

{

motor(0,60);

motor(1,-50);

}

while(digital(15)==0 && digital(9)==1 && digital(10)==1)

{

motor(0,50);

motor(1,50);

}

while(digital(15)==1 && digital(9)==1 && digital(10)==1)

{

motor(0,-80);

motor(1,80);

motor(0,45);

motor(1,80);

}

}

stop();

sleep(0.1);

while(digital(9)==0)   //如果前方有障碍物,右转(调整姿势)

{

motor(0,60);

motor(1,-60);

}

while(digital(9) == 1)   //如果前方没有障碍物,左、右手法则并进,基本上直行到另一端(3号房间旁)

{

if(digital(8)==0 )   //右边45度有障碍物,左转

{

motor(0,-50);

motor(1,50);

}

if(digital(14)==0 && digital(8)==1) //右边有障碍物且右45度角无障碍物,直行

{

motor(0,50);

motor(1,50);

}

if(digital(10)==0)   //左边45度有障碍物,右转

{

motor(0,50);

motor(1,-50);

}

if(digital(15)==0 && digital(10)==1) //左边有障碍物且左45度角无障碍物,直行

{

motor(0,50);

motor(1,50);

}

motor(0,50);    //直行

motor(1,50);

}

start_process(endstop());   //前方有障碍物时,退出循环,开启终点停止进程

while(end)     //左手法则走迷宫

{

if(digital(9)==0 II digital(10)==0)

{

motor(0,60);

motor(1,-50);

}

else if (digital(15)==0 && digital(9)==1 && digital(10)==1)

{

motor(0,70);

motor(1,70);

}

else

{

motor(0,-80);

motor(1,80);

motor(0,40);

motor(1,100);

}

}

motor(0,-100);    //终点刹车

motor(1,-100);

sleep(0.1);

stop();     //停止

sleep(100.0);

}

void gohome_1()     //1号房间回家

{

start_process(endstop());   //开启终点停止进程

mg_right();     //右手法则走迷宫

stop();

sleep(100.0);

}

void mg_right()     //右手法则走迷宫子程序

{

while(end)

{

if(digital(8)==0 II digital(9)==0)

{

motor(0,-70);

motor(1,70);

}

else if(digital(14)==0 && digital(9)==1 && digital(8)==1)

{

motor(0,100);

motor(1,100);

}

else

{

motor(0,100);

motor(1,-100);

motor(1,20);

motor(0,100);

}

}

}

void mg_left()     //左手法则走迷宫子程序

{

while(end)

{

if(digital(9)==0 II digital(10)==0 )

{

motor(0,60);

motor(1,-50);

}

else if(digital(15)==0 && digital(9)==1 && digital(10)==1)

{

motor(0,70);

motor(1,70);

}

else

{

motor(0,-100);

motor(1,100);

motor(0,30);

motor(1,100);

}

}

}

void endstop()     //终点停止进程子程序

{

while(1)

{

k=analog(2);    //检测1次

sleep(0.02);    //间隔0.02秒,再检测 //可适当缩短或延长时间

if(k<50 && analog(2)<50)  //如果2次都是白色,终点到,停止

{

end=0;

stop();

sleep(1.0);

}

}

}

//全部程序结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值