2014-09-30 10 views
0

방을 들어올 때 조명이 자동으로 켜지고 그 반대의 경우 스마트 홈 자동화 장치를 만들려고합니다. 프로젝트를 위해 두 개의 레이저를 사용하여 사람들이 방에 들어가거나 나가야하는지 지정합니다. 또한 얼마나 많은 사람들이 방에 들어갔고 방을 들어가기 위해 마지막으로 방을 나간 후에 조명을 끄고 사진을 찍고 싶습니다. xc8 컴파일러로 pic16f877a IC와 mplab을 사용합니다. 지금까지는 프로그램이 잘 작동하지만 그것은 방에 들어간 사람들을 세지 않고, 시원하지 않은 잎 한 개만 켜고 불이 꺼지기 때문에 나는 문제가 어디에 있는지 알 수 없다. 여기에 코드입니다 :Mplab pic 프로그램이 작동하지 않습니다

  /* 
      * File: main.c 
      * Author: Fady 
      * 
      * Created on September 23, 2014, 9:56 PM 
      */ 

      #include <stdio.h> 
      #include <stdlib.h> 

      /* 
      * 
      */ 


      // PIC16F877A Configuration Bit Settings 

      // 'C' source line config statements 

      #include <xc.h> 

      // #pragma config statements should precede project file includes. 
      // Use project enums instead of #define for ON and OFF. 

      // CONFIG 
      #pragma config FOSC = XT  // Oscillator Selection bits (XT oscillator) 
      #pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled) 
      #pragma config PWRTE = OFF  // Power-up Timer Enable bit (PWRT disabled) 
      #pragma config BOREN = ON  // Brown-out Reset Enable bit (BOR enabled) 
      #pragma config LVP = ON   // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) 
      #pragma config CPD = OFF  // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) 
      #pragma config WRT = OFF  // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) 
      #pragma config CP = OFF   // Flash Program Memory Code Protection bit (Code protection off) 

      #define _XTAL_FREQ 4000000 
      #define laser1 PORTBbits.RB0 
      #define laser2 PORTBbits.RB1 
      #define isOn ==0 
      #define isOff ==1 

      int x1 = 0; 
      int x2 = 0; 

      int main() { 
       char people = 0; 
       nRBPU = 0; 
       TRISBbits.TRISB0 = 1; //laser 1 for input 
       TRISBbits.TRISB0 = 1; //laser 2 for input 
       TRISCbits.TRISC0 = 0; //output LED for output 
       PORTCbits.RC0 = 0; 
       while(1){ 
        beginning: 
        if((laser1 isOn && laser2 isOn) || (laser1 isOff && laser2 isOff)){      //if both lasers are on 
         goto beginning; 
        }else if(laser1 isOff && laser2 isOn){    //if laser1 is off and laser2 is on 
         readO: 
         if(laser2 isOff){ 
          if(people == 0){ 
           people = 1; 
           PORTCbits.RC0 = 1; 
          }if(people >= 1){ 
           people++; 
          } 

         }else{ 
          for(; x2 <= 1000; x2++){ 
           __delay_ms(1); 
           goto readO; 
          } 
         } 
         x2 = 0; 

        }else if(laser1 isOn && laser2 isOff){    //if laser1 is on and laser2 is off 
         readC: 
         if(laser1 isOff){ 
          people--; 
          if(people == 0){ 
           PORTCbits.RC0 = 0; 
          } 
         }else{ 
          for(; x1 <= 1000; x1++){ 
           __delay_ms(1); 
           goto readC; 
          } 
         } 

         x1 = 0; 

        } 
       } 

      } 

나는 그것이 아무 문제가 없다고 생각하지만 난 거 해결하는 모든 응답자 미리 어쨌든 잘못된 여기에 감사 무엇인지 잘 모릅니다이 정말 나를

답변

1
에 큰 도움이 될 것입니다

먼저 이해하기 쉬운 형태로 코드를 줄이기 위해 노력하십시오. 첫 번째 : goto와 같은 점프 작업을 피하십시오. 두 번째 : 명확하지 않은 결과가있는 if 문이 너무 많습니다. SWITCH 문을 사용하십시오.

beginning: 
       if((laser1 isOn && laser2 isOn) || (laser1 isOff && laser2 isOff)){      //if both lasers are on 
        goto beginning; 

왜 이렇게할까요? 당신은 영원히 반복됩니다!

+0

네 사람이 방에 들어가거나 방에서 나올지 여부를 지정하십시오. – ilouy

+0

방에 들어 오거나 나오는 사람들이 포함되지 않습니다. – ilouy

0

좋습니다.

countPeople = 0; 

동안 (1) {

if(PORTBbits.RB0 == 0) // People enter 
{ 
    countPeople++; // 
    //TODO: some thing if you want  
} 
elseif(PORTBbits.RB0 == 1) // people out or something like this 
{ 
    countPeople--; 
} 

//if nothing happend 

} 사람이 그것을 절단 된 첫 번째 또는 두 번째인지 여부를 확인 후, 레이저 라인을 잘라 결정까지 영원히 루프

+0

방금이 작업을 수행했지만 실제로 작동하지 않습니다. – ilouy

+0

사람을 확인하는 방법은 무엇입니까? 그림에 약간의 흠집을 그리고 나는 설명과 함께 당신을 위해 코드를 작성합니다. – SparrowBg