51串口发送的数据是FF,返回来的却是FE,一直弄不明白怎么回事?

#include<reg52.h>#defineucharunsignedcharuchartable[3]={0};ucharword[]="Iget";uchari,... #include<reg52.h>
#define uchar unsigned char
uchar table[3]={0};
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<4;j++) //循环发送接收的数据
{
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;
if(num==3) //判断是否接收到两字节数据
flag = 1;
}

void Com_Init(void) //串口设置及初始化
{
TMOD = 0x20; //定时器1工作方式2
PCON = 0x00; //串口单倍率
SCON = 0x50; //串口工作在方式1
TH1 = 0xFa; //设置波特率 9600
TL1 = 0xFa;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
num = 0;
flag = 0;

}
这个程序想用来接收串口输入的字符串的亲,用串口调试助手发送16进制FF,返回来的却是FE,一直不知道怎么回事?
展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏20(财富值+成长值)
听虫鸣数星星
2016-08-29
知道答主
回答量:1
采纳率:100%
帮助的人:1.8万
展开全部

‍1.收到FE应该是波特率的问题,按你原来T1的溢出率计算,你用的晶振应该是28.8MHZ。如果用11.0592MHZ的晶振定时器初值应该为0xfd。
2.原来的程序修改如下(经测试无误,末尾有说明):
#include<reg52.h>
#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)串口调试助手测试结果:

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式