```c #include "main.h" //函数列表 #define g_I_F_Left_0 EXP_analog(0,KZ[1][7]) #define g_I_F_Left_1 EXP_analog(0,KZ[1][6]) #define g_I_F_Left_2 EXP_analog(0,KZ[1][5]) #define g_I_F_Left_3 EXP_analog(0,KZ[1][4]) #define g_I_F_Left_4 EXP_analog(0,KZ[1][3]) #define g_I_F_Left_5 EXP_analog(0,KZ[1][2]) #define g_I_F_Left_6 EXP_analog(0,KZ[1][1]) #define g_I_F_Left_7 EXP_analog(0,KZ[1][0]) #define g_I_B_Left_0 EXP_analog(1,KZ[1][7]) #define g_I_B_Left_1 EXP_analog(1,KZ[1][6]) #define g_I_B_Left_2 EXP_analog(1,KZ[1][5]) #define g_I_B_Left_3 EXP_analog(1,KZ[1][4]) #define g_I_B_Left_4 EXP_analog(1,KZ[1][3]) #define g_I_B_Left_5 EXP_analog(1,KZ[1][2]) #define g_I_B_Left_6 EXP_analog(1,KZ[1][1]) #define g_I_B_Left_7 EXP_analog(1,KZ[1][0]) #define F_M_R analog(1) #define F_M_L analog(5) #define a2 analog(2) #define ri analog(11) #define a7 analog(7) #define g_I_AIL_M_Left analog(3) #define g_I_AIL_M_Right analog(4) #define d5 digital(5) #define d6 digital(6) #define d7 digital(7) #define d8 digital(8) #define d9 digital(9) #define d10 digital(10) #define d11 digital(11) #define d12 digital(12) #define IIC_analog(ch) iicdata(0xA8,ch) #define IIC_digital(ch) iicdata(0xA8,32+ch) #define IIC_servos(ch,s) iicdata(0xA8,64+ch);iicdata(0xA8,s) #define IIC_servo_stop(ch) iicdata(0xA8,96+ch) int i=0; int z[5]={250,170,130,70,120}; int j=0; int c; int x; int b; int t; int q; int w; int e; int k1=2400; int k2=3000; int k3=200; int t; int m; int n; int k; int r; int w; int s; int f; int i1; int q1; int w1; int e1; void run(); void go_and_up1(); void go_and_up2(); void go_and_up3(); void go_and_up4(); void go_and_up1_2(); void goout();//出框 void xunxian01(); void xunxian03(); void xunxian04(); void xunxian02();//巡线 void dingwei(); void turnleft(); //左转弯 void turnright();//右转弯 void b_turnright74();//后右转 void b_turnleft74();//后左转 void B_xunxian();//后巡线 void chafang();//查房 void kua(); void turnleft01(); void Link_back_speed20(); void Link_go_speed20(); void xiuxi(); void turnright01(); void Servos_SET(int SER_1,int SER_6,int SER_7,int SER_8,int SER_5); //主函数开始 int main() { int t=21000; int m=60000; int n=80000; int r; int w; int k; int s; int f; int i; int i1=0; int q1=150; int w1=130; int e1=50; RobotInit(); stop();sleep(0.1); Servos_SET(250,170,130,70,120); //舵机的初始值 stop();sleep(1.0); goout();//出门函数,用灰度传感器 while(t){ xunxian01(); t--; }//一号线,只用巡线 turnleft();//左转,for转 xunxian03();//巡线,无红外 dingwei(); //定位,准备转弯 b_turnright74();//后右转,准备查房 chafang();//查房函数,使用红外测距传感器 while(m){ --m; xunxian01(); }//查房完毕,回来,在3号线 turnright();//右转,for转 while(n){ --n; xunxian04(); }//高速巡线 xunxian03();//低速巡线 dingwei();//定位,准备转弯 b_turnleft74();//后左转,准备查房 chafang();//查右病房,红外测距 xunxian03();//巡线,无红外 dingwei();//定位 turnleft01(); //在五号线末左转,定位转 xunxian03();//四号线,无红外巡线 dingwei();//定位转,路径太短 turnright01();//在四号线末,定位式右转 xunxian03();//六号线,无红外式巡线 dingwei();//定位转弯 turnleft01();//在六号线末,定位式左转 r=95000; while(r){ xunxian01(); --r; }//在七号线上,次数转弯 turnright();//在七号线末,for式右转 xunxian03();//无红外式巡线,八号线上 dingwei();//定位,准备转弯 turnleft01();//定位式左转,在八号线末 w=45000; while(w){ Link_back_speed20(); w--; }//后退,准备好手臂 go_and_up1();//拿药瓶的前进举爪go_and_up1();//拿药瓶的前进举爪//前进,去抓杯子 dingwei(); run(10,10); sleep(0.2); //////////////////////抓杯子////////////////////////////////////////////// Servos_SET(250,170,130,70,120);stop();sleep(1); Servos_SET(170,170,130,70,120);stop();sleep(1); Servos_SET(170,200,130,70,120);stop();sleep(1); z[0]=170;z[1]=200;z[2]=130;z[3]=70;z[4]=120;//抓杯子 /////////////////////////机械臂向上移动//////////////// go_and_up2(); q=160; r=45000; while(r){ Link_back_speed20(); r--;//后退,去放杯子 } while(g_I_AIL_M_Left run(-10,-10); }//定位,准备右转 x=1; while(1){ if(g_I_F_Left_0>k1) break; else run(17,-17); } while(1){ if(g_I_AIL_M_Right>k2) break; else run(17,-17); if(g_I_AIL_M_Left>k2) x=0; } if(x==1){ while(g_I_AIL_M_Left run(17,-17); } } //转弯,准备去放杯子 //用灰度传感器转弯 while(1){ if(g_I_B_Left_7>k1&&g_I_B_Left_7>k1) break; else if(g_I_B_Left_7k1) run(0,-20); else if(g_I_B_Left_7>k1&&g_I_B_Left_0 run(-20,0); else run(10,10); }//微调,成90度角转弯 while(1) { if(g_I_F_Left_0>k1)break; else if(g_I_F_Left_7>k1)break; else if(g_I_F_Left_3>k1)break; else if(g_I_F_Left_4>k1)break; else run(15,15);//送杯子 go_and_up3();//放药瓶的前进举爪/// } while(1) { if(g_I_F_Left_7>k1&&g_I_F_Left_0>k1) break; else if(g_I_F_Left_7k1) run(-20,0); else if(g_I_F_Left_7>k1&&g_I_F_Left_0 run(0,-20); else run(10,10); }//微调,用 g_I_F_Left_7>k1&&g_I_F_Left_0>k1来微调,以此来调整中心 run(15,15); sleep(0.2); run(0,0); sleep(0.1); Servos_SET(170,125,60,210,120);stop();sleep(1); Servos_SET(250,125,55,210,120);stop();sleep(0.5); z[0]=250;z[1]=125;z[2]=55;z[3]=210;z[4]=120;//放杯子完毕 go_and_up4();//放药瓶的后退举爪,回到白线上 run(0,0);sleep(0.2); while(g_I_F_Left_3 while(g_I_AIL_M_Left>k2){ run(17,-17); } while(g_I_AIL_M_Right>k2){ run(17,-17); } } run(0,0); sleep(0.2); run(0,0);sleep(0.3);//在白线上微调,以为了后期巡线 f=0; while(g_I_F_Left_1 xunxian01(); }//巡线 stop(); sleep(0.1); run(10,8); sleep(0.1);//左边在白线上 xunxian03(); while(1){ if(ri<200) break; else{ if(g_I_F_Left_3>k1&&g_I_F_Left_4>k1){ run(15,15); } else if(g_I_F_Left_2>k1){ run(10,30); } else if(g_I_F_Left_5>k1){ run(30,10); } else if(g_I_F_Left_1>k1){ run(-5,40); } else if(g_I_F_Left_6>k1){ run(40,-5); } else run(15,15); } }//冲过任意十字路口 go_and_up1_2();//拿药瓶的前进举爪2,准备抓杯子 run(10,10); sleep(0.3); while(1){ if(g_I_AIL_M_Left>k2) { break; } else if(g_I_AIL_M_Right>k2) { break; } else run(10,10); } run(15,15); sleep(0.25); /////////////////////////抓右杯子//////////////////////////////////// printf("抓右杯子\n"); Servos_SET(250,170,130,70,120);stop();sleep(1); Servos_SET(170,170,130,70,120);stop();sleep(1); Servos_SET(170,200,130,70,120);stop();sleep(1); z[0]=170;z[1]=200;z[2]=130;z[3]=70;z[4]=120;//抓右杯子 /////////////////////////////////////////////////////// ///////////////////////task8////////////////////////// q=160; go_and_up2();//拿药瓶的后退举爪前进,抓杯子后抬高手臂 w=90000; while(w){ Link_back_speed20(); w--; }//已抓杯子,后退十万次 while(g_I_AIL_M_Left run(-10,-10); }//定位3十字路口,准备左转 for(w=0;w<660000;w++){ run(-17,17); }//左转,准备送杯子 while(1){ if(g_I_B_Left_7>k1&&g_I_B_Left_7>k1){ break; } else if(g_I_B_Left_7k1) run(0,-20); else if(g_I_B_Left_7>k1&&g_I_B_Left_0 run(-20,0); else run(10,10); }//转弯后微调 go_and_up3();//送杯子,放药瓶的前进举爪放药瓶的前进举爪 while(1) { if(g_I_F_Left_7>k1&&g_I_F_Left_0>k1) break; else if(g_I_F_Left_7k1) run(-20,0); else if(g_I_F_Left_7>k1&&g_I_F_Left_0 run(0,-20); else run(10,10); }//微调,用 g_I_F_Left_7>k1&&g_I_F_Left_0>k1来微调,以此来调整中心 run(15,15); sleep(0.2); run(0,0); sleep(0.1); Servos_SET(170,125,60,210,120);stop();sleep(1); Servos_SET(250,125,55,210,120);stop();sleep(0.5); z[0]=250;z[1]=125;z[2]=55;z[3]=210;z[4]=120; go_and_up4(); //回到白线上,放药瓶的后退举爪放药瓶的后退举爪 run(17,-17); sleep(0.1); run(15,-15);sleep(0.1); run(25,-25);sleep(0.1); while(g_I_F_Left_7 run(17,-17); } run(0,0);sleep(0.2); while(g_I_F_Left_3 { run(17,-17); } run(0,0);sleep(0.3);//回到白线上,微调后,巡线 f=0; while(g_I_F_Left_1 xunxian01(); } stop(); sleep(0.1); while(g_I_F_Left_1>k1){//左边在白线上 run(10,10); sleep(0.2); continue; } while(g_I_F_Left_6>k1){ for(i=0;i<10000;i++){ if(g_I_F_Left_1>k1){ f=1; } run(15,15); if(g_I_F_Left_1>k1){ f=1; } } if(f==1){ run(10,10); sleep(0.2); continue; } } run(10,8); sleep(0.1); while(1){ if(ri<200) break; else{ if(g_I_F_Left_3>k1&&g_I_F_Left_4>k1) run(15,15); else if(g_I_F_Left_2>k1) run(10,30); else if(g_I_F_Left_5>k1) run(30,10); else if(g_I_F_Left_1>k1) run(-5,40); else if(g_I_F_Left_6>k1) run(40,-5); else run(15,15); } }//冲过任意十字路口 dingwei(); turnright01(); xunxian03(); dingwei(); turnright01(); r=95000; while(r){ xunxian01(); --r; }//在七号线上,次数转弯 turnleft(); w=90000; while(w){ xunxian01(); --w; } while(1){ stop(); } } void go_and_up1()//拿药瓶的前进举爪1 {j=0; while(1) { if(g_I_F_Left_7>k1) break; else { if(g_I_F_Left_3>k1&&g_I_F_Left_4>k1) run(20,20); else if(g_I_F_Left_2>k1) run(10,30); else if(g_I_F_Left_5>k1) run(30,10); else if(g_I_F_Left_1>k1) run(-5,30); else if(g_I_F_Left_6>k1) run(30,-5); else run(20,20); if(j00==0) { if(z[1]<200) z[1]++; Servos_SET(z[0],z[1],z[2],z[3],z[4]); j=0; } j++; } } } void dingwei_back()//反方向巡各种路口 { while(1) {if(g_I_AIL_M_Left>b||g_I_AIL_M_Right>b) break; else run(-15,-15); } run(0,0); sleep(0.1); } void dingwei_backs()//确保能够让车回到白线上 { while(1) { if(ri<200) break; else run(-15,-15); } dingwei_back(); } void go_and_up1_2(){//拿药瓶的前进举爪2 j=0; while(1){ if(g_I_F_Left_0>k1) break; else { if(g_I_F_Left_3>k1&&g_I_F_Left_4>k1) run(20,20); else if(g_I_F_Left_2>k1) run(10,30); else if(g_I_F_Left_5>k1) run(30,10); else if(g_I_F_Left_1>k1) run(-5,30); else if(g_I_F_Left_6>k1) run(30,-5); else run(20,20); if(j00==0){ if(z[1]<200) z[1]++; Servos_SET(z[0],z[1],z[2],z[3],z[4]); j=0; } j++; } } } void go_and_up2(){ //拿药瓶的后退举爪 j=0; while(1){ if(g_I_B_Left_0>k1||g_I_B_Left_7>k1) break; else{ if(g_I_B_Left_3>k1&&g_I_B_Left_4>k1) run(-18,-18); else if(g_I_B_Left_2>k1) run(-10,-30); else if(g_I_B_Left_5>k1) run(-30,-10); else if(g_I_B_Left_1>k1) run(-5,-30); else if(g_I_B_Left_6>k1) run(-30,-5); else run(-20,-20); if(jP0==0){ if(z[1]>170) z[1]--; Servos_SET(z[0],z[1],z[2],z[3],z[4]); j=0; } j++; } } } void go_and_up3(){//放药瓶的前进举爪 j=0; while(g_I_F_Left_0 run(15,15); if(jP00==0){ if(z[1]>125) z[1]-=5; if(z[2]>60) z[2]-=5; if(z[3]<210) z[3]+=10; Servos_SET(z[0],z[1],z[2],z[3],z[4]); j=0; } j++; } } void go_and_up4(){//放药瓶的后退放爪 j=0; while(g_I_AIL_M_Left run(-15,-15); if(j 00==0){ if(z[1]<170) z[1]+=1; if(z[2]<130) z[2]+=5; if(z[3]>70) z[3]-=5; Servos_SET(z[0],z[1],z[2],z[3],z[4]); j=0; } j++; } } void Servos_SET(int SER_1,int SER_2,int SER_3,int SER_4,int SER_5){ init_servos(1); IIC_servos(5,SER_5); IIC_servos(4,SER_4); IIC_servos(3,SER_3); IIC_servos(2,SER_2); IIC_servos(1,SER_1); } void Link_back_speed20(){ if(g_I_B_Left_3>k1&&g_I_B_Left_4>k1) { run(-25,-25); } else if(g_I_B_Left_2>k1) { run(-40,-10); } else if(g_I_B_Left_5>k1) { run(-10,-40); } else if(g_I_B_Left_1>k1) { run(-50,5); } else if(g_I_B_Left_6>k1) { run(5,-50); } else { run(-25,-25); } } void turnleft01(){ run(-15,15);sleep(0.1); run(-25,25);sleep(0.1); while(g_I_F_Left_0 { run(-17,17); } while(g_I_F_Left_4 { run(-17,17); } } void run(g_I_L,g_I_R){ motor(0,g_I_R); motor(1,g_I_L); } void b_turnleft74(){ run(-15,15);sleep(0.1); run(-25,25);sleep(0.1); while(g_I_B_Left_7 run(-17,17); } while(g_I_B_Left_3 run(-17,17); } } void turnright01(){ run(15,-15);sleep(0.1); run(25,-25);sleep(0.1); while(g_I_F_Left_7 run(17,-17); } while(g_I_F_Left_3 run(17,-17); } } void goout(){ while(g_I_AIL_M_Left run(25,25); } } void turnright(){ for(j=0;j<667000;j++){ run(25,0); } } void chafang(){ while(d7!=1) { B_xunxian(); } while(d8!=1) { B_xunxian(); } motor(20,20); sleep(0.19); } void B_xunxian(){ if(g_I_B_Left_3>k1&&g_I_B_Left_4>k1) { run(-25,-25); } else if(g_I_B_Left_2>k1) { run(-40,-10); } else if(g_I_B_Left_5>k1) { run(-10,-40); } else if(g_I_B_Left_1>k1) { run(-50,5); } else if(g_I_B_Left_6>k1) { run(5,-50); } else { run(-25,-25); } } void xunxian01(){ if(g_I_F_Left_3>k1&&g_I_F_Left_4>k1){ run(25,25); } else if(g_I_F_Left_2>k1){ run(5,40); } else if(g_I_F_Left_5>k1){ run(40,5); } else if(g_I_F_Left_1>k1){ run(-5,60); } else if(g_I_F_Left_6>k1){ run(60,-5); } else{ run(25,25); } } void xunxian03(){ while(g_I_F_Left_0 if(g_I_F_Left_3>k1&&g_I_F_Left_4>k1){ run(25,25); } else if(g_I_F_Left_2>k1){ run(10,50); } else if(g_I_F_Left_5>k1){ run(50,10); } else if(g_I_F_Left_1>k1){ run(-5,60); } else if(g_I_F_Left_6>k1){ run(60,-5); } else{ run(25,25); } } } void dingwei(){ while(g_I_AIL_M_Left run(10,10); } } void turnleft(){ for(j=0;j<650000;j++){ run(2,25); } } void b_turnright74(){ run(15,-15);sleep(0.1); run(25,-25);sleep(0.1); while(1) { if(g_I_B_Left_7>k1) { break; } else { run(17,-17); } } while(1) { if(g_I_B_Left_3>k1) { break; } else { run(17,-17); } } } void xunxian04(){ if(g_I_F_Left_3>k1&&g_I_F_Left_4>k1){ run(35,35); } else if(g_I_F_Left_2>k1){ run(10,50); } else if(g_I_F_Left_5>k1){ run(50,10); } else if(g_I_F_Left_1>k1){ run(-5,60); } else if(g_I_F_Left_6>k1){ run(60,-5); } else{ run(35,35); } } ```