51单片机中两个 SBUF物理上独立,共同占用同一地址,那么一个单片机能不能同时收发数据呢

作者&投稿:逮炭 (若有异议请与网页底部的电邮联系)
51单片机的SBUF是干嘛的,51单片机有几个SBUF,要是有好几个,怎么地址都是99H~

1、51单片机的SBUF是用串口通信时,进行发送和接收的数据缓存器。用户将发送数据写入SBUF当中,就可以通过串口发送出去。而从串口接收到的数据也暂存在SBUF中,数据接收完后可从SBUF中读出。
2、51单片机物理上共有2个SBUF,1个接收SBUF和1个发送SBUF。虽然2个SBUF地址是相同,但物理上是分开的,单片机在接收和发送时硬件会自动识别SBUF。
3、两个SBUF地址是一样的,但是读数据的时候单片机机自动选择接收SBUF,而发送的时候自动选择发送SBUF。

单片机入门-C51语言用单片机串口实现双向数据收发的双机通信视频教程如下:
视频教程
一、单片机串行口简介
串行通信是指构成信息的二进制字符的各位数据一位一位顺序地传送的通信方式,串行通信又分为两种基本通信方式,即异步通信和同步通信。
AT89C51串行口,主要由发送器、接收器和串行控制寄存器组成。串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。代码段中SBUF = table[i] 都是CPU向SBUF写入数据,同时表示此时是发送状态, temp=SBUF 是CPU从SBUF读出数据存放在temp变量,同时表示此时是接收状态。也即0x99H这个重叠的地址靠读/写指令区分。
二、用单片机串口实现双工方式的双机通信硬件电路设计:
用单片机串口实现双工方式的双机通信,简单起见,这里两块单片机都具有收发功能,它们具有相同的电路,双机互相发送0~9,各自在数码管上循环显示。设计电路图如下:
双工通信
三、用单片机串口实现双工方式的双机通信软件设计:
软件编写的设计步骤如下:
1.设置通信速度(定时器TMOD/TH/TL/TR)
9600bit/s 11.0592MH
2.利用串口发送数据
(1)设置SCON
(2)发送数据放在SBUF
(3)查询TI,TI=1则清0,TI=0则等待
3.利用串行中断来接收数据:
(1)设置SCON,允许接收
(2)设置中断ES/EA
(3) 编写中断函数,完成设定的任务。
4.总体代码如下:
#include
#define uchar unsigned char
#define uint unsigned int
uchar code buff[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay_1s(void)
{
uint i;
for(i=50000;i>0;i--);
}
void serial() interrupt 4 using 1
{
ES=0;
RI=0;
P0=SBUF; //用P0口驱动LED数码管
ES=1;
}
void main()
{
uchar i;
TMOD=0X20;//0X20=B(0010,0000),定时器1工作在方式2
TH1=0XFD;
TL1=0XFD;//设置初值为253,两机的波特率就是9600bit/s
SCON=0X50;//0x50=B(0101,0000) ,串口工作在方式1,允许接收
EA=1;//使能总中断
ES=1;//开启串行口中断
RI=0;
TR1=1;//启动定时器1
while(1)
{
for(i=0;i<10;i+

1、首先,51指令执行属于是依次执行的,读写不会同步,执行读的时候不会是写,执行写的时候不会是读;
2、串口双工是指读写都是可以通过该口实现,但是,51的读写串口是要对串口进行定向的,这也决定串口不会是真正意义上的同时。
不过,可以通过程序设计,实现一个串口的读写自动化,希望可以帮到你!

单片机不能同时收发数据,但是你同时给它并不会出错。因为串口的中断是软件复位的。

从单片机的中断程序看:

void burabura(void) interrupt4
{
if(TI) TI=0;

if(RI) RI=0;

}

TI,RI任意一个是1,中断就启动了,而在启动的时候,由于在中断程序里面,而且TI,RI

还未被复位,中断没有消掉,所以这个时候再收或者发是办不到的。也就是说,中断

里面一次只能完成一次收或者发。

因此,对用户来说,你可以同时给他发给他收。他自己会错开任务的。