红外传感器接法前红外:数字9左红外:数字15左45度角红外:数字10右45度角红外:数字8右红外:数字14火焰传感器接法左火焰:模拟3中火焰:模拟5右火焰:模拟4(底部)灰度传感器:模拟2声控传感器:模拟6程序说明#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();elsegohome_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);}}}//全部程序结束#include <iom48v.h>#include <macros.h>#define motion_time1 4 #define motion_time2 6#define time1 100 //转弯时间#define time2 200 //直行时间#define adjusttime 10 //灭火中,姿势调整时,动作时间#define checktime 5 //在传感器检测当中,设置的容错时间//设定灭火时间//设定重复灭火次数#define delay_time1 10#define delay_time2 20#define fire_time 100 //设定灭火时间#define fire_times 3 //设定重复灭火次数unsigned int size=0;unsigned int i=0;unsigned int j=0;unsigned int h=0;unsigned int g=0;unsigned int k=0;unsigned int cny_times ;unsigned int cny_in;unsigned int cny_in1;unsigned int cny_in2;unsigned int cny_in3;unsigned int cny_in4;unsigned int cny_delayms =0;unsigned int workstate=1; //工作状态可作为检测是否进入灭火等unsigned int cny=0;void port_init(void){PORTB = 0x00;//DDRB = 0xFF;PORTC = 0xFF; //m103 output only DDRC = 0x00;PORTD = 0x0F;DDRD = 0xF0;} //呼叫这一个常式设定所有的外围设备初值void init_devices(void){//停止周游的中断直到再设置CLI(); //使所有的中断失去能力port_init();MCUCR = 0x00;EICRA = 0x00; //extended ext intsEIMSK = 0x00;TIMSK0 = 0x00; //timer 0 interrupt sources TIMSK1 = 0x00; //timer 1 interrupt sources TIMSK2 = 0x00; //timer 2 interrupt sourcesPCMSK0 = 0x00; //pin change mask 0 PCMSK1 = 0x00; //pin change mask 1 PCMSK2 = 0x00; //pin change mask 2 PCICR = 0x00; //pin change enablePRR = 0x00; //开关控制//SEI(); //re-enable interrupts//所有的外围设备现在被设定初值}/*前行*/void forward(void){PORTD = 0X60;//0110 0000}/*停止*/void stop(void){PORTD = 0X00;}void turn_right_s(void)//右转{PORTD = 0x20; //右转//0010 0000}void turn_left_s(void)//左转{PORTD = 0x40; //左转//0100 0000}void turn_right(void) //右转{PORTD = 0xa0; //右转//1010 0000}void turn_left(void) //左转{PORTD = 0x50; //左转//0101 0000}void backward(void)//后退{PORTD = 0x90; //后退//1001 0000}/************************声控启动程序运行************************/ void mic_startup(void){unsigned int mic_in;while(1){ //无键按下等待mic_in=PINC & 0x20; //pc5=0有声音if(mic_in== 0)break;}}// 微秒级延时程序void delay_us(unsigned int time){do{time--;}while (time>1);}/* 毫秒级延时程序*/void delay_ms(unsigned int time){while(time!=0){delay_us(1000);time--;}}//*传感器检测程序*//void check (){cny_in1=PINC & 0x03; //0000 0011cny_in2=PINC & 0x08; //00001000cny_in3=PINC & 0x11; //0001 0001cny_in4=PINC & 0x10; //0001 0000}void hd1(void){ while(cny_in1 == 0x01||cny_in1 == 0x00||cny_in1 == 0x02){if (cny_in3==0x01)j++;}}void hd2(void){ while(cny!=0){if (cny_in3==0x01)h++;}}/************************找房程序传感器:PC3:前避障、左避障,接在一起************************/void houseseek_module1()//此处是巡房程序,一般调试的时候要修改此处的延时时间//{while(1){ check ();if(cny_in2==0x00) //检测到左边或前边障碍物,右转{turn_right();delay_ms(4);stop();delay_ms(2);}if(cny_in2 == 0x08) //0000 1000小车偏离墙角,前方没有障碍物,可以采取左转的动作{turn_left();delay_ms(5);stop();delay_ms(4);forward();delay_ms(10);stop();delay_ms(4);}if(cny_in1 == 0x01||cny_in1 == 0x00||cny_in1 == 0x02) // 发现火焰,跳出break;}// seek_fire();}/************************回家************************/void cejia (void){check();if(cny_in4==0x00)//改过{forward();delay_ms(80);check();if(cny_in3==0x00){while(1){stop();}}}}void huijia(void)//{while(1){ check ();if(cny_in2==0x00) //检测到左边或前边障碍物,右转{turn_right();delay_ms(10);stop();delay_ms(2);}if(cny_in2 == 0x08) //0000 1000小车偏离墙角,前方没有障碍物,可以采取左转的动作{turn_left();delay_ms(5);stop();delay_ms(4);forward();delay_ms(10);stop();delay_ms(4);}if(cny_in2 == 0x08&&cny_in4== 0x00) {cejia();}}}/************************灭火程序传感器:pc0 pc1:左右火焰传感器pc4:灰度PB0:风扇************************/void fire(void){ stop();while(1){cny++; //设定标记如果灭火超过一定的次数,表明有错误。