Automation PIC程序不工作

Automation PIC程序不工作,automation,microcontroller,pic,Automation,Microcontroller,Pic,我和pic的第一个有用的项目是制作一个智能家庭自动化系统,在一个房间的入口处放置两个激光器,根据您首先从LDR切割的激光器来检测您是进入还是离开,因此,如果您进入,您先切割第一个激光器,然后再切割第二个激光器,反之亦然,并相应地转动电源灯开或关,它还计算有多少人进入并在最后一次出来后关灯,无论我用它做什么,代码都不起作用,IDK为什么只要我只切断1个激光器,灯就亮,代码用MPLAB编写,并用XC8编译,mcu:pic16f877a main.cpp: #include "define.h" i

我和pic的第一个有用的项目是制作一个智能家庭自动化系统,在一个房间的入口处放置两个激光器,根据您首先从LDR切割的激光器来检测您是进入还是离开,因此,如果您进入,您先切割第一个激光器,然后再切割第二个激光器,反之亦然,并相应地转动电源灯开或关,它还计算有多少人进入并在最后一次出来后关灯,无论我用它做什么,代码都不起作用,IDK为什么只要我只切断1个激光器,灯就亮,代码用MPLAB编写,并用XC8编译,mcu:pic16f877a

main.cpp:

#include "define.h"

int main(){
    int counter = 0;
    TRISB = 255;
    OPTION_REG = 0b01111111;
    TRISC = 0;
    PORTC = 0;

    while(1){
        if(laser1 == 1 && laser2 == 0 && counter == 0){
            for(int x = 0; x <= 3000; x++){
                if(laser2 == 1){
                    PORTCbits.RC0 = 1;
                    counter++;
                    x = 0;
                    break;
                }
                __delay_ms(1);
            }

        }else if(laser1 == 1 && laser2 == 0 && counter >= 1){
            for(int y = 0; y <= 3000; y++){
                if(laser2 == 1){
                    counter++;
                    y = 0;
                    break;
                }
                __delay_ms(1);
            }
        }else if(laser1 == 0 && laser2 == 1){
            for(int z = 0; z <= 3000; z++){
                if(laser1 == 1){
                    counter--;
                    z = 0;
                    if(counter == 0){
                        PORTCbits.RC0 = 0;
                    }else{
                        PORTCbits.RC0 = 1;
                    }
                    break;
                }
                __delay_ms(1);
            }

        }

    }
}
#包括“define.h”
int main(){
int计数器=0;
TRISB=255;
选项_REG=0b01111111;
TRISC=0;
PORTC=0;
而(1){
如果(激光器1==1&&laser2==0&&counter==0){
对于(int x=0;x=1){

对于(int y=0;y我尝试了一些代码,最后它成功了,我将else从else if语句中删除为all if,它神奇地工作了,下面是完整的代码:

#include "define.h"

int main(){
    int counter = 0;
    TRISB = 255;
    OPTION_REG = 0b01111111;
    TRISC = 0;
    PORTC = 0;

    while(1){
        if(laser1 == 1 && laser2 == 0){
            for(int x = 0; x <= 3000; x++){
                if(laser2 == 1){
                    LED = 1;
                    counter++;
                    x = 0;
                    break;
                }
                __delay_ms(1);
            }

            __delay_ms(250);
        }
        if(laser1 == 0 && laser2 == 1){
            for(int x = 0; x <= 3000; x++){
                if(laser1 == 1){
                    counter--;
                    if(counter == 0){
                        LED = 0;
                    }
                    x = 0;
                    break;
                }
                __delay_ms(1);
            }
            __delay_ms(250);

        }

    }
}
#包括“define.h”
int main(){
int计数器=0;
TRISB=255;
选项_REG=0b01111111;
TRISC=0;
PORTC=0;
而(1){
如果(激光器1==1&&laser2==0){

对于(int x=0;x你能提供更多的信息吗?灯到底亮了吗?你能以某种形式测试调试吗?它会引发任何异常吗?是的,当只有两个ldr中的任何一个激光落在led上而与其他ldr没有任何关系时,led会亮起。抱歉,忘记了头文件会将其放在led上now@CalebB有什么建议吗?:)我建议将问题分解为更小的部分。首先尝试一个简单的案例来测试功能。例如,如果激光器1跳闸,则打开LED,如果再次跳闸,则关闭LED。然后对激光器2执行相同的操作。只是为了确保您的I/O和MCU的设置和功能正常。然后从那里使其更加复杂。
#include "define.h"

int main(){
    int counter = 0;
    TRISB = 255;
    OPTION_REG = 0b01111111;
    TRISC = 0;
    PORTC = 0;

    while(1){
        if(laser1 == 1 && laser2 == 0){
            for(int x = 0; x <= 3000; x++){
                if(laser2 == 1){
                    LED = 1;
                    counter++;
                    x = 0;
                    break;
                }
                __delay_ms(1);
            }

            __delay_ms(250);
        }
        if(laser1 == 0 && laser2 == 1){
            for(int x = 0; x <= 3000; x++){
                if(laser1 == 1){
                    counter--;
                    if(counter == 0){
                        LED = 0;
                    }
                    x = 0;
                    break;
                }
                __delay_ms(1);
            }
            __delay_ms(250);

        }

    }
}