【STC89C51单片机】串口通信

【STC89C51单片机】串口通信

    • 串口简介
      • 1. 串口接线方式
      • 2. 通信过程
    • 相关寄存器
      • 1. SBUF(Serial Buffer Register)
      • 2. SCON(Serial Control Register)
      • 3. PCON(Power Control Register)
      • 4. TCON(Timer Control Register)
      • 5. 串口波特率
    • 代码示例
      • 发送数据:
      • 接收数据
      • 相关寄存器配置**
      • 完整代码

串口简介

STC89C51RC/RD+系列单片机内部集成有一个功能很强的全双工串行通信口,与传统8051单片机的串口完全兼容。设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能存器SBUF

1. 串口接线方式

在这里插入图片描述

2. 通信过程

输入/输出数据缓冲器都叫做SBUF, 都用99H地址码,但是是两个独立的8位寄存器
代码体现为: 想要接收数据 char data = SBUF 想要发送数据 SBUF = data
UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信速度,叫做波特率

在这里插入图片描述

相关寄存器

1. SBUF(Serial Buffer Register)

发送数据:写数据到SBUF,数据会从TXD引脚发送出去。
接收数据:当接收到的数据存储在SBUF,可以从SBUF读取数据。

2. SCON(Serial Control Register)

SCON寄存器用于控制串口的工作方式和状态。其位定义如下:

  • SM0, SM1:选择串口的工作模式(Mode)
  • 0 0:模式0,移位寄存器方式,波特率为定时器频率/12
  • 0 1:模式1,8位UART,波特率可变
  • 1 0:模式2,9位UART,波特率为定时器频率/32或/64
  • 1 1:模式3,9位UART,波特率可变
  • REN:允许接收(Receiver Enable)
  • TB8:在模式2或3中使用的第9位发送数据
  • RB8:在模式2或3中使用的第9位接收数据
  • TI:发送中断标志(Transmit Interrupt Flag)
  • RI:接收中断标志(Receive Interrupt Flag)

3. PCON(Power Control Register)

PCON寄存器的SMOD位用于控制串口波特率加倍:

  • SMOD:当设为1时,串口波特率加倍。

4. TCON(Timer Control Register)

TCON寄存器中的位用于控制定时器/计数器的启动和中断。它们在串口通信中的作用主要是用于定时器的控制。

5. 串口波特率

波特率(Baud Rate)是串行通信中的一个重要参数,它定义了每秒钟传输的比特数。80C51的串口波特率可以通过定时器1的溢出率来控制。
波特率公式:

模式1和模式3

波特率 = 2 S M O D 32 × ( 晶振频率 12 × ( 256 − T H 1 ) ) \text{波特率}=\frac{2^{SMOD}}{32}\times\left(\frac{\text{晶振频率}}{12\times(256-TH1)}\right) 波特率=322SMOD×(12×(256TH1)晶振频率)
其中,SMOD为PCON寄存器中的波特率加倍位,TH1为定时器1的高字节。

代码示例

发送数据:

void serial_send(char data) {SBUF = data;   // 将数据写入SBUF寄存器while (!TI);   // 等待发送完成TI = 0;        // 清除发送中断标志
}

接收数据

char serial_receive() {while (!RI);   // 等待接收完成RI = 0;        // 清除接收中断标志return SBUF;   // 读取接收的数据
}

相关寄存器配置**


void UartInit(void)     
{//9600bps@11.0592MHzAUXR = 0x01;SCON = 0x50; //配置串口工作方式1,REN使能接收TMOD &= 0x0F;TMOD |= 0x20;//定时器1工作方式位8位自动重装  TH1 = 0xFD;TL1 = 0xFD;//9600波特率的初值TR1 = 1;//启动定时器 EA = 1;//开启总中断ES = 1;//开启串口中断
}

完整代码

#include "reg52.h"
sfr AUXR = 0x8e;void UartInit(void)     
{//9600bps@11.0592MHzAUXR = 0x01;SCON = 0x50; //配置串口工作方式1,REN使能接收TMOD &= 0x0F;TMOD |= 0x20;//定时器1工作方式位8位自动重装  TH1 = 0xFD;TL1 = 0xFD;//9600波特率的初值TR1 = 1;//启动定时器 EA = 1;//开启总中断ES = 1;//开启串口中断
}
//发送数据
void serial_send(char data_mes) {SBUF = data_mes;   // 将数据写入SBUF寄存器while (!TI);   // 等待发送完成TI = 0;        // 清除发送中断标志
}
//接收数据
char serial_receive() {while (!RI);   // 等待接收完成RI = 0;        // 清除接收中断标志return SBUF;   // 读取接收的数据
}void serial_string(char* p) {while(*p != '\0'){serial_send(*p);p++;}}void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i);
}void main()
{UartInit();while(1){Delay1000ms();serial_string("hello word\r\n");}
}

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

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

相关文章

记录些Redis题集(4)

Redis 通讯协议(RESP) Redis 通讯协议(Redis Serialization Protocol,RESP)是 Redis 服务端与客户端之间进行通信的协议。它是一种二进制安全的文本协议,设计简洁且易于实现。RESP 主要用于支持客户端和服务器之间的请求响应交互…

第 8 章 虚拟文件系统(2)

目录 8.3 VFS结构 8.3.1 结构概观 8.3.2 inode 本专栏文章将有70篇左右,欢迎关注,查看后续文章。 8.3 VFS结构 8.3.1 结构概观 VFS组成部分: 1. 文件。 2. 文件系统。 1. 文件的表示 inode:包含文件信息及数据存储位置。 上…

Oracle数据泵和RMAN异机备份还原速度对比

一、数据泵迁移 1、原始库停止监听 命令:lsnrctl stop 耗时:1分钟 2、原始库expdp导出 expdp username/password schemasUSER dumpfilefilename.dmp directoryBAK_DIR version11.2.0.4.0 logfilelogfilename.log compressionall clusterN 耗时&…

001、Mac系统上Stable Diffusion WebUI环境搭建

一、目标 如标题所述,在苹果电脑(Mac)上搭建一套Stable Diffusion本地服务,以实现本地AI生图目的。 二、安装步骤 1、准备源码【等价于准备软件】 # 安装一系列工具库,包括cmake,protobuf,rust,python3.10,git,wge…

Nginx、LNMP万字详解

目录 Nginx 特点 Nginx安装 添加Nginx服务 Nginx配置文件 全局配置 HTTP配置 状态统计页面 Nginx访问控制 授权用户 授权IP 虚拟主机 基于域名 测试 基于IP 测试 基于端口 测试 LNAMP 解析方式 LNMP转发php-fpm解析 Nginx代理LAMP解析 LNMP部署示例 实…

linux之mysql安装和使用

数据库之Mysql 一、数据库介绍 1、什么是数据库 数据库就是一个存放计算机数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来对数据进行组织和存储的,可以通过数据库提供的多种方法来管理其中的数据。 2、数据库的种类 最常用的…

微分段Microsegmentation简介

目录 微分段Microsegmentation简介什么是微分段?微分段的防范措施微分段的防护层级 基于网络的微分段微分段基本工作机制微分段的角色VxLAN的额外字段 业务链分组与传输策略场景1:三层报文本地转发场景场景2:三层报文跨设备转发场景 微分段的…

中国贸易外经统计年鉴(2006-2023年)

数据年限:2006-2023年全 数据格式:pdf、excel、caj 数据内容:《中国贸易外经统计年鉴》是一部反映中国国内贸易、对外经济贸易和旅游业发展情况的资料性年刊。收录了 中国国内消费品市场、批发和零售业、住宿和餐饮业、国际收支、对外贸易、利…

2024年大数据高频面试题(下篇)

文章目录 Scala数据类型函数式编程闭包函数柯里化面向对象样例类对象与伴生对象特质(trait)模式匹配隐式转换即席查询KylinKylin特点Kylin工作原理核心算法Kylin总结Kylin的优点什么场景用KylinKylin的缺点Impala什么是ImpalaImpala为什么快FrontendBackendImpala总结:Presto什…

C++11新特性--委托构造和继承构造函数

1. 委托构造函数 委托构造函数允许使用同一个类中的一个构造函数调用其它的构造函数&#xff0c;从而简化相关变量的初始化。下面举例说明&#xff1a; #include <iostream> using namespace std;class Test { public:Test() {};Test(int max){this->m_max max >…

具有I2S输出的多模数字麦克风ICS-43434咪头LR引脚接地或电源WS接LRCLK

外观和丝印 ICS-43434麦克风3.50 mm x 2.65 mm&#xff0c;丝印为434&#xff08;图片不好拍&#xff0c;隐约可见434&#xff09; 一般描述 ICS-43434 是一款数字 IS 输出底部收音孔麦克风。完整的 ICS-43434 解决方案包括 MEMS 传感器、信号调理、模数转换器、抽取和抗混叠滤…

在mybatis-plus中关于@insert注解自定义批处理sql导致其雪花算法失效而无法自动生成id的解决方法

受到这位作者的启发 > 原文在点这里 为了自己实现批量插入&#xff0c;我在mapper层使用insert注解写了一段自定义sql //自定义的批量插入方法 Insert("<script>" "insert into rpt_material_hour(id,sample_time,rounding_time,cur_month,machine_no…

Elasticsearch 批量更新

Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch批量更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查询指定shif…

leetcode_80. 删除有序数组中的重复项 II

leetcode_80. 删除有序数组中的重复项 II leetcode链接 题目描述 给你一个有序数组 nums &#xff0c;请你** 原地** 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须…

大龄程序员的出路在哪里?

对于许多资深程序员而言&#xff0c;年龄并非职业发展的桎梏&#xff0c;反而如同陈年的美酒&#xff0c;随着时间的流逝愈发醇厚。他们手握的是丰富的经验和不断进阶的技能&#xff0c;而这些都为他们打开了职业发展的无数扇大门。让我们一同探索这些令人心动的可能性吧&#…

视频号矩阵系统,AI自动生成文案,实现批量上传视频和定时发布

在数字化浪潮席卷全球的今天&#xff0c;视频内容已成为信息传播的重要载体。然而&#xff0c;对于众多自媒体创作者和企业而言&#xff0c;如何高效、精准地发布视频内容&#xff0c;依然是一个不小的挑战。幸运的是&#xff0c;随着技术的不断进步&#xff0c;视频号矩阵系统…

SQL概述及其规则与规范

SQL概述及其规则与规范 1.SQL概述 1.1 SQL背景知识 1946年&#xff0c;世界第一台电脑诞生&#xff0c;如今&#xff0c;互联网已经非常壮大&#xff0c;在这几十年间互联网得到了飞速的发展&#xff0c;无数的技术在其中起起伏伏&#xff0c;但是有一门技术从未消失&#xf…

Kafka消息队列python开发环境搭建

目录 引言 Kafka 的核心概念和组件 Kafka 的主要特性 使用场景 申请云服务器 安装docker及docker-compose VSCODE配置 开发环境搭建 搭建Kafka的python编程环境 Kafka的python编程示例 引言 Apache Kafka 是一个分布式流处理平台&#xff0c;由 LinkedIn 开发并在 2…

SpringBoot整合阿里云RocketMQ对接,商业版

1.需要阿里云开通商业版RocketMQ 普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组 2.结构目录 3.引入依赖 <!--阿里云RocketMq整合--><dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</…

Qt类 | QLabel类详解

文章目录 一、QLabel类介绍二、Properties&#xff08;属性&#xff09;三、Public Functions&#xff08;公共函数&#xff09;1.构造函数2.alignment与setAlignment函数 -- 标签内容的对齐方式3.buddy与setBuddy函数 -- QLabel关联的伙伴控件4.hasScaledContents与setScaledC…