51单片机学习9 串口通讯

news2024/9/24 21:26:47

51单片机学习9 串口通讯

  • 一、串口通讯简介
    • UART
    • STC89C51RC/RD+的串口资源
  • 二、51单片机串口介绍
    • 1. 内部结构
    • 2. 寄存器
      • (1)串口控制寄存器SCON
      • (2)电源控制寄存器PCON
    • 3. 计算波特率
    • 4. 串口配置步骤
  • 三、 开发示例
    • 1. 硬件电路
    • 2. 代码实现

在这里插入图片描述

一、串口通讯简介

51单片机的串口通信是通过内置的串行通信口(UART)实现的,常用于与外部设备进行数据交换。
串口通信是一种基于串行传输的数据通信方式,通过一根数据线和一根时钟线(或不需要时钟线)进行数据传输。数据按照一定的规则和时序被发送和接收。

UART

串口通信通常使用异步串行通信协议(UART),其中数据按照一定的帧格式进行传输,包括起始位、数据位、校验位和停止位等。常见的串口通信速率(波特率)有9600、19200、38400等。

STC89C51RC/RD+的串口资源

STC89C51RC/RD+内置2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。 两个缓冲器可以共用一个地址码 99H。
两个缓冲器统称串行通信特殊功能寄存器SBUF。

二、51单片机串口介绍

1. 内部结构

在这里插入图片描述
如图所示:

  • TXD:接P3.1引脚
  • RXD:接P3.0引脚
  • SBUF 是缓冲区,分为发送缓冲区和接收缓冲区。
  • TH1和TL1是定时器1的功能,需要工作在方式2(自动重载模式),用来设置波特率;
  • 接收数据时,数据从引脚接收,通过移位寄存器接收到 SBUF,然后控制寄存器把RI置1(接收中断),然后触发中断;
  • 发送数据时,SBUF传到控制门,由发送控制器控制TI 触发中断;

2. 寄存器

(1)串口控制寄存器SCON

SCON 寄存器结构

Bit:   7      6      5      4      3      2      1      0
      ┌────┬────┬────┬────┬────┬────┬────┬────┐
      │ SM0 │ SM1 │ SM2 │ REN │ TB8 │ RB8 │ TI  │ RI  │
      └────┴────┴────┴────┴────┴────┴────┴────┘

SCON 寄存器各位的功能

  • 位7-5:SM0、SM1、SM2(串口工作模式位)
  • 这三位用于设置串口工作的不同模式。它们的具体含义如下:
  • SM0、SM1:用于设置串口工作的模式,共有四种工作模式,包括模式0、模式1、模式2和模式3。
SM1SM0工作模式描述
00模式0移位寄存器,波特率固定
01模式110位异步收发器(8位数据),波特率可变
10模式211位异步收发器(9位数据),波特率固定
11模式311位异步收发器(9位数据),波特率可变
  • SM2:用于设置串口是否工作在多机通信模式,一般工作在单机模式时,该位为0。

  • 位4:REN(接收允许位): 该位用于控制串口的接收功能,置1时允许串口接收数据,清0时禁止串口接收数据。

  • 位3:TB8(发送位8): 该位用于设置在串口工作在模式2或模式3时发送的数据的第9位,通常用于设置奇偶校验位。

  • 位2:RB8(接收位8): 该位用于存储在串口接收到的数据的第9位,通常用于接收端的奇偶校验检测。

  • 位1:TI(发送中断标志位): 该位用于指示串口发送数据的中断标志,发送完一帧数据后会被置1,需要在中断服务程序中清零。

  • 位0:RI(接收中断标志位): 该位用于指示串口接收数据的中断标志,接收到一帧数据后会被置1,需要在中断服务程序中清零。

(2)电源控制寄存器PCON

PCON全称为Power Control Register(电源控制寄存器),它包含了一些与单片机的电源管理相关的控制位。

PCON寄存器结构

Bit:   7      6      5      4      3      2      1      0
      ┌────┬────┬────┬────┬────┬────┬────┬────┐
      │ SMOD │ SMOD0│---- │ ---- │ ---- │ ---- │ POF0 │ POF1 │
      └────┴────┴────┴────┴────┴────┴────┴────┘

PCON寄存器各位的功能

  • 位7:SMOD(串口波特率倍增控制位)

    • SMOD用于控制串口波特率是否加倍。置1时,串口波特率加倍;清0时,不加倍。
  • 位6:SMOD0(串口0波特率倍增控制位)

    • 该位是SMOD的扩展位,一般在多串口通信时使用。SMOD置1时,SMOD0表示串口0的波特率是否加倍;SMOD清0时,该位无效。
      其它位与串口通讯没大关系。

3. 计算波特率

使用本文开源地址里的 51 波特率计算.exe 工具:
注意软件里设置定时器1的定时器方式,不是串口的工作方式。
SMOD:是否倍频(不是波特率加倍,只是计算初始值变化)。

在这里插入图片描述
晶振频率最好使用11.0592,这样误差比较小。

4. 串口配置步骤

  1. 通过TMOD寄存器 确定定时器T1工作方式2(自动重载) ;
  2. 通过SCON寄存器 确定串口工作方式 ;
  3. 计算T1的初值,设定波特率,装载 TH1,TL1;
  4. 启动定时器T1;
  5. 开启中断;
  6. 串口初始化;

三、 开发示例

1. 硬件电路

在这里插入图片描述
开发板使用USB转串口电路,同时也是下载模块的电路。

2. 代码实现

本代码效果: 串口接收数据后,原样返回串口。

uart_utils.c

#include "uart_utils.h"
#include <reg52.h>

/**
* @brief 串口初始化
*/
void uart_init(u8 baud){
    // 设置计数器1的工作方式2
    TMOD = 0x20;
    // 设置定时器1的工作方式1
    SCON = 0x50; // 0b01010000 
    // 波特率倍频
    PCON = 0x80; // 0b10000000
    // 计数器初始值
    TH1 = baud;
    TL1 = baud;
    // 打开接收中断
    ES = 1; 
    // 打开总中断
    EA = 1;
    // 启动定时器1
    TR1 = 1;
}
/**
* @brief 串口发送数据
*/
void uart_send(u8 dat){
    SBUF = dat;
    while(!TI);
    TI = 0;
}
/**
* @brief 使用中断接收串口数据
*/
void uart_recv() interrupt 4{
    u8 dat;
    if(RI){
        RI = 0;
        dat = SBUF;
        uart_send(dat);
    }
}

main.c

#include <reg52.h>
#include "led_utils.h"
#include "common_utils.h"
#include "types.h"
#include "timer_utils.h"
#include "uart_utils.h"

/**
* @brief 主函数
*/
main()
{
	// 关闭所有led
	led_all_off();
	uart_init(0xfa);
	while(1)
	{
		
	}
}

操作步骤:

  1. 烧录程序;
  2. 在电脑打开串口调试助手,连接开发板串口,点打开,如下图所示;
  3. 在发送区输入字符,点发送。

调试效果:
在这里插入图片描述
本文代码开源地址:
https://gitee.com/xundh/learn51.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534080.html

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

相关文章

Jenkins流水线将制品发布到Nexus存储库

1、安装jenkins&#xff08;建议别用docker安装&#xff0c;坑太多&#xff09; docker run -d -p 8089:8080 -p 10241:50000 -v /var/jenkins_workspace:/var/jenkins_home -v /etc/localtime:/etc/localtime --name my_jenkins --userroot jenkins/jenkins:2.449 坑1 打开x…

第十九章 TypeScript 装饰器Decorator

Decorator 装饰器是一项实验性特性&#xff0c;在未来的版本中可能会发生改变 它们不仅增加了代码的可读性&#xff0c;清晰地表达了意图&#xff0c;而且提供一种方便的手段&#xff0c;增加或修改类的功能 若要启用实验性的装饰器特性&#xff0c;你必须在命令行或tsconfig…

动手做简易版俄罗斯方块

导读&#xff1a;让我们了解如何处理形状的旋转、行的消除以及游戏结束条件等控制因素。 目录 准备工作 游戏设计概述 构建游戏窗口 游戏方块设计 游戏板面设计 游戏控制与逻辑 行消除和计分 判断游戏结束 界面美化和增强体验 看看游戏效果 准备工作 在开始编码之前…

Riscure TrueCode静动态代码分析工具介绍

True Code是一个安全代码开发和自动漏洞识别的解决方案&#xff0c;适用于软件开发生命周期&#xff08;SDLC&#xff09;和DevSecOps流程。 True Code使用LibFuzzer作为模糊工具来模糊目标程序或软件。 True Code - Automated embedded Software Security checks 设备上运行…

高速CAN 收发器AMIS30660CANH2RG 用于各种数据传输协议的调制解调器和收发器

AMIS30660CANH2RG CAN 收发器是控制器区域网络 (CAN) 协议控制器和物理总线之间的接口&#xff0c;可在 12 V 和 24 V 系统中使用。该收发器为总线提供差分发射功能&#xff0c;向 CAN 控制器提供差分接收功能。由于接收器输入较宽的共模电压范围和其他设计功能&#xff0c; 能…

C 多维数组

C 语言支持多维数组。多维数组声明的一般形式如下&#xff1a; type name[size1][size2]...[sizeN];例如&#xff0c;下面的声明创建了一个三维 5 . 10 . 4 整型数组&#xff1a; int threedim[5][10][4];二维数组 多维数组最简单的形式是二维数组。一个二维数组&#xff0c…

从JVM的退出机制分析Java程序的优雅关闭退出

前言 Java程序启动从main函数开始启动&#xff0c;是程序入口和主线程&#xff0c;但程序会在什么时候结束&#xff1f;为什么有的Java程序在启动后很快就结束了&#xff0c;比如HelloWorld程序&#xff0c;有的程序却能一直在运行&#xff0c;比如Tomcat启动后就一直保持进程…

揭秘物联网网关,如何工作?功能及选择网关的主要考虑因素

【前言】本篇为物联网硬件系列学习笔记&#xff0c;分享学习&#xff0c;欢迎评论区交流~ 在物联网时代&#xff0c;物联网网关至关重要。它充当传统通信网络和传感网络之间的桥梁。物联网网关作为M2M网关&#xff0c;可以实现各类感知网络之间、感知网络与通信网络之间的协议转…

粤嵌6818开发板如何理解Linux文件IO?

一、文件IO的概述 1、什么是文件&#xff1f; Linux下一切皆文件。普通文件、目录文件、管道文件、套接字文件、链接文件、字符设备文件、块设备文件。 2、什么是IO&#xff1f; input output&#xff1a;输入输出 3、什么是文件IO&#xff1f; 对文件的输入输出&#xff0c;把…

MySQL索引的创建与基本用法

MySQL索引 MySQL索引是一种数据结构&#xff0c;用于提高查询数据的效率。MySQL索引可以被看作是数据库表的“目录”。就像书籍的目录帮助我们快速找到特定章节的位置一样&#xff0c;数据库索引帮助数据库快速找到特定数据记录的位置。 MySQL索引的类型与创建方法 MySQL索引…

TR1 - Transformer起源与发展

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 1. Transformer的起源与发展 2017年Google在《Attention Is All You Need》中提出了Transformer结构用于序列标注&#xff0c;在翻译任务…

最细节操作 Linux LVM 逻辑卷管理

Linux LVM&#xff08;逻辑卷管理&#xff09; 周末愉快&#xff0c;今天带大家实战一下LVM! 一、LVM理论 LVM&#xff0c;即Logical Volume Manager&#xff0c;逻辑卷管理器&#xff0c;是一种硬盘的虚拟化技术&#xff0c;可以允许用户的硬盘资源进行灵活的调整和动态管理…

2023年五级区划省市县乡镇行政村社区边界数据

行政区划数据是重要的基础地理信息数据&#xff0c;根据国家统计局公布的数据&#xff0c;行政区划共分为五级&#xff0c;分别为省级、地级、县级、乡镇/街道级、村/社区级。 该套数据以2020-2023年国家基础地理信息数据中的县区划数据作为矢量基础&#xff0c;辅以高德行政区…

JavaSE:数据类型与变量

目录 一、前言 二、数据类型与变量 &#xff08;一&#xff09;字面常量 &#xff08;二&#xff09;数据类型 &#xff08;三&#xff09;变量 1.变量概念 2.语法格式 3.整型变量 3.1整型变量 3.2长整型变量 3.3短整型变量 3.4字节型变量 4.浮点型变量 4.1双精…

详解main函数参数argc、argv及如何传参

目录 1、main()函数参数 2、main函数如何传参 2.1 环境准备 2.2 通过 Powershell 窗口传参 2.3 通过vs界面传参 3、int main() 和 int main(int argc, char *argv[]) 特点 1、main()函数参数 在C语言中&#xff0c;main函数可以带参数。main函数的原型通常为以下两种形式…

第4章 数据架构

思维导图 架构是构建一个系统&#xff08;如可居住型建筑&#xff09;的艺术和科学&#xff0c;以及在此过程中形成的成果——系统本身。用通俗的话说&#xff0c;架构是对组件要素有组织的设计&#xff0c;旨在优化整个结构或系统的功能、性能、可行性、成本和用户体验。 将架…

Vue cli创建项目时键盘操作无效;vue3.0项目搭建自定义配置

一. 问题描述 在创建vue3.0项目时&#xff0c;在建好的文件夹&#xff0c;鼠标右键 git bash 使用 vue create my-vue3.0创建新项目时&#xff0c;键盘方向键失效&#xff0c;无法选中对应的选项&#xff08;交互提示符不工作&#xff09; 解决方案&#xff1a; 方案一 使用…

章文嵩等技术大咖共同探讨企业数据治理和降本增效策略运用!

3 月 16 日&#xff0c;AutoMQ 携手 OceanBase 开源社区、KubeBlocks 举行的《LLMs 时代下企业数据管理与降本增效之路》主题 meetup 顺利落幕。活动邀请了 AutoMQ 联合创始人 & CSO、Linux LVS 创始人 章文嵩&#xff0c;AutoMQ 联合创始人 & CTO、Apache RocketMQ 联…

一文秒懂什么是客服知识库

大家有没有遇到过这样的情况&#xff1a;打电话给客服&#xff0c;结果对方半天没明白你的问题&#xff0c;或者回答得牛头不对马嘴&#xff1f;这种时候&#xff0c;你是不是觉得特别郁闷&#xff0c;感觉自己的问题就像被丢进了黑洞&#xff0c;永远找不到答案&#xff1f;其…

利用pyvista库可视化点云

ShapeNet分割数据可视化对比 import os import glob import randomimport pyvista as pvresult_paths glob.glob(r./examples/shapenet/results/predict_err_ply/*/*) print(len(result_paths))case_id random.randint(0, len(result_paths) // 3) point_size 3 opacity 0.…