无法正确调用子例程微控制器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
块要么到a 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
}
. 不隶属于 StackOverflow