لا يمكن استدعاء الروتين الفرعي بشكل صحيح لوحدة التحكم الدقيقة 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 تصريحات لتجنب هذا النوع من القضايا.

نصائح أخرى

هنا هو رمز التشغيل:

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top