SBUF寄存器的发送与接收问题。
在单片机中只有一个SBUF,只能接收一次,发送一次,再进行接收吗?如果是,发送数据时如何发送的呢,就是说外部写进SBUF一个数据,我要把这个数据取出来,怎么取?还有接收完...
在单片机中只有一个SBUF,只能接收一次,发送一次,再进行接收吗?如果是,发送数据时如何发送的呢,就是说外部写进SBUF一个数据,我要把这个数据取出来,怎么取?还有接收完8位后,RI是如何自动至1的呢?TI 自动置1又是如何置的呢?谢谢回答
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8 record[]="I has recvived,thanks";
void init()
{
TMOD=0x20;//T1工作方式2
TH1=0xf9;
TL1=0xf9;//装载初值
TI=1;
TR1=1;
SCON=0x50;
EA=1;
ES=1;//打开中断
}
void main()
{
init();
while(1);
}
void re() interrupt 4
{
u16 i;
if(RI==1)
{
for(i=0;i<100;i++)
SBUF=recode[i];
RI=0;
}
while(!TI);
TI=0;
} 展开
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8 record[]="I has recvived,thanks";
void init()
{
TMOD=0x20;//T1工作方式2
TH1=0xf9;
TL1=0xf9;//装载初值
TI=1;
TR1=1;
SCON=0x50;
EA=1;
ES=1;//打开中断
}
void main()
{
init();
while(1);
}
void re() interrupt 4
{
u16 i;
if(RI==1)
{
for(i=0;i<100;i++)
SBUF=recode[i];
RI=0;
}
while(!TI);
TI=0;
} 展开
2个回答
2018-07-15
展开全部
追问
理论上同时收发?两个寄存器占用了同一个地址,保存在这里的数据只能同时为发送或者接收的啊,你说的我不太明白唉。。。TI和RI我知道是硬件置位。。
展开全部
51单片机的串口通信,是全双工的,就是可以同时收/发的,互相不影响的。
但是,对于接收或发送,确实是接收到一个字节以后才能接收下一个,不可能同时接收几个。对于送,也是同样的,发送一个字节数据后,要等发送完成了,才能再发下一个。
接收和发送,可先定义一两个变量,如,接收用rec变量保存,发送数据在send变量中。
发送时,SBUF=send;while(TI==0);TI=0;//这是用查询方式发送的。当一个字节的数据发送完成后,就会自动置TI=1,所以,可以查询TI=1时,就说明是发送结束了。如果是允许中断,就是会产生中断,判断TI=1,就是发送中断,要用指令清0,就是TI=0;
接收时, 当收到一个数据后,也会自己置RI=1,通常,接收都是中断方式,所以, 当RI=1, 就会产生中断。而响应中断,执行中断程序,就要用指令清0,即中断中判断是RI=1,说明是接收中断,RI=0; 清除RI。
接 收数据:rec=SBUF; 就行了。如果是接收一组数据,可以定义一个数组,用数组保存接收一组数据就行了。
但是,对于接收或发送,确实是接收到一个字节以后才能接收下一个,不可能同时接收几个。对于送,也是同样的,发送一个字节数据后,要等发送完成了,才能再发下一个。
接收和发送,可先定义一两个变量,如,接收用rec变量保存,发送数据在send变量中。
发送时,SBUF=send;while(TI==0);TI=0;//这是用查询方式发送的。当一个字节的数据发送完成后,就会自动置TI=1,所以,可以查询TI=1时,就说明是发送结束了。如果是允许中断,就是会产生中断,判断TI=1,就是发送中断,要用指令清0,就是TI=0;
接收时, 当收到一个数据后,也会自己置RI=1,通常,接收都是中断方式,所以, 当RI=1, 就会产生中断。而响应中断,执行中断程序,就要用指令清0,即中断中判断是RI=1,说明是接收中断,RI=0; 清除RI。
接 收数据:rec=SBUF; 就行了。如果是接收一组数据,可以定义一个数组,用数组保存接收一组数据就行了。
更多追问追答
追问
也就是说我接收了一个字节后必须发(取)出去,才能进行下一个字节的接收吗?因为SBUF只有一个字节的存储量。其他的基本明白了,但是对于RI和TI的硬件置1还是不太清楚,是电路设计让它完成一个字节的接收或者发送就置1了吗?
还有如果我进行多个字节数据的接收或发送是不是得用循环语句,让它处于不断的自动置1和软件清零状态?
能不能看一下这段代码哪里有问题?~功能是当上机接收到数据上,反馈“I has received,thanks”
追答
SBUF中不能存放数据,收到后必须立即读取,否则,下一个数据到了就被替代了。RI和TI置1,是硬件自动的,就是这么设计的,想改也改不了的。
多个字节发送和接收,可以用循环控制次数。至于那代码,要另
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询