#include <reg52.h>
//下面的是连接l298n模块的引脚与单片机引脚相连
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit IN3 = P1^2;
sbit IN4 = P1^3;
//红外避障模块
sbit out1 = P2^0;
sbit out2 = P3^7;
/函数声明/
void go(); //前进
void back(); //后退
void left(); //向左
void right(); //向右
void main()
{
while(1)
{
if(out2 == 0) //检测到右边有障碍物时,向左移动
{
left();
}
else if(out1 == 0) //检测到左边边有障碍物时,向右移动
{
right();
}
else if(out1 == 1 && out2 == 1) //检测到都没有障碍物时,向前移动
{
go();
}
else if(out1 == 0 && out2 == 0) //检测到都有障碍物时,向后移动
{
back();
}
}
}
//前进
void go()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
//后退
void back()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
//向左
void left()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
//向右
void right()
{
IN1=0;
IN2=1;
IN3=0;
IN4=0;
}
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
因为你的back函数在else if(out1 == 0 && out2 == 0)这个语句中,而上面最开始有if(out2==0)语句,如果out2==0成立,执行完left()函数后,else if(out1 == 0) 及其后面的语句就不再执行;当out2==0不成立,那么else if(out1 == 0 && out2 == 0)这个语句也不成立,所以,不管out2==0是否成立,else if(out1 == 0 && out2 == 0)这个语句都不会执行。
while部分,代码修改如下:
while(1)
{
if(out1 == 0 && out2 == 0) //检测到都有障碍物时,向后移动
{
back();
}
else if(out2 == 0) //检测到右边有障碍物时,向左移动
{
left();
}
else if(out1 == 0) //检测到左边边有障碍物时,向右移动
{
right();
}
else if(out1 == 1 && out2 == 1) //检测到都没有障碍物时,向前移动
{
go();
}
}
代码有问题啊,第15行的if代码块是永远不会执行到的
因为第3、7行的if已经将out1==0或out2==0的情况处理掉了,第15行的条件永远无法达成,错误提示就告诉你这件事
你应该将第15行作为第一个if判断进行处理
while(1)
{
if(out1 == 0 && out2 == 0) //检测到都有障碍物时,向后移动
{
back();
}
else if(out2 == 0) //检测到右边有障碍物时,向左移动
{
left();
}
else if(out1 == 0) //检测到左边边有障碍物时,向右移动
{
right();
}
else if(out1 == 1 && out2 == 1) //检测到都没有障碍物时,向前移动
{
go();
}
}
L16是:void back(); //后退
按你的逻辑判断流程,15行不可能会被执行到(具体原因请自行分析),所以代码就做了优化,于是这个函数就没机会被调用到了。
需要注意的是,51里没被调用的函数,也不能放任不管的。51有个很重要的内存优化,就是覆盖分析。比较奇葩的是,没被调用到的函数,不会参加内存覆盖分析,但是仍然会被连接到代码里,这就导致没被调用的函数,也会占用额外的ROM和RAM资源,对51来说,RAM尤其宝贵,所以没被调用的函数一定要注释掉。