51单片机查询法做串口通信数据错误,求大神帮忙看看程序哪里出问题了?

需要实现的功能为:开机后通过P0口控制8个LED中最低位的LED亮,其它LED熄灭;通过电脑向单片机发送数据,单片机接收到数据后通过P0口控制8个LED显示。
实验现象:开机后,8个LED显示不正常,为全亮;串口发送数据后,低4位LED显示正常,高4位LED显示不正常。

#include<reg52.h>

sbit LE=P3^1;

void Set_seri();

void main()
{
LE=1;
P0=0x10;
LE=0;
P2=0xff;
Set_seri();

while(1)
{
if(RI==1)
{
RI=0;
LE=1;//锁存器控制
P0=SBUF;
LE=0;

}

}
}

void Set_seri()
{
TMOD=0x20;//设置定时器1为工作方式2(8位自动重装)
TH1=0xFD;//设置波特率为9600,计算出初值为0xFD
TL1=0xFD;//设置波特率为9600,计算出初值为0xFD
REN=1;
SM0=0;
SM1=1;
TR1=1;
}

你这是仿真吧?还是实物开发板?要是仿真,程序要改一下。另外,是在P0接一片74HC573吗?因为你的程序中用了LE锁存控制位。这些都不说清楚,就问错误在哪。按仿真,573锁存,修改程序如下
#include<reg52.h>
sbit LE=P2^1;//P3.1做串口通信,不能再用锁存,必须改成其它脚
void Set_seri();
void main()
{
P0=0x01;//这才是最低位亮
LE=1;
LE=0;
P2=0xff;
Set_seri();

while(1)
{
if(RI==1)
{
RI=0;
P0=SBUF;
LE=1;//仿真时573锁存必须这么写
LE=0;

}

}
}

void Set_seri()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
SCON=0x50;//必须这么写,不能分开写
TR1=1;
}追问

你好,我这是实物开发板,P0接了一片74HC573锁存器,用LE来控制。按您指导修改程序后,单片机上电后LED显示正常,但发送数据后高4位显示不正常,我查了下单片机原理图,可能是晶振频率的影响,单片机上外接的12M晶振,但是软件中是按照11.0592M计算的初值。另外请教下,SCON分开赋值后,开机LED就全亮,显示不正常,SCON为什么不能分开赋值呢?谢谢!

追答

晶振是12M的,应该按12M计算初始值,但都有误差。

波特率只能选2400或1200,误差最小,可以保证正常串行通信。

关于SCON=0x50,分开赋值,因其中的RI未置0,可能是1,就误以为收到数据了,执行了P0=SBUF,但是错误的。

如能解决问题,请及时采纳。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-03-28
需要实现的功能为:开机后通过P0口控制8个LED中最低位的LED亮,其它LED熄灭;通过电脑向单片机发送数据,单片机接收到数据后通过P0口控制8个LED显示。 实验现象:开机后,8个LED显示不正常,为全亮;串口发送数据后,低4位LED显示正常,高4位LED显示不正常。 #include sbit LE=P3^1; void Set_seri(); void main() { LE=1; P0=0x10; LE=0; P2=0xff; Set_seri(); while(1) { if(RI==1) { RI=0; LE=1;//锁存器控制 P0=SBUF;//SBUF: LE=0; } } } void Set_seri() { TMOD=0x20;//设置定时器1为工作方式2(8位自动重装) TH1=0xFD;//设置波特率为9600,计算出初值为0xFD TL1=0xFD;//设置波特率为9600,计算出初值为0xFD REN=1; SM0=0; SM1=1; TR1=1; }
第2个回答  2019-03-28
我哭的也不太好亲一个抽另一个洗了毕业玩过忑了课余科目来来来追答

这个问题你得自己解决啊我也不是特别饿清楚的你说怎么办那把。

相似回答