• 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的配置比较麻烦。。
     
    嗯,新年快乐,马上快乐~
     
     
  • 相关阅读:
    mysql分区
    schema设计
    MYSQL索引
    innodb事务锁
    EXTJS4.2——2.Hellow World
    什么是DOM?
    .net制作窗体
    “System.Runtime.InteropServices.COMException”/ 其他信息: ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111
    github下载文档并修改,上传文档
    HTML 介绍标准格式
  • 原文地址:https://www.cnblogs.com/Cmfvacks-IsLjj/p/3537274.html
Copyright © 2020-2023  润新知