1.收到FE应该是波特率的问题,按你原来T1的溢出率计算,你用的晶振应该是28.8MHZ。如果用11.0592MHZ的晶振定时器初值应该为0xfd。
2.原来的程序修改如下(经测试无误,末尾有说明):
#include
#define uchar unsigned char
uchar table[2]={0}; //两个字节应该为2
uchar word[]="I get";
uchar i,j,num;
bit flag; //????????????
void Com_Init(void);
void main(void) //???
{
Com_Init(); //???
while(1) //????
{
if(flag==1) //????????
{
ES = 0;
for(i=0;i<6;i++) //???? I get
{
SBUF = word[i];
while(!TI);
TI = 0;
}
for(j=0;j<2;j++) //????????? //4改成2,两个字节
{
SBUF = table[j];
while(!TI);
TI = 0;
}
j=0;
i=0;
ES=1;
flag=0;
}
}
/*if(flag==1) //?????????
{
ES=0;
flag=0;
SBUF=P1;
while(!TI)
TI=0;
ES=1;
} */
}
void serial(void) interrupt 4 //??????
{
RI = 0;
table[num] =SBUF;
num++; //建议把num++放到外边
if(num==2) //???????????? //存储2个字节
{
num=0; //原程序未清零
flag = 1;
}
}
void Com_Init(void) //????????
{
TMOD = 0x20; //???1????2
PCON = 0x00; //?????
SCON = 0x50; //???????1
TH1 = 0xFd; //????? 9600 //11.0592MHZ晶振应设置为0xfd
TL1 = 0xFd;
TR1 = 1; //?????1
ES = 1; //?????
EA = 1; //????
num = 0;
flag = 0;
}
—————————————————————分割线————————————————————————
说明:
1)程序按原程序备注“//判断是否接收到两字节数据”进行修改。功能为接收两个字节数据后再发送回去;
2)修改的地方在备注进行了说明。原程序备注我复制后都成了“???”;
3)因为发送的第一个字符串“I get”为ASCII码,所以“串口调试助手”应以ASCII码的形式显示其接收到的数据。此时若发送FF,则没有对应的ASCII码字符,所以测试时发送的是十六进制数“41 42”,对应ASCII码“AB”。
4)串口调试助手测试结果: