发送的数据和接收的数据有时候不一致,我发送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;
}
实验板子是11.0592M的晶振,以11.0592M计算的波特率是9600,不知道哪里出错了,有时候正常有时候不正常,是否因为下载程序设置的最小波特率的问题?代码在上面贴出来了
追答你程序中有P2=SBUF; 这P2口是8个LED吗?
这样,可以通过这8个LED显示接收的数据对不对呀,这样就可以查出是接收错误,还是发送错误。
如果接收的数据与电脑发送的一样,那就是单片机发送时产生错误了。
你的程序没有问题,问题还是出在实验板上的。这与下载程序设置的最小波特率没有关系。
不知道这个实验板是买的,还是你自己焊接的,自己焊接的话,就可能是实验板上焊接质量不好,工作不稳定,查找一下板子有问题。
要是买的,那可能是USB转串口线工作不稳定。
总之,要从硬件上查原因。
下载程序时,把那个 降低振荡器的放大器增益 一项打上勾试下吧。
谢谢解答,还想请教一下,板子应该没问题,我把代码定时器的初值改了一下就正常了,但是我通过那个波特率初值计算工具计算出来的初值不一样,这是怎么回事呢?
追答程序中的定时器的初始值0xfd 就是11.0592M晶振频率,9600波特率对应的值,没有错。
你改了定时器的值是多少?如果不是0xfd,要么你的晶振频率不是11.0592M。