中断里改变的全局变量,在定义和声明的时候要加上volatile。
我估计你的count变量会在中断程序里被改变。
1.最好写一个初始化函数,将所有端口的状态保持在自己想要的位置,2.count好像也没有清零处理,3.对红外检测管的状态进行跟踪追查
加几个断点,调试一下看看,具体是那个环节
1、temp的值由left1、left2、mid3、right4、right5等5位的值决定,二进制11111是31,一共应该会有32中情况。所有的ifelse加起来只有15种情况,其他情况应该统一加一个else,确定temp的值。
2、switch case10中count判断了2、3、4三种情况,count初始值为0,到等于2还有0和1要经历。如果等于0和等于1不做动作可以不考虑,但是count取值只能0-4的话,等于4以后要考虑清零。
count 累加不起作用的问题,需要检查代码中 count 变量的定义和使用是否正确。
在使用 count 变量之前,需要确保它已经被正确初始化。可以尝试在代码的开头给 count 变量赋一个初始值,比如 count = 0
。
如果 count 变量的作用域定义不正确,就可能出现累加不起作用的情况。需要确认 count 的定义和使用是否在同一个作用域内。
有时候是累加代码本身存在逻辑错误。可以检查累加代码的逻辑和实现方式是否正确,比如是否存在语法错误、循环条件是否正确等等。
蜂鸣器一直响的问题,可能代码中开启蜂鸣器的语句放错了位置,导致一直处于开启状态。可以尝试对蜂鸣器的控制语句进行调整,将其放到需要的位置上。
没有走这个switch,肯定不执行count
参考chatgpt解答:
没有看到count变量的初始化。
请确保在使用count变量之前对其进行初始化,例如将count初始化为0。这样可以确保count在每次调用detect_infrared函数时都从正确的起点开始累加。
下面是修改后的代码:
void detect_infrared() //reentrant函数名后加reentrant可以递归调用
{
if ((left1 == 0) && (left2 == 0) && (mid3 == 0) && (right4 == 0) && (right5 == 0)) //00000 蜂鸣
{
temp = 10;
count++;
}
else if ((left1 == 1) && (left2 == 1) && (mid3 == 0) && (right4 == 1) && (right5 == 1)) //11011 直走
{
temp = 9;
}
else if ((left1 == 1) && (left2 == 1) && (mid3 == 1) && (right4 == 1) && (right5 == 1)) //11111
{
temp = 8;
}
else if ((left1 == 1) && (left2 == 0) && (mid3 == 0) && (right4 == 1) && (right5 == 1)) //10011
{
temp = 3;
}
else if ((left1 == 1) && (left2 == 0) && (mid3 == 1) && (right4 == 1) && (right5 == 1)) //10111
{
temp = 6;
}
else if ((left1 == 0) && (left2 == 1) && (mid3 == 1) && (right4 == 0) && (right5 == 1)) //01111
{
temp = 5;
}
else if ((left1 == 0) && (left2 == 0) && (mid3 == 1) && (right4 == 1) && (right5 == 1)) //00111
{
temp = 12;
}
else
{
temp = 13;
}
switch (temp)
{
case 10:
// 00000检测到横线,蜂鸣器响
if (count == 2)
{
zz0();
FM = 1;
delay(2000);
FM = 0;
}
else if (count == 3)
{
turn_left();
}
else if (count == 4)
{
turn_right(0);
}
break;
case 9:
zz0(); // 11011
break;
case 8:
zz0(); // 11111
break;
case 0:
turn_right(0); // 11000 右转
break;
case 13:
turn_right(0); // 10000
break;
case 1:
turn_left(); // 00011 左转
break;
case 14:
turn_left(0); // 00001
break;
case 2:
correct_right(); // 11001 向右矫正
break;
}
}
void delay(uint z)
{
uint x, y;
for (x = z; x > 0; x--)
{
// 延时程序1ms
for (y =
根据您提供的代码,我注意到一些错误和需要修改的地方。下面是修改后的代码:
```c
void detect_infrared() //reentrant函数名后加reentrant可以递归调用
{
if ((left1 == 0) && (left2 == 0) && (mid3 == 0) && (right4 == 0) && (right5 == 0)) //00000 蜂鸣
{
temp = 10;
count++;
}
else if ((left1 == 1) && (left2 == 1) && (mid3 == 0) && (right4 == 1) && (right5 == 1)) //11011 直走
{
temp = 9;
}
else if ((left1 == 1) && (left2 == 1) && (mid3 == 1) && (right4 == 1) && (right5 == 1)) //11111
{
temp = 8;
}
else if ((left1 == 1) && (left2 == 0) && (mid3 == 0) && (right4 == 1) && (right5 == 1)) //10011
{
temp = 3;
}
else if ((left1 == 1) && (left2 == 0) && (mid3 == 1) && (right4 == 1) && (right5 == 1)) //10111
{
temp = 6;
}
else if ((left1 == 0) && (left2 == 1) && (mid3 == 1) && (right4 == 0) && (right5 == 1)) //01111
{
temp = 5;
}
else if ((left1 == 0) && (left2 == 0) && (mid3 == 1) && (right4 == 1) && (right5 == 1)) //00111
{
temp = 12;
}
else
{
temp = 13;
}
switch (temp)
{
case 10:
// 00000检测到横线,蜂鸣器响
if (count == 2)
{
zz0();
FM = 1;
delay(2000);
FM = 0;
}
else if (count == 3)
{
turn_left();
}
else if (count == 4)
{
turn_right(0);
}
break;
case 9:
zz0(); // 11011
break;
case 8:
zz0(); // 11111
break;
case 0:
turn_right(0); // 11000 右转
break;
case 13:
turn_right(0); // 10000
break;
case 1:
turn_left(); // 00011 左转
break;
case 14:
turn_left(0); // 00001
break;
case 2:
correct_right(); // 11001 向右矫正
break;
}
}
void delay(uint z)
{
uint x, y;
for (x = z; x > 0; x--)
{
// 延时程序1ms
for (y =
0; y < 110; y++);
}
}
该回答引用GPT与博主@晓码自在合作编写:
有几个可能的原因:
c
void detect infrared() {
int count = 0; // 局部变量
// ...
count++;
}
delay()函数中的延时可能太短,导致count增加的速度过快,出现误计数。可以适当增加delay()的延时来解决这个问题。
没有break语句导致case语句后的代码也被执行,这会导致count值被错误修改。需要在每个case语句后添加break来避免这种情况。
FM变量作为全局变量,在各个case语句中被修改但没有被恢复默认值,导致蜂鸣器持续响起。可以在每个case语句结束后将FM置0来解决这个问题:
c
case 10:
// ...
FM = 0; // 恢复默认值
break;
综上,修改后的代码如下:
c
void detect infrared() {
int count = 0;
if((left1=-0)&&(left2--0)&&(mid3==0)&&(right4=-0)&&(right5-=0)) { //00000 蜂鸣itemp=10:
count++;
FM = 1;
delay(2000);
FM = 0;
}
// ...
switch(temp) {
case 10:
if(count==2) zz00);
break;
// ...
case 9:
zz00);
break;
// ...
}
}
void delay(uint z) {
uint x,y;
for(x=z;x>0;X--)
for(y=0;y<110;y++)
; // 延时1ms
}
希望以上代码和分析能帮助您解决循环 count 累加和蜂鸣器持续响起的问题。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在函数内部累加计数器时,需要使用 global
关键字声明 count
变量为全局变量。否则,count
将会被视为函数内部的局部变量,局部变量的变化并不会影响到全局变量。
以下是一个简单的示例:
count = 0
def my_func():
global count
count += 1
my_func()
print(count) # 输出:1
至于蜂鸣器一直响的问题,可能是代码中存在其他的控制语句或逻辑错误。如果可以提供代码或更详细的上下文信息,可以更好地帮助解决问题。
如果我的回答解决了您的问题,请采纳!