标题: 单片机串口模块的程序用while和if的结果不一样 [打印本页]

作者: 王可乐_    时间: 2020-1-31 21:14
标题: 单片机串口模块的程序用while和if的结果不一样
在郭天祥师傅的视频中,也出现了使用while和if结果不一样的现象,郭天祥师傅说不太清楚为什么,用if的时候都是正确的。举个例子,每次亮一个led,传01的时候P1=0Xfe,02的时候P1=0Xfd;03的时候P1=0Xfb;04的时候P1=0Xf7;用while的话,接收区只能得到第一次传过去的数据,也可以得到没有进入while的数据,比如连续发送 01,02,03,03,06 ,接收区得到 01 06,但是led亮的很正常,传01就亮01的,02就亮02的,是为什么?

单片机源程序如下:
#include<reg52.h>
unsigned char flag,a;

void delay(int a)            //延时1ms函数
{
int i,x;
for(i=0;i<a;i++)
  for(x=0;x<115;x++) ;
}
void main()
{
REN=1;
SM0=0;
SM1=1;
TMOD=0X20;          //定时器方式二
TH1=0XFD;            //3us
TL1=0XFD;
TR1=1;
EA=1;
ES=1;
while(1)
{
  if(flag==1)             //这里是郭天祥师傅碰见的第一处while和if
  {
   ES=0;
   flag=0;
   SBUF=a;              //想在这里接收
   while(!TI);
   TI=0;
   ES=1;
  }
if(a==0x01)           //以下为我碰见的while和if
{
P1=0xfe;
delay(50);
}

if(a==0x02)
{
P1=0xfd;
delay(50);
}
if(a==0x03)
{
P1=0xfb;
delay(50);
}
  if(a==0x04)
{
P1=0xf7;
delay(50);
}
}
}
void ser() interrupt 4                //中断方式5
{
RI=0;
a=SBUF;
flag=1;
}



作者: csmyldl    时间: 2020-2-1 00:53
while(1)循环中接收到falg标记并判断,同时关闭了ES,并把接收数据发送回去后再开启中断ES,在接下来的程序判断a值并点亮其对应的LED灯时,同样可接收发送过来的值存入a(因a是全程变量),所以能说明你所说的"但是led亮的很正常,传01就亮01的,02就亮02的",程序的逻辑错误,应该修改为每接收一个数据进行处理后才允许接收下一次数据,或者一次接收完所有数据,然后对所接收的所有数据进行一次处理后清除数据,这样两种方法均可实现




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1