单片机串口传送 晶振是24M的除了9600波特率,其他波特率均不能正常显示在串口调试助手里

#include<reg52.h>

void main(void)
{
RCAP2H=(65536-11059200/32/14400)>>8;
RCAP2L=(65536-11059200/32/14400)&0Xff;
T2CON=0X34;
SCON=0X50;
ES=1;

EA=1;

while(1);
}
unsigned char temp;
void serial_int(void) interrupt 4
{
if(RI)
{
RI=0;
temp=SBUF;
SBUF=temp;
while(!TI);
TI=0;
}
}
单片机串口传送 晶振是24M的除了9600波特率,其他波特率均不能正常显示在串口调试助手里,换成11.0592的我试了一下9600 和14400能传送,其他的也不能正常显示,为什么呢?高手们给指点一下

51单片机,用12或24MHz的晶振,串口通信时波特率误差是很大的啊!比如24MHz时,单片机定时器实际使用的信号频率是2MHz,用T2定时器做波特率发生器产生9600的波特率,得到的参数是6.51,所以你取65530或者65529时误差都大的惊人,得到的实际波特率是10416和8928。

要想得到准确的9600波特率,只能选用11.0592、18.432或者22.1184这样的晶振。追问

用11.0592 除了9600波特率也不能正常回传到串口调试助手啊,请问为什么呢

追答

你的程序有问题!
SBUF=temp;
while(!TI);
TI=0;
在中断里还使用查询方式发送数据?

追问

发送用查询 接收用中断,这个没问题的,现在的问题是为什么换别的波特率就不能正常发送

追答

那再仔细看T2作为波特率发生器时的注意事项了,我试验的还没遇到这种问题。

追问

改成T1也一样的,你可以把程序放你的单片机里看看

追答

中断程序的写法;
void serial_int(void) interrupt 4
{
if(RI)
{
RI=0;
//其他程序
}
if(TI)
{
TI=0;
//其他程序
}
}

如果波特率高的时候通信不正常,那就只有怀疑MAX232的电路有没有问题了。我以前遇到过,如果MAX232用的电容偏小,高波特率的通信就不成功。一般电容用1uF。

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