5825
2022-04-03 21:41
采纳率: 100%
浏览 18

串口中断的if elseif else语句一直都是执行最后

问题遇到的现象和发生背景

程序烧录后,在串口调试助手中发送任何数字,单片机传回的数据都是“Error!”

问题相关代码,请勿粘贴截图

void main()
{        
    inti();     
    while(1)
    {
        if(flag_uart==1)
        {
            flag_uart=0;
            ES=0;
            TI=1;
            switch(flag_on)
            {
                case 0:    puts("Turn on ad!\n");
                            TR0=1;
                            break;
                case 1:    printf("Turn off ad!\n");
                            TR0=0;
                            break;
                case 2:    puts("Error!\n");
                            break;
            }
            while(!TI);
            TI=0;
            ES=1;
        }
        if(flag_time==1)
        {
            flag_time=0;
            ad_val=Read_AD_Data(0x94);
            ad_vo=(float)ad_val*5.0/256.0;
            ES=0;
            TI=1;
            printf("The voltage is %fV\n",ad_vo);
            while(!TI);
            TI=0;            
            ES=1;
        }
        datapros();     //数据处理函数
        display();//数码管显示函数        
    }    
}
void ser() interrupt 4                   //串口中断函数
{
    RI=0;
    a=SBUF;
    flag_uart=1;
        if(a==1)                    
            flag_on=0;                
         else if(a==2)               
            flag_on=1;                    
        else
            flag_on=2;
                  
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

试过将中断函数中的if语句表达改成
if-if-if形式,电脑收到的还是“Error!”。

试过if-else形式,只保留第一句和第二句,将第三句注释掉,收到的是“Turn off ad!”。

试过将if语句改过很多不同的形式都不行。

也试过在中断语句中将if语句改成switch语句控制,结果也不行。

下面尝试了将后两句注释掉,结果在调试窗口里输入任何数字,AD检测都会开启

void ser() interrupt 4
{
    RI=0;
    a=SBUF;
    flag_uart=1;
        if(a==1)                    
            flag_on=0;                
/*        else if(a==2)               
            flag_on=1;                    
        else
            flag_on=2;          */
                  
}

img

我想要达到的结果

想要实现在串口调试助手发送命令“1”,单片机返回“Turn on ad!”,并间隔1秒读取一次电位器的值,然后将值返回给电脑,显示“The voltage is %fV”

“2”是停止,返回“Turn off ad!”

“其他数值”,返回“Error!”

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

2条回答 默认 最新

相关推荐 更多相似问题