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,其结构格式如下:
 
SCONSM0SM1SM2RENTB8RB8TIRI
位地址9FH9EH8DH9CH9BH9AH99H98H
其中
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的配置比较麻烦。。
 
嗯,新年快乐,马上快乐~
 
 

转载于:https://www.cnblogs.com/Cmfvacks-IsLjj/p/3537274.html

  • 15
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值