Не удалось правильно вызвать подпрограмму. Микроконтроллер PIC18F.

StackOverflow https://stackoverflow.com//questions/10700459

Вопрос

У меня есть проект по программированию микроконтроллера PIC18F, мне нужно подключить схему переключения к плате микроконтроллера, эта схема переключения имеет электрический замок и зуммер, который нужно подключить к нему.

Замок изначально находится под напряжением.Предполагается, что когда я отправлю «1», зуммер подаст сигнал прямоугольной формы и замок выключится.Когда он получит «0», зуммер выключится без повторного включения замка.Когда он получает «2», на замок должно быть подано питание, но если зуммер ранее был обесточен, его нельзя подавать снова.

Мое замешательство в последней части.Когда я отправляю «2» через гипертерминал, а перед этим я отправил «0», зуммер снова включается.

Вот код,

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
}

Может ли кто-нибудь помочь мне решить эту проблему?

Это было полезно?

Решение

Вы устанавливаете buzzer до 0 за пределами if(uart_rd='0') блокировать.Поэтому, когда вы приходите в if(uart_rd='2') блокировать, buzzer всегда 0 и поэтому if(buzzer!=1) блок всегда вызывается.

Вы пытались пройти через это с помощью отладчика?Подобные вещи можно было бы легко обнаружить.Вы также можете изменить эти if блокирует либо switch заявление или ряд if / else if заявления, чтобы избежать подобных проблем.

Другие советы

Вот работает код:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top