找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1134|回复: 1
打印 上一主题 下一主题
收起左侧

单片机串口模块的程序用while和if的结果不一样

[复制链接]
跳转到指定楼层
楼主
ID:685478 发表于 2020-1-31 21:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在郭天祥师傅的视频中,也出现了使用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;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表