关于51单片机串口通信的相关知识(寄存器)

article/2025/10/14 19:19:35

一、51单片机串口概念

1、51单片机的串行口

        51单片机的串行口是一个可编程全双工的通信接口,具有UART(通用异步收发器)的全部功能。

 2、51单片机的硬件连接

        简单双向串口通信有两根数据通信线:

        发送端TXD(Transmit Data)

        接收端RXD(Receive Data)

        TXD和RXD要交叉连接

3、51单片机串口通信的基本结构

        51单片机的串行口主要是由两个独立的串行数据缓存器SUBF(一个发送缓存寄存器,一个接收缓存寄存器)和发送控制器、接收控制器、输入移位寄存器及若干控制门电路组成。串行口的基本结构如图所示:

关于SUBF:串口数据缓存寄存器,物理上是两个独立的寄存器,但是占用相同的地址。写操作时,写入的是发送寄存器;读操作时,读出的是接收寄存器。

①:接收端:数据通过RXD接收引脚,再通过移位寄存器将数据转存到接收寄存器中

②:发送端:讲数据从发送寄存器中移出,通过TXD发送引脚将数据发送出去

③:波特率:通过设置定时器1的初值,获取T1溢出率,通过SMOD模式的设置求取波特率

④:中断:通过发送中断标志位或接收中断标志位是否被置位,判断是否进入串口中断程序,在接收数据完成后,会将RI置位,产生一个接收中断;在发送完成后,会将TI置位,产生发送中断

4、传播速率——比特率

         比特率是指每秒传送的比特(bit)数。单位为bps(bit per second)也可表示为b/s,比特率越高,单位时间传送的数据量(位数)越大。

5、波特率

        在串口通信中,收发双方对发送或接收数据的速率有约定,即双方要有相同的波特率,我们可以通过编程对单片机串行口设定4中工作方式:

 其中,T1的溢出率 = 1/T1溢出的时间

①:关于定时器1方式的选择

        在说选取定时器1方式之前插一句:这里的定时器1方式2不是串口那4中方式中的方式2;

        在学习定时器的相关知识的时候,我们知道定时器有4种不同的工作方式,在串口通信的实验中,我们选择的是定时器1的工作方式2;

 定时器T1工作于方式0:溢出所需周期数=8192-x 

定时器T1工作于方式1:溢出所需周期数=65536-x

定时器T1工作于方式2:溢出所需周期数=256-x

为什么不选择定时器1的工作方式1:

如果我们使用定时器1的工作方式1在中断中装初值的方法来T1溢出率的话,在进入中断、重装值、出中断这个过程中很容易产生时间上的微小的误差,当多次操作时微小的误差不断累积,终会产生错误;

为什么选择定时器1的工作方式2:

因为方式2为自动重装初值的8位定时器/计数器模式(自动重装载就是在定时器溢出后自动装入设定的初值,这样的好处当然是显而易见的,不需要在中断服务器里手动赋值了,所以可以精确的定时)所以用它来做波特率发生器最恰当。

②:波特率的计算

        在上面介绍串口四种方式的时候提到了波特率的计算公式,由公式可以看出,串口方式0和方式2的波特率是固定的;方式1和方式3的波特率是可变的(根据定时器T1的溢出率来控制)

话不多说,根据题来理解:

根据已知波特率,如何计算定时器1方式2下计数寄存器中的初值:

已经波特率 = 9600,系统的晶振频率 = 12Mhz,求给TH1和TL1的初值:

 由此可见,当系统的晶振频率为12Mhz时,定时器的初值不是整数;经过计算可得,当晶振频率为11.0592Mhz时,(256-x) = 3;

当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。

6、波特率与比特率关系与区别

        码元:在数字通信中常常用时间间隔相同的符号来表示一个 二进制数字 ,这样的时间间隔内的信号称为 (二进制)

        在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。即波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示。每秒钟通过信道传输的信息量称为位传输速率,简称比特率。比特率表示有效数据的传输速率。波特率与比特率的关系是比特率=波特率X单个调制状态对应的二进制位数。波特率是传输通道频宽的指标。

二、串口通信有关寄存器

1、数据缓存寄存器

          SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。

2、电源寄存器PCON

该寄存器是用来管理单片机的电源部分,包括上电复位检测,掉电模式,空闲模式等

在串口通信中,我们仅仅需要关注SMOD这一位

SMOD = 0且串口方式为1、2、3时,波特率正常

SMOD = 1且串口方式为1、2、3时,波特率加倍

 

3、状态寄存器SCON(98H)

SM0 SM1:工作方式选择位,串行口有四种工作方式,他们由SM0和SM1设定,其对应关系表如下:

SM2:多机通信时的接收允许标志位

REN:允许串行接收位

TB8,RB8:发送接收数据的第9位,当串口工作于方式2或3 时使用到,指向的是串行传输的第9位数据;

1)SM2=0,在方式2或3下,TB8、RB8 发送与接收第9位奇偶校验位;

2)SM2=1,多机通信时的接收允许位,并且在方式2或3下工作;

TI:发送中断标志位,在方式0时,当串行发送第8位数据结束时,或在其他方式,串行发送停止位的开始时,由其内部硬件使TI置1,向CPU发出中断申请。在中断服务程序中,必须用软件将其清 0,取消此中断申请。

RI:接收中断标志位,在方式0时,当串行接收第8位数据结束时,或在其他方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发出中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。

三、串口通信代码

串行口在工作之前,应对其进行初始化,主要是设置产生波特率的定时器1,串行口控制和中断控制。

void usart_init()
{TMOD = 0x20;    //选择定时器1的工作方式2TH1 = 0xF3;    //通过设置定时器1的初值来选择波特率TL1 = 0xf3;TR1 = 1;        //打开计数器SCON = 0x50;    //0101 0000PCON = 0x80;ES = 1;          //打开通信中断    ①EA = 1;          //打开总中断    ②
}

或者

void usart_init()
{TMOD = 0x20;TH1 = 253;TL1 = 253;TR1 = 1;SM0 = 0;SM1 = 1;// REN = 1// EA = 1;// ES = 1;
}

在编写串口发送端程序时,无需用到接收数据和中断服务函数,所以REN、EA、ES不需要对他们进行操作

 


http://chatgpt.dhexx.cn/article/gQU07sqS.shtml

相关文章

C51单片机串口点亮一个led

C51单片机串口点亮一个led 因为最近要用到51的串口做一些通信,这里写一个点led的程序记录一下。 说是一个led,其实可以随意多个。 主要使用到的东西: STC89C52芯片,USB转TTL下载器,led灯若干,面包板&am…

51单片机 串口

串口说白了,就是初始化后,用中断接收发送字符而已。 TXD 是 80C51 单片机的P3.1口,RXD 是80C51 单片机的 P3.0口 T1 溢出率 是定时器1的溢出率 ,SMOD是发送速率倍频的16分频,T1每溢出一次发送一位,每次发送…

【记录】一次51单片机串口乱码问题排查

【记录】一次51单片机串口乱码问题排查 项目场景问题描述原因分析解决方案结语 项目场景 在51串口收发仿真实验中使用两个单片机互相通信,程序设定A上电1s后通过串口以16进制给B发送AA,直到B收到AA后回复BB,当A机确认收到AA后开始发送数据,若…

## 51单片机串口通讯

1,接线方式: RXD: 数据输入引脚;对应stc89的P3.0口; TXD:数据的发送端口;对应P3.1口; 注意:单片机的的串口TX,RX与外设交叉接线; 2串口编程要素 输出/输入数据缓冲器S…

51单片机串口通信详解

文章目录 前言一、计算机通信简介二、串口通信简介1、简介2、同步通信和异步通信2.1 同步通信2.2 异步通信 3、串行通信的传输方式4、串口通信硬件电路5、常见接口介绍 三、串口相关寄存器详解1、特殊功能寄存器SCON2、PCON寄存器3、TMOD寄存器(定时器工作方式寄存器…

51单片机串口接收处理

目的: 通过51单片机串口外设功能,来对一组数据进行处理,新手刚刚入门可能会将串口接收到的一个数据直接赋值给一个变量,然后用这个变量做相应功能,可是这样写的不稳定性太高了,有可能会接收不到你要的那个数据&#…

51单片机串口通信原理

计算机串行通信基础 通信有串行通信和并行通信两种方式 串行通信: 将数据字节分为一位一位的形式在一条数据线上逐个传送。如下图所示 串行通信特点:传输线少,长距离传送时成本低,且可以利用电话网等现成设备,但数据的…

51单片机串口点灯

#include "reg52.h" #include "intrins.h" sfr AUXR 0x8e; sbit D5 P3^7; //定义led 接在P3.7void UartInit(void) //9600bps11.0592MHz {SCON 0x50; //配置串口工作方式1,RE使能接收数据 0101 0000PCON 0x00; TMOD &0x0F;TMOD |0x2…

51单片机串口使用

文章目录 前言一、串口概念二、中断中的RI、TI和SUBF1.RI2.TI3.SUBF 三、串口波特率的计算四、代码的编写总结 前言 今天将为大家讲解51单片机的串口原理及代码编写。 一、串口概念 51单片机串口是一种通信接口,它可以将51单片机与外部设备连接起来,实…

51单片机串口通信

串口通信 1、通信的基本概念2、 51单片机串口介绍2.1、串口通信简介2.2、串口内部结构2.3、串口通信寄存器SCONPCON 2.4、串口工作方式 3、串口使用方法3.1、硬件3.2、通信协议RS2323.3、串口初始化 4、硬件设计5、 软件设计6、拓展 串口的通信,一般是检测通信模块是…

UART串口通信

什么是串行通信? 将数据字节分成一位一位的形式在一条传输线上逐位地发送。 优点:成本低,控制复杂。 什么是异步通信? 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。 异步通信的两…

MCU-51:单片机串口详解

目录 一、计算机通信简介二、串口通信简介2.1 同步通信2.2 异步通信 三、串行通信的传输方式四、串口通信硬件电路五、常见接口介绍六、串口相关寄存器详解6.1 特殊功能寄存器SCON6.2 PCON寄存器6.3 TMOD寄存器 七、代码演示-单片机和电脑通信7.1 串口向电脑发送数据7.2 电脑通…

51单片机学习入门(三):串口

1.串口是什么? 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。 51单片机内部自带UART(…

51单片机——串口通信(发送和接受数据)

目录 一、实现的功能 二、串口通信 2.1单片机发送数据 2.1.1串口初始化 2.1.2串口发送程序 2.1.3发送效果 ​2.2单片机接收数据 2.2.1串口初始化 2.2.2接收数据程序 2.2.3接收效果 一、实现的功能 通过串口(UART)让单片机与计算机进行通信。51单…

51单片机-串口通信

目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部结构 2.5.相关寄存器 2.6.工作模式(模式1) 2.7.如何配置串口中断 3.实际应用…

IDEA调试注解处理器AbstractProcessor

1.右击项目Open In->Terminal 执行命令mvnDebug clean package 查看端口号 2.添加远程调试配置监听的端口 3.debug启动远程调试就欧克了

强大的IDEA调试工具

在开发中难免会遇到bug,而如何去跟有效率的去修复bug,除了必要的经验之外,巧妙的使用工具也是非常有必要的。 一下就是对IDEA强大调试工具的介绍 在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动…

IntelliJ IDEA调试显示表达式结果

今天无意中看到使用IntelliJ IDEA调试代码时,可以看到某段表达式的结果,如 在调试时,若想看到optStu.get().getName()的值该怎么做? 只需选中它 然后右键 点击Evaluate按钮即可出现result

idea 调试 java,将Intellij-IDEA调试器附加到正在运行的java进程

Is it possible to attach Intellij-IDEA debugger to a running java process? 解决方案 Yes! Here is how you set it up. Run Configuration Create a Remote run configuration: Run -> Edit Configurations... Click the "+" in the upper left Select the …

idea调试unity里面的lua代码

前言 本人一名java后端开发,看到前端同事调试lua代码无脑print,甚为鄙视,百度加实操写一份调试unity的lua脚本文档 操作 1.安装lua lua官网下载页面 最终下载页面 2.idea安装插件 emmylua 3.idea打开unity的lua脚本 idea->file->op…