函数里count累加不起作用

img

img

img

img

img

img

img

img

img

img


为什么代码里的count的累加不起作用啊,还有图中的蜂鸣器部分,蜂鸣器一直在响,明明没有地方在控制他发出声音啊

中断里改变的全局变量,在定义和声明的时候要加上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 变量的定义和使用是否正确。

  1. count 没有被正确初始化

在使用 count 变量之前,需要确保它已经被正确初始化。可以尝试在代码的开头给 count 变量赋一个初始值,比如 count = 0

  1. count 的作用域不正确

如果 count 变量的作用域定义不正确,就可能出现累加不起作用的情况。需要确认 count 的定义和使用是否在同一个作用域内。

  1. 累加代码逻辑有误

有时候是累加代码本身存在逻辑错误。可以检查累加代码的逻辑和实现方式是否正确,比如是否存在语法错误、循环条件是否正确等等。

蜂鸣器一直响的问题,可能代码中开启蜂鸣器的语句放错了位置,导致一直处于开启状态。可以尝试对蜂鸣器的控制语句进行调整,将其放到需要的位置上。

没有走这个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与博主@晓码自在合作编写:

有几个可能的原因:

  1. count是全局变量,在递归调用中被多次修改,导致最终结果不正确。可以在函数内声明count为局部变量来解决这个问题:
c
void detect infrared() {
    int count = 0;  // 局部变量
    // ...
    count++;
}

  1. delay()函数中的延时可能太短,导致count增加的速度过快,出现误计数。可以适当增加delay()的延时来解决这个问题。

  2. 没有break语句导致case语句后的代码也被执行,这会导致count值被错误修改。需要在每个case语句后添加break来避免这种情况。

  3. 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

至于蜂鸣器一直响的问题,可能是代码中存在其他的控制语句或逻辑错误。如果可以提供代码或更详细的上下文信息,可以更好地帮助解决问题。
如果我的回答解决了您的问题,请采纳!