لا يمكن استدعاء الروتين الفرعي بشكل صحيح لوحدة التحكم الدقيقة PIC18F
-
13-12-2019 - |
سؤال
لدي مشروع لبرمجة المتحكم الدقيق 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.