关于51单片机串口通信的问题,谢谢解答,代码如下

发送的数据和接收的数据有时候不一致,我发送ad,有时候会变成a5,发送7f,会变成ff,而有的时候又正常,波特率我设置的是9600,我用了两个串口调试工具都会出现这样的情况,请大神解答,谢谢
#include<reg51.h>
unsigned char flag,a;
/*
查询法
*/
void main()
{
TMOD=0x20; //设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd; //设置初值,方式2,波特率9600
TR1=1; //打开定时器1,才有波特率
REN=1; //串口允许接收
SM0=0;
SM1=1; //方式1,10位异步收发器
EA=1; // 开总中断
ES=1; //开串行口中断
while(1)
{
/*
if(RI==1)
{
RI=0; //软件清理RI,否则无法接收数据
P2=SBUF; //SBUF就是接收到的数据
//串口调试助手的波特率也要改为9600
}
*/
if(flag==1) //flag为1说明接收到了数据
{
ES=0; // 关闭串行口中断
flag=0;
SBUF=a; //将a赋给接收缓存
while(!TI); //数据接收完之后,TI会置为1
TI=0;
ES=1;
}

}
}

void ser() interrupt 4 //串口中断
{
RI=0;
P2=SBUF;
a=SBUF;
flag=1;
}

你这是在实验板上做的测试吗,关键的是实验板上的单片机所配晶振频率是多少的,你看了吗,出现这种情况多是因为晶振频率是12M的,而你的程序是按11.0592M 计算出的时间常数,或者按12M的计算。可是,串口通信时的晶振频率是不能用12M的,因为这个频率计算出的时间常数是有误差的,因此,波特率就有误差,也电脑的波特率不一致。
晶振频率必须是11.0592M,或者是2倍的。否则通信就不对。追问

实验板子是11.0592M的晶振,以11.0592M计算的波特率是9600,不知道哪里出错了,有时候正常有时候不正常,是否因为下载程序设置的最小波特率的问题?代码在上面贴出来了

追答

你程序中有P2=SBUF; 这P2口是8个LED吗?

这样,可以通过这8个LED显示接收的数据对不对呀,这样就可以查出是接收错误,还是发送错误。
如果接收的数据与电脑发送的一样,那就是单片机发送时产生错误了。
你的程序没有问题,问题还是出在实验板上的。这与下载程序设置的最小波特率没有关系。

不知道这个实验板是买的,还是你自己焊接的,自己焊接的话,就可能是实验板上焊接质量不好,工作不稳定,查找一下板子有问题。
要是买的,那可能是USB转串口线工作不稳定。
总之,要从硬件上查原因。
下载程序时,把那个 降低振荡器的放大器增益 一项打上勾试下吧。

追问

谢谢解答,还想请教一下,板子应该没问题,我把代码定时器的初值改了一下就正常了,但是我通过那个波特率初值计算工具计算出来的初值不一样,这是怎么回事呢?

追答

程序中的定时器的初始值0xfd 就是11.0592M晶振频率,9600波特率对应的值,没有错。
你改了定时器的值是多少?如果不是0xfd,要么你的晶振频率不是11.0592M。

温馨提示:答案为网友推荐,仅供参考
相似回答