无法正确调用子程序微控制器PIC18F

时间:2012-05-22 10:44:23

标签: c embedded microcontroller microchip mikroc

我有一个编程微控制器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
}

可以请任何人帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您在buzzer块之外将if(uart_rd='0')设置为0。因此,当您来到if(uart_rd='2')块时,buzzer始终为0,因此始终会调用if(buzzer!=1)块。

您是否尝试使用调试器来完成此操作?它会很容易地显示出这种东西。您还可以将这些if块更改为switch语句或一系列if / else if语句,以避免出现这类问题。

答案 1 :(得分: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,
 {
  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
}