51单片机串口通信学习

本文详细介绍了51单片机串口的内部结构,包括TXD和RXD管脚的功能、SBUF数据缓存区的作用、波特率的定时器机制以及串口工作方式(0-3)。特别强调了中断在串口通信中的关键作用和波特率与数据接收量的关系。
摘要由CSDN通过智能技术生成

串口内部结构

3ff3ae95c10f46f19325f516610626a6.png

TXD和RXD是单片机的两个串口管脚

TXD对应P3.1的副用功能

RXD对应P3.0的一个附加功能

对P3.0和P3.1进行相应的配置就可以实现串口功能

SBUF数据缓存区,接受和发送数据都存储在SBUF

波特率由TH1、TL1产生

TH1、TL1是定时器定时器1的一个功能

SMOD来控制倍频,如果倍频的话要把相应的值除以二

例如接收数据

RXD接收数据--通过移位寄存器--存储到SBUF--然后相应的接接收中断标志RI置为1--然后向cpu发送请求中断,执行中断

发送数据

SBUF里的数据发送到--控制门--由发送控制器T1(同时T1置1向cpu发送请求中断并执行)控制控制门--由TXD管脚发送出去

 

串口相关的寄存器

(1)串口控制寄存器SCON

b546bebb5d2c474fa4f5810cc005b7aa.png

SM0和SM1来控制串口通信的工作方式(四种)

待会分开细说

SM2多机控制位;当SM2=1时,支持多机通信(就是TXD和RXD可以链接多个串口设备)主要用于方式2和方式3,此时RB8控制是否激活RI(接收中断)比如RB8=0时,表示不激活RI,如果为1则接收到的数据进入SBUF并激活R1=1;当SM2=0时不论RB8等于几RI均可以接收到数据并激活,比如用方式1时不用多机通信时,可以将SM2=0;如果要实现多机通信也可以使用软件层面来实现

REN是允许接收位,由软件置1,串行口接收数据,0时禁止接收

TB8和RB8是方式2和方式3用来发送数据的第9位,可以用软件来规定其第9位的作用,方式0和方式1是不用这两个的,因为只有8位数据

TI是发送中断标志位,在方式0时第8位数据发送结束的时候或者其他方式串行发送停止位,开始位的时候TI硬件置1向cpu请求中断,再发送下一次数据之前需要软件清0

RI是接收中断标志位,在方式0时第8位数据接收结束时或者在其他模式接收数据期间RI硬件置1向cup发送一个中断申请,也必须下一次接收数据前在中断服务程序中软件清0

(2)电源控制寄存器PCON

f83f791980c84e05a2c1221550b884b8.png

 只用到了第8位

SMOD主要是对倍频的选择=1时倍频=0时不倍频

串口方式1、2、3时波特波特率和SMOD倍频值有关,波特率提高一倍当SMOD=1时

串口通信方式详细介绍

 

1、方式0(同步移位的输入输出方式)

主要用来扩展并行输入输出口,数据由RXD进行输入和输出的,同步移位脉冲由TXD即P3.1引脚接收,波特率固定为fosc/12(就是晶振/12)97a8672623974796a7dbb4f180a59934.png

2,方式1(10位数据的异步通信口)最常用

TXD是发送引脚,RXD是接收引脚 

306c4e14e092472d9f7e9f39244e1c75.png

 第1是起始位,最后一位是停止位,中间8位数据

异步通信由TH1来产生波特率,在波特率下TXD发送数据(由低位到高位)发送完停止位后T1硬件置1下一次发送之前需要软件清0,接收也是和发送一样,但这里的位采样脉冲就是波特率(由TH1和TR1的值来设置)

REN接收使能位为1,接收位就会进行波特率的一个16倍的采样

3、方式2和方式3(11位的异步数据通信)

TXD发送引脚,RXD为接收引脚(有9位数据)与方式1不同的是第9位是RB8/TB8639a2c3d139d4aa19446d6f12477b71e.png

 前8位数据存储在SBUF第9位放在RB8,

如果RB8=1,前8位数据存储在SB8,如果RB8=0则丢弃前8位的数据

波特率的计算方法

44dc32d182454389a2694d8ae6eba068.png

这里不是2的SMOD次方

T1的溢率 

d24fc77ca3ee47029effbd59553f83d5.png

 

2441fc09c5bf4d528a7aa2a80298c5f4.png 

71b05c5f776349f5ac87b2833452fffe.png 

20b7874dc1ed40a991202066b8abcacd.png 

#include <STC89C5xRC.H>
void UartInit(int i)
{
    SCON=0x50;   //0101 0000   串口方式1
    TMOD|=0x20;  //0010设置定时器1,方式2(8位自动重载)
    TH1=i;     //设定定时器初值
    TL1=i;
    PCON =0x80; //1000 0000SMDO  打开倍频
    TR1=1;  //打开定时器
    EA=1;   //打开总中断
    ES=1;   //打开串行通信中断
}
void main()
{
    UartInit(0xFA);
    while(1)
    {
        
    };
    
}

void Uart() interrupt 4
{
  int receive =0;
    RI=0;
    receive =SBUF;
    SBUF = receive;
    while(!TI);
    TI =0;
    
}

后面的内容可以不看

最后也是我自己的问题;在我学习时,容易把定时器的TH1和TL1的计数,和串口里面的波特率混在一起

在 51 单片机中的串口通信中,波特率是用来确定数据传输速率的参数。波特率表示每秒传输的比特数。当波特率设置为每溢出一次就每输入一个数据时,意味着每当串口中断发生(溢出)一次,就会接收一个数据。

在 51 单片机中,串口通信通常使用中断方式进行数据的接收和发送。当接收缓冲区中有新的数据到达时,会触发串口中断,通过中断服务程序将数据从接收缓冲区读取出来。所以波特率的设置并不直接决定每次中断接收到的数据量,而是表示每秒能够传输的比特数。

具体每次中断接收到的数据量取决于中断服务程序的实现和数据的发送频率。如果发送端每秒发送多个数据,而中断服务程序及时处理每个中断,那么每次中断可能会接收到多个数据。反之,如果发送端每秒只发送一个数据,或者中断服务程序无法及时处理每个中断,那么每次中断可能只接收到一个数据。

因此,波特率的设置并不直接决定每次中断接收到的数据量,而是影响整体的数据传输速率

 

 

 

 

 

 

 

 

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值