问题遇到的现象和发生背景
程序烧录后,在串口调试助手中发送任何数字,单片机传回的数据都是“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;
}
运行结果及报错内容
我的解答思路和尝试过的方法
试过将中断函数中的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; */
}
我想要达到的结果
想要实现在串口调试助手发送命令“1”,单片机返回“Turn on ad!”,并间隔1秒读取一次电位器的值,然后将值返回给电脑,显示“The voltage is %fV”
“2”是停止,返回“Turn off ad!”
“其他数值”,返回“Error!”