为方便师生们修改,将程序分成很多段。while(x)中的x并没有别的意义,只是一种段落标志,只要 x 不是0,就和while(1)的意义相同。
#include <LNDZ.h>
twled led;
int ll,l,m,r,rr,n;
void check(){//传感器检测
ll=AR(47)>400;//注意此处的黑背分界线和模拟口引脚编号
l=AR(49)>400;
m=AR(50)>400;
r=AR(48)>400;
rr=AR(46)>400;
n=ll+l+m+r+rr;//求和方便判断同一时间有几个传感器检测到线
}
void find(){//黑线
if (ll) motor(-50,50);
else
if (l) motor(0,50);
else
if (m) motor(50,50);
else
if (r) motor(50,0);
else
if (rr) motor(50,-50);

}
void findwhite(){//白线
if (ll==0) motor(-50,50);
else
if (l==0) motor(0,50);
else
if (m==0) motor(50,50);
else
if (r==0) motor(50,0);
else
if (rr==0) motor(50,-50);
}
void setup() {
B_start();
motor(40,40);delay(200);//出发区出发
while (1){
check();find();
if (rr+r==2||rr+m==2||n>2){//进入圆弧
motor(40,40);delay(100);
motor(40,-40);beep(300);
break;
}
}
while (2){
check();find();
if (n>3){//到达A点,停车一秒
motor(0,0); beep(1000);
break;
}
}
motor(40,40);delay(100);//确保冲过A点
String s="";//记录左右路口情况
while (3){
check();find();
if (n>3){//到达b点停车,并开始亮灯
motor(0,0);
long tm=millis();//记录当前消耗的总时间
while (millis()-tm<5000){//停车后开始亮灯5秒(双色同在)
for (int i=0;i<5;i++){//遍历字符串,区分左右路口
if (s[i]=='0') led.sw(i,Green);
}
delay(1);//1毫秒之后灭灯
for (int i=0;i<5;i++){
if (s[i]=='0') led.sw(i,0);
}//利用闪烁(视觉残留)实现双色同在
for (int i=0;i<5;i++){
if (s[i]=='1') led.sw(i,Red);
}
delay(1);
for (int i=0;i<5;i++){
if (s[i]=='1') led.sw(i,0);
}
}
break;//结束“识别路口”任务
}
if (ll+l==0){
s=s+'0';//字符0表示左路口
motor(40,40);beep(120);
}
if (rr+r==0){
s=s+'1';//字符1表示右路口
motor(40,40);beep(120);
}
}
motor(40,40);delay(100);
//冲过B点
while (4){
check();find();
if (n>3){//进入白线区域
motor(40,40);beep(150);
break;
}
if (rr+r==2){
motor(30,30);delay(100);
motor(40,-40);beep(300);
}
}
int p=0;//记录白线路口
while (5){//开始走白线
check();findwhite();
if (n<3){
p++;
if (p==1){
motor(40,40);beep(150);
}
if (p==2){
motor(30,30);delay(100);
motor(40,-40);beep(300);
}
if (p==3){
motor(40,40);beep(150);
break;//到达C点,开始巡黑线
}
}
}
//此处省略推物程序,直接由C点走到D点
p=0;//记录黑线路口
while (6){
check();find();
if (n>3){
p++;
if (p==1){
motor(30,30);delay(100);
motor(40,-40);beep(300);
}
if (p==2){
motor(40,40);beep(150);
}
if (p==3){
motor(30,30);delay(100);
motor(-40,40);beep(300);
}
if (p==4){
motor(30,30);delay(100);
motor(40,-40);beep(300);
break;
}
}
}
p=0;
while (7){
check();find();
if (n==0) p++; else p=0;
//无路口(全白区域)检测
if (p>400){//如果有超过400次检测,没有看到黑线认为到达D点
motor(0,0);beep(800);//报警
motor(50,-50);delay(450);//调头
break;
}
}
while(8){
check();find();
if (n>3){
motor(30,30);delay(100);
motor(40,-40);beep(300);
break;
}
}
long tm=millis();
while (9){
check();find();
if (millis()-tm>4000){
//巡线4秒后停车(进入了终止区)
motor(0,0);
break;
}
}
}
void loop() {}