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

news2025/3/1 3:28:32

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.coloradmin.cn/o/2275033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地手集博客id“升级”在线抓取——简陋版——(2024年终总结1.1)

我之前每每发布笔记都用csv纯文本记录,一个机缘巧得文章列表api实现在线整理自已的文章阅读量数据。 (笔记模板由python脚本于2025年01月10日 18:48:25创建,本篇笔记适合喜欢钻牛角尖的coder翻阅) 【学习的细节是欢悦的历程】 Python官网:htt…

高等数学学习笔记 ☞ 洛必达法则与泰勒公式

1. 洛必达法则 1. 型与型未定式(洛必达法则) (1)型:若函数同时满足以下条件: (2)型:若函数同时满足以下条件: ①:当时&…

Qt官方下载地址

1. 最新版本 Qt官方最新版本下载地址:https://www.qt.io/download-qt-installer 当前最新版本Qt6.8.* 如下图: 2. 历史版本 如果你要下载历史版本安装工具或者源码编译方式安装,请转至此链接进行下载:https://download.qt.i…

怎么用NodeJS脚本对接TTS播报音响

怎么用NodeJS脚本对接TTS播报音响呢? 本文描述了使用NodeJS脚本调用HTTP接口,对接TTS播报音响,。 可选用产品:可根据实际场景需求,选择对应的规格 序号设备名称厂商1智能语音音柱|10W统软物联2智能语音壁挂音箱|款式…

计算机存储之图解机械硬盘

问:机械硬盘是如何工作的? 答:请看VCR 一、机械硬盘物理结构 1.1、盘片(platter) 视频中银白色的圆盘称为盘片,二进制数据就是存储在盘片上,盘片解剖后如下图所示: 一圈一圈的同心圆称为磁道(…

HTML前端从零开始

第一天 HTML部分 什么是HTML HTML(Hypertext Markup Language)超文本标记语言。HTML是万维网的基石。 超: 超字第一层意义是指最重要的标签,超链接标签 超越文本的意思 HTML的发展历程 HTML1990年出现,web之父…

moviepy 将mp4视频文件提取音频mp3 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

【Leetcode-移动零】利用将非零元素移动至数组前解决移动零问题(剪枝优化)

题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例1 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例2 输入: nums [0] 输出…

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年,大模型技术已经普及并逐步渗透到各行各业,2025年注定是大模型应用井喷式发展的一年,AI在快速发展的同时,其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载:600多…

第21篇 基于ARM A9处理器用汇编语言实现中断<三>

Q:怎样编写ARM A9处理器汇编语言代码配置按键端口产生中断? A:使用Intel Monitor Program创建中断程序时,Linker Section Presets下拉菜单中需选择Exceptions。主程序在.vectors代码段为ARM处理器设置异常向量表,在…

直流无刷电机控制(FOC):电流模式

目录 概述 1 系统框架结构 1.1 硬件模块介绍 1.2 硬件实物图 1.3 引脚接口定义 2 代码实现 2.1 软件架构 2.2 电流检测函数 3 电流环功能实现 3.1 代码实现 3.2 测试代码实现 4 测试 概述 本文主要介绍基于DengFOC的库函数,实现直流无刷电机控制&#x…

(四)结合代码初步理解帧缓存(Frame Buffer)概念

帧缓存(Framebuffer)是图形渲染管线中的一个非常重要的概念,它用于存储渲染过程中产生的像素数据,并最终输出到显示器上。简单来说,帧缓存就是计算机图形中的“临时画布”,它储存渲染操作生成的图像数据&am…

Linux离线部署ELK

文章目录 前期准备开始安装安装elastic search安装logstash安装kibana 配置ELK配置ElasticSearch配置logstash配置kibana 启动ELK启动命令启动测试 设置ELK策略创建ILM策略将ILM策略与日志index关联查看索引是否被ILM策略管理 前期准备 ELK包含三部分软件 ElasticSearch用作搜…

LabVIEW数据库管理系统

LabVIEW数据库管理系统(DBMS)是一种集成了数据库技术与数据采集、控制系统的解决方案。通过LabVIEW的强大图形化编程环境,结合数据库的高效数据存储与管理能力,开发人员可以实现高效的数据交互、存储、查询、更新和报告生成。LabV…

微服务实现高并发 秒杀系统,前后端实现

一、前端实现 前端项目初始化 首先,我们需要创建一个新的 Vue 3 项目。你可以使用 Vue CLI 来快速搭建项目。 安装 Vue CLI(如果尚未安装) bash npm install -g vue/cli 创建 Vue 项目 bash vue create seckill-frontend cd seckill-f…

Http请求响应——请求

Http概述 Http协议(HyperText Transfer Protocol,超文本传输协议),是一种用于传输网页数据的协议,规定了浏览器和服务器之间进行数据传输的规则,简单说来就是客户端与服务器端数据交互的数据格式。 客户端…

Vue3 + Vite + Electron + Ts 项目快速创建

一、创建 Vue 项目 1. 创建项目 pnpm create vite 2. 安装依赖 cd excel-electron pnpm install 3. 运行项目 pnpm dev 二、添加 Electron 1. 安装 electron pnpm add electron -D 2. 修改 package.json 添加入口 js 和执行命令。 {"main": "dist-ele…

socket网络编程-TC/IP方式

网络编程 1.概念:两台设备之间通过网络数据传输。 2.网络通信:将数据通过网络从一台设备传输另外一台设备。 3.java.net包下提供了一系列的类和接口,提供程序员使用,完成网络通信。 TCP和UDP TCP协议: 1.使用TCP协…

RabbitMQ基本介绍及简单上手

(一)什么是MQ MQ(message queue)本质上是队列,满足先入先出,只不过队列中存放的内容是消息而已,那什么是消息呢? 消息可以是字符串,json也可以是一些复杂对象 我们应用场…

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏,而这篇文章讲的就是它…