打印

关于51串行通信的一个细节问题!

[复制链接]
1430|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
junwei05|  楼主 | 2012-5-27 08:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想做个小实验,就是用串口调试助手发一个数据给单片机,单片机把这个数据通过P0显示出来,单片机再把这个数据返回给PC!各位大大请看下面小程序:#include "reg52.h"
unsigned char aa;
void main()
{
SCON = 0x50;
//PCON |= 0x80;
TMOD = 0x20;
TH1 = 0xe8;
TL1 = 0xe8;
TR1 = 1;

while(1)
{
  if(RI==1)
  {
   RI = 0;
   P0 = SBUF;   
   SBUF = P0;
   while(!TI);
   TI = 0;
  }
}
}
这个小程序能可以通过串口助手正常发送数据到单片机,P0也能正常输出数据,但就是不能正常返回一个数据给PC,返回的数据全是FF,(发送和返回的数均为16进制数)虽然未能找出具体原因,估计和直接操作寄存器有关,请各位大大指点一二,说出具体原因还是我的操作有误,谢谢!
     但若把程序改为如下:
#include "reg52.h"
unsigned char aa;
void main()
{
SCON = 0x50;
//PCON |= 0x80;
TMOD = 0x20;
TH1 = 0xe8;
TL1 = 0xe8;
TR1 = 1;

while(1)
{
  if(RI==1)
  {
   RI = 0;
   P0 = SBUF;
   aa = SBUF;
   
   SBUF = aa;
   while(!TI);
   TI = 0;
  }
}
}
程序能正常发送和返回一个数据,发送和返回的都是同一个数据,不再是FF;两个程序供各位大大参详及指正!谢谢!

相关帖子

沙发
chenluck| | 2012-5-27 19:36 | 只看该作者
(1)第一个程序的问题是,你写入P0口的数据,与从P0口回读的数据可能会不一样的,并且会因为你P0口的变化而影响回读的数据.
(2)你的第二个程序也是有问题的,SBUF不应读两次的,可以使用如下:
aa=SBUF;
P0=aa;
SBUF=aa;

使用特权

评论回复
板凳
天风立马| | 2012-5-27 23:10 | 只看该作者
学着用用中断。程序大了,这样会很乱。把程序分模块,该干啥的干啥。留个接口就可以了。

使用特权

评论回复
地板
天风立马| | 2012-5-27 23:12 | 只看该作者
学着用用中断。程序大了,这样会很乱。把程序分模块,该干啥的干啥。留个接口就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

37

帖子

1

粉丝