SBUF, TI/RI, ES

寒假过去一半了,这两天重新开始学习。这里来个小结,51单片机的一些关于串口通信的寄存器/锁存器。

 

首先放上一段代码,来自郭天祥的51单片机教程

功能是:向单片机发送一个字符(比如e),然后单片机返回字符串“ I get e”,串口通信。

#include <reg52.h>

#include <intrins.h>



typedef unsigned char uchar;

typedef unsigned int uint;

uchar flag, a;

uchar code table[]=" I get ";



//串口初始化

void Serial_Init()

{

    TMOD = 0x20;    //设定T1定时器工作方式2

    TH1 = 0xfd;        //T1定时器装初值

    TL1 = 0xfd;        //T1定时器装初值

    TR1 = 1;        //启动T1定时器

    REN = 1;        //允许串口接收

    SM0 = 0;        //设定串口工作方式1

    SM1 = 1;        //同上

    EA = 1;            //开总中断

    ES = 1;            //开串口中断

}

void main()

{



    Serial_Init();



    while(1)

    {

        if(flag)

        {

            uchar i;

            ES = 0;//先关闭串口中断防止干扰

            for(i=0; i<7; i++)

            {

                SBUF = table[i];

                while(!TI);//即等待发送完成,因为发送完成后TI由硬件置位

                TI = 0;//清零以进行下一次发送

            }

            SBUF = a;//串行发送时,CPU向SBUF写入数据,sbuf的容量很大

            while(!TI);

            TI = 0;



            ES = 1;

            flag=0;

        }

    }

}



void ser() interrupt 4        //串口中断,接收,a相当于接收缓存

{

    RI = 0;//接收完成后RI由硬件置1,中断里面清零以进行下一次接收

    a = SBUF;//串行接收时,CPU从SBUF读出数据

    flag = 1;

}

 

 

1.SBUF

引用百科:

全称:serial data buffer
串行数据缓冲器
串行口中有两个缓冲寄存器 SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构 上是完全独立的。它们都是字节寻址的寄存器 ,字节地址均为99H。
这个重叠的地址靠读/写指令区分:串行发送时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,此时99H表示接收SBUF。单片机串口程序参考。
 
    之前学习的时候对SBUF一知半解,只是抄了代码,看了效果。这两天重新学习后得到一些新的认识。
首先是百科中提到的,串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。代码段中 SBUF=a 或者 SBUF = table[i] 都是CPU向SBUF写入数据,同时表示此时是发送状态, a=SBUF 是CPU从SBUF读出数据,同时表示此时是接收状态。也即0x99H这个重叠的地址靠读/写指令区分。
    另外SBUF的容量很大,至少可以放200字节数据(200个字符)
 
2.TI/RI
 
首先是Scon的 百科
SCON (Serial Port Control Register 在51单片机中代表这是串口控制寄存器
scon控制寄存器,它是一个可位寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式如下:
 
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
位地址 9FH 9EH 8DH 9CH 9BH 9AH 99H 98H
其中
TI:发送中断标志位
可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件置0。
RI:接收中断标志位
可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
注:在串口中断处理时,TI、RI都需要软件置0,硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。
 
代码中SBUF = table[i]  即发送后有 while(!TI)  即等待发送完成,因为发送完成后TI由硬件置位,然后 TI = 0  软件清零以进行下一次发送
RI也是一样,进入中断是因为PC通过串口向单片机发送了信息,单片机接收完成后RI由硬件置1, RI = 0 由软件清零以进行下一次接收。
 
3.ES
参考 这里,ES是中断允许寄存器IE的第5位(IE^4),表示 串行口中断允许(ES=1充许,ES=0禁止)。代码中首先ES=0,关闭串口中断防止干扰,先把要发的数据放到SBUF,全部放完后再ES=1,使能串口中断。
 
唔,如果昨晚效率高些就能早点总结完这个然后看can通信的代码了。。这里给自己小结下(其实是参考百科等资料把看懂的表达出来),对下一步有帮助。
 
51和stm32各有长短,stm32给nrf24l01的配置比较麻烦。。
 
嗯,新年快乐,马上快乐~
 
 

你可能感兴趣的:(r)