Не удалось правильно вызвать подпрограмму. Микроконтроллер 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
заявления, чтобы избежать подобных проблем.
Другие советы
Вот работает код:
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
}
.