Domanda

Ho un progetto per programmare un microcontrollore PIC18F, devo collegare un circuito di commutazione alla scheda Microcontroller, questo circuito di commutazione ha una serratura elettrica e un cicalino da collegare ad esso.

Il blocco è inizialmente alimentato.Si suppone che quando mando "1", il cicalino sarà alimentato con un'onda quadra e la serratura sarà spenta.Quando riceve '0', il cicalino verrà disattivato senza alimentare di nuovo il blocco.Quando riceve '2' la serratura deve essere alimentata ma se il cicalino non fosse imbottito prima, non dovrebbe essere di nuovo alimentato.

La mia confusione è nell'ultima parte.Quando mando "2" tramite l'iperterminale, e ho inviato '0' prima, il cicalino è di nuovo alimentato.

Ecco il codice,

void buzzertest();
char uart_rd;
int buzzer;
void main() {
TRISB=0X00;
PORTB=0x00;
RB5_bit = 0xFF;                  //lock  open
UART1_Init(9600);               // Initialize UART module at 9600 bps
while (1) {                     // Endless loop
 if (UART1_Data_Ready())       // If data is received,
 {
    buzzer=1;
    uart_rd = UART1_Read();     // read the received data,
    if(uart_rd =='1') {
       RB5_bit = 0x00;  //lock closed
       buzzertest();
     }
     if(uart_rd =='0' ){   //disable buzzer
        RB1_bit = 0x00;   //buzzer
        buzzer=0;
       }//end if
      buzzer=0;

      if(uart_rd =='2'){   //disable lock
        RB5_bit=0xFF;
        if(buzzer!=1){
            buzzertest();
         }
       }//end if
     } //end outer if
    } //end while
}//end main
void buzzertest(){
 while(1){
  RB1_bit = 0xFF;  //buzzer
  Delay_ms(1000);
  RB1_bit = 0x00; //buzzer
  Delay_ms(1000);
  if (UART1_Data_Ready())
  break;
 }//end while loop
}
.

può per favore qualcuno mi aiuti a risolvere questo?

È stato utile?

Soluzione

Stai impostando buzzer su 0 al di fuori del blocco if(uart_rd='0').Quindi, quando si arriva al blocco if(uart_rd='2'), buzzer è sempre 0 e quindi viene sempre chiamato il blocco if(buzzer!=1).

Hai provato a fare un passo con un debugger?Avrebbe mostrato questo genere di cose facilmente.È inoltre possibile modificare quei blocchi if a un'istruzione switch o una serie di istruzioni generatori di if / else if per evitare questi tipi di problemi.

Altri suggerimenti

Ecco il codice di esecuzione:

void buzzertest();
char uart_rd;
int buzzer;
void main() {
TRISB=0X00;
PORTB=0x00;
RB5_bit = 0xFF;                  //lock  open
UART1_Init(9600);               // Initialize UART module at 9600 bps
while (1) {                     // Endless loop
if (UART1_Data_Ready())       // If data is received,
 {
  uart_rd = UART1_Read();     // read the received data,
  if(uart_rd =='1') {
    RB5_bit = 0x00;  //lock closed
    buzzertest();
    buzzer=1  ;
   }
  else if(uart_rd =='0' ){   //disable buzzer
    RB1_bit = 0x00;   //buzzer
    buzzer=0;
   }//end else if

   else if(uart_rd =='2'){   //disable lock
     RB5_bit=0xFF;
     if(buzzer==1){
       buzzertest();
      }
    }//end else if
   } //end outer if
 } //end while
}//end main
void buzzertest(){
 while(1){
  RB1_bit = 0xFF;  //buzzer
  Delay_ms(1000);
  RB1_bit = 0x00; //buzzer
  Delay_ms(1000);
  if (UART1_Data_Ready())
   break;
 }//end while loop
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top