Question

J'ai un projet de programmation d'un microcontrôleur PIC18F, je dois connecter un circuit de commutation à la carte du microcontrôleur, ce circuit de commutation possède une serrure électrique et un buzzer pour y être connecté.

La serrure est initialement alimentée.Il est supposé que lorsque j'envoie « 1 », le buzzer sera alimenté par une onde carrée et le verrou sera éteint.Lorsqu'il reçoit « 0 », le buzzer s'éteindra sans alimenter à nouveau la serrure.Lorsqu'il reçoit « 2 », la serrure doit être alimentée, mais si le buzzer n'était pas alimenté auparavant, il ne doit pas être alimenté à nouveau.

Ma confusion est dans la dernière partie.Lorsque j'envoie un '2' via l'hyperterminal, et que j'envoie un '0' avant celui-ci, le buzzer est à nouveau alimenté.

Voici le code,

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
}

Quelqu'un peut-il m'aider à résoudre ce problème ?

Était-ce utile?

La solution

Vous définissez buzzer à 0 en dehors du if(uart_rd='0') bloc.Alors quand tu viens au if(uart_rd='2') bloc, buzzer est toujours 0 et donc le if(buzzer!=1) le bloc est toujours appelé.

Avez-vous essayé de résoudre ce problème avec un débogueur ?Cela montrerait facilement ce genre de chose.Vous pouvez également les modifier if bloque soit à un switch déclaration ou une série de if / else if déclarations pour éviter ce genre de problèmes.

Autres conseils

Voici le code d'exécution:

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
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top