51单片机——串口通信(重点)

embedded/2025/1/12 23:27:48/

1、通信

通信的方式可以分为多种,按照数据传送方式可分为串行通信和并行通信;

按照通信的数据同步方式,可分为异步通信和同步通信;

按照数据的传输方向又可分为单工、半双工和全双工通信

1.1 通信速率

        衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒( bps)

如:每秒钟传送 240 个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:10位×240个/秒=2400bps

        波特率表示每秒钟传输了多少个码元。而码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。

如:常见的通信传输中,用0V表示数字0,5V 表示数字1,那么一个码元可以表示两种状态0和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有0V、2V、4V以及6V分别表示二进制数00、01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半

由于很多常见的通信中一个码元都是表示两种状态,所以我们常常直接以波特率来表示比特率

1.2 串口通信简介

        串口通信(Serial Communication),是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议

        串口通信中通常使用的是异步串口通信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率

1.3 串口内部结构

(1)单片机>51单片机均有的5个中断来介绍,其内部结构框图如下所示: 

        RXDTXD对应的是P3.0P3.1口的附加功能,RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断,中断号4

 (2)串口内部结构图如下所示:

        右边的TXD和RXD为单片机IO口,TXD对应的是P3.1管脚,RXD对应的是P3.0管脚

串口内部结构中有TH1和TL1,所以需要定时器T1

2、串口相关寄存器

2.1 串口控制寄存器 SCON

(1)SM0和SM1为工作方式选择位

(2)SM2:多机通信控制位,主要用于方式2和方式3

        当SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)

        当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。

(3)REN:允许串行接收位。

        由软件置REN=1,则启动串行口接收数据;

        若软件置REN=0,则禁止接收。

(4)TB8:在方式2或方式3中,是发送数据的第9位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。 在方式0和方式1中,该位未用到。

(5)RB8:在方式2或方式3中,是接收到数据的第9位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。

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

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

2.2 电源控制寄存器 PCON

 

SMOD:波特率倍增位。在串口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0

3、计算波特率

波特率的计算公式:

        方式0的波特率=fosc/12

        方式1的波特率=((2^SMOD)/32)*(T1溢出率)

        方式2的波特率=((2^SMOD)/64)*fosc

        方式3的波特率=((2^SMOD)/32)*(T1溢出率)

其中T1溢出率=fosc/{12×[256-(TH1)]}

一般借助51波特率初值计算软件得到一个波特率初值

为什么要计算一个初值?

        在串口通信中,通过波特率软件计算出一个初值,通常是为了配置定时器1所需的波特率

        这个初值对于确保数据的正确传输至关重要,因为它直接影响到定时器的溢出率,进而决定了串口通信的波特率

        初值的作用有:确定波特率、同步数据传输、避免数据丢失或错误

4、串口初始化步骤

①确定T1的工作方式(TMOD寄存器)

②确定串口工作方式(SCON寄存器)

③计算T1的初值(设定波特率),装载TH1、TL1

④启动T1(TCON中的TR1位)

⑤如果使用中断,需开启串口中断控制位(IE寄存器)

eg:设置串口为工作方式1、波特率为9600、波特率加倍、使用中断

void uart_init(u16 baud){  //baud:初值,由波特率计算工具得到
    TMOD|=0X20;  //定时器1的工作方式为2            定时器
    SCON=0x50;  //SCON寄存器的工作方式为1     串口
    PCON=0x80;  //PCON寄存器,波特率加倍       串口
    TH1=baud;  //定时计数器1的初值配置               定时器
    TL1=baud;                                                          定时器
    EA=1;  //打开总中断开关                                    串口                                  
    ES=1;  //打开接收中断                                        串口
    TR1=1;  //打开计算器                                          定时器(寄存器 TCON)
}

        在主函数中调用该函数并传入0XFA值即可,如下: 

uart_init(0xfa);  //定时器1的工作方式为2;晶振频率:11.0592;波特率:9600;SMOD:1 

5、软件设计

要实现的功能是:当串口助手发送数据给单片机单片机原封不动转发给串口助手显示

#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
//串口初始化
void uart_init(u16 baud){  //baud:初值,由波特率计算工具得到
    TMOD|=0X20;  //定时器1的工作方式为2
    SCON=0x50;  //SCON寄存器的工作方式为1
    PCON=0x80;  //PCON寄存器,波特率加倍
    TH1=baud;  //定时计数器1的初值配置
    TL1=baud; 
    EA=1;  //打开总中断开关
    ES=1;  //打开接收中断
    TR1=1;  //打开计算器
}
void main(){
    uart_init(0xfa);  //定时器1的工作方式为2;晶振频率:11.0592;波特率:9600;SMOD:1
    while(1){
        
    }
}
void uart() interrupt 4{
    u16 rec_data=0;  //接收数据变量
    RI=0;  //手动置0,清除接收中断的标志位
    rec_data=SBUF;  //SBUF接收完数据
    SBUF=rec_data;  //将总线上的数据再写入SBUF
    while(!TI);  //系统自动置1
    TI=0;  //手动置0
}

结果如下图所示:


http://www.ppmy.cn/embedded/153406.html

相关文章

小识MySQL中当前读CR和快照读SR

在MySQL中,尤其是使用InnoDB存储引擎时,存在两种主要的读取方式:当前读(Current Read)和快照读(Snapshot Read)。以下是关于这两种读取方式的详细解释和对比: 一、快照读&#xff0…

Django Admin中添加自定义按钮与默认按钮并列

引言 在Django Admin中,我们经常需要添加自定义操作按钮,以便管理员可以快速执行特定任务。本文将介绍如何在Django Admin中添加一个自定义按钮(如"同步ECR仓库"),并将其与默认的"添加"、"删除"按钮放在同一级别。 © ivwdcwso (ID: u01217…

【架构设计】新闻推送系统设计

系统需求与估算 功能需求:包括提要发布、检索、通知和分析等功能。非功能需求:需具备高可用性和低延迟特性。估算数据:假设每天有 2000 万活跃用户,每人每天调整五次,由此可得每秒约接收 1000 条推文,按 10…

oracle闪回恢复数据:(闪回查询,闪回表,闪回库,回收站恢复)

oracle的闪回查询,可以查询提交在表空间的闪回数据,并可以还原所查询的数据,用于恢复短时间内的delele 或者 update 误操作,非常方便,缺点是只能恢复大概几小时内的数据。 文章目录 概要闪回查询恢复数据的主要方法包括…

SpringBoot的@Scheduled和@Schedules有什么区别

Scheduled 的详细解析 参数详解 cron: 使用Cron表达式来指定复杂的调度模式。Cron表达式的格式如下: 秒(0-59)分钟(0-59)小时(0-23)日(1-31)月(1-12 或 JAN-…

哈希表及模拟实现

目录 一、哈希表的概念 二、模拟实现哈希表 1.开放地址法 (1)哈希表的数据加上状态标志 (2)哈希表扩容:载荷因子 (3)哈希函数:不同数据类型转换为整型 (4)完整代码 2.链地址法(哈希桶) (1)哈希表扩容:载荷因子…

分布式ID—雪花算法

背景 现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。 对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多…

Java 的单例模式详解及优化

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…