51单片机串口接收错误,发一串固定字符串,接受的也是固定的,只是接受错误,怎么办?

用伟福仿真器,晶振12MHz,波特率2400bps。
void serial_Init(void) //模式1,8位自动重装,2400bps,12MHz
{
SCON=0x50;//串口工作方式为1,SCON允许串口接收位REN置1
TMOD=0x20;//工作方式控制寄存器TMOD,控制定时器1工作在模式2,8位自动重装
TH1=0xF3; //定时计数器1高8位
TL1=0xF3; //定时计数器1低8位,设置T1的溢出率
TR1=1;//定时控制寄存器TCON中的运行控制位,置1表示计数器1启动工作
ES=1;//打开串口中断
EA=1;//允许中断
RI=0;
TI=0;
}
uchar data Send_string=0;//接收数据完成标志,1表示完成
uchar data len=0;
uchar data N;
uchar data b;
sbit Pin=P0^6;//管脚P0^6用作通讯显示
com_interrupt(void) interrupt 4 //串口中断子程序
{
Pin=0;//通讯指示灯亮
if(RI)
{
RI = 0;
b=SBUF;
if((b==0xBB)&&(len==0))//接收开始符为0xBB的数据
{
temp[0]=b;//将开始符赋给temp[0]
}
else//继续接收开始符0xBB后的数据
{
len++;
temp[len]=b;
if(len>6)
{
if((b==0xDD)&&(len>=temp[6]+8))//收到结束符且数据长度为 //(temp[6]+8)时,结束接收
{
N=len;//传递数据长度,数据长度为(N+1)
len=0;//置0,便于下一次接收
Send_string=1;//接收完成标志
}
}
}
}
Pin=1;//通讯指示灯灭
}
当以16进制发送:BB 00 00 00 01 21 05 01 00 77 55 00 01 AF DD时,接收刚开始始终是22 FF FF FD BD F5 FD FF 11 55 FF FD A1 11 07,后来变成22 FF FF FD BD F5 FD FF 11 55 FF FD A1 11 。本人初学51C语言,请教高手真是为什么呢
谢谢大家的热心帮忙,问题解决了

12M可以达到这个波特率...
查一下硬件跟软件的搭配..有必要的话降速测试
或是把接收资料取反...
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-16
楼主:12M的晶振 是不行的!!要11.0592MHZ啊!

你最好看看串口通讯里波特率跟晶振之间的关系。我回答你这个错误第三次了。
第2个回答  2010-09-16
检查一下波特率
相似回答