51单片机串口通信

文章目录

  • 一、硬件结构
    • 1.1 串口硬件结构
    • 1.2 串口控制寄存器
      • 1.2.1 SCON寄存器
      • 1.2.2 PCON寄存器
  • 二、波特率计算
  • 三、程序编写
    • 3.1 步骤
    • 3.2 示例程序

一、硬件结构

1.1 串口硬件结构

在这里插入图片描述
有两个物理上独立的接受、发送缓冲器SBUF,占用了同一个地址99H。
在软件编写时,发送、接受都使用SBUF。
内部使用T1定时器来控制波特率。

1.2 串口控制寄存器

1.2.1 SCON寄存器

SCON寄存器是一个特殊功能寄存器,用来设定串行口的工作方式、接受/发送控制以及设置状态标志。
在这里插入图片描述

  • SM0和SM1为工作模式选择位,共4种方式,通常使用方式1
    在这里插入图片描述

  • 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,可以实现多机通信,通常SM2=0。
    在方式0时,SM2必须为0。
    在方式1,如果SM2=1,则之后接收到有效停止位时,RI才置1。

  • REN 允许串行接收位
    由软件置REN=1,则启动串行口接收数据。若软件置REN=0,则禁止接收。
    通常REN=1。

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

  • RB8在方式2/3中,是接收数据的第9位
    可以用作奇偶校验位或者地址帧/数据帧的标志位。
    在方式1中,若SM2=0,则RB8是接收到的停止位。

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

  • RI接收中断标志位
    在方式0,当串行接收第8位数据时,或在其他方式,串行接收到停止位的中间时,由内部硬件使RI置1,向CPU发送中断请求。
    在中断服务程序中,必须用软件将其清0,取消此中断申请。
    使用方式1时,SCON寄存器的配置
    低4位, TB8、RB8、TI、RI在设置模式时,都设置为0
    在这里插入图片描述
    SCON设置为0x50

1.2.2 PCON寄存器

其中只有一位SMOD与串行口工作有关。
在这里插入图片描述
SMOD(PCON7)波特率倍增位。
在串口方式1、2、3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍,复位时SMOD=0

二、波特率计算

在串行通信中,收发双方发送或接收数据的速率要有约定。
通过软件可将单片机串口编程为4种工作模式。

  • 方式0、2的波特率固定
  • 方式1、3的波特率可变,由定时器T1来决定。

当T1作为波特率发生器时,最典型的用法是使T1工作在自动重装载的8位定时器模式,即方式2。
TCON的TR1=1,以启动定时器。
串口工作在方式1的波特率计算公式:
B a u d = 2 S M O D / ( 32 × T 1 的定时时间 ) Baud = 2^{SMOD}/( 32 \times T1的定时时间) Baud=2SMOD/(32×T1的定时时间)

三、程序编写

3.1 步骤

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

  1. 确定T1的工作方式(编程TMOD寄存器)
  2. 计算T1的初值,重载TH1、TL1
  3. 启动T1(编程TCON中的TR1位)
  4. 确定串口控制(编程SCON寄存器)
  5. 串口在中断方式工作时,要进行中断设置(编程IE寄存器,IP寄存器用来设置优先级,一般不用改变)
  6. 打开串口中断以及总中断

3.2 示例程序

示例程序分为3个文件:uart.c、uart.h和main.c
uart.c文件

#include "uart.h"//串口初始化 
//晶振11.0592MHz
//设置的波特率为9600
void Uart_Init(){  //设置T1定时器TMOD=0x20;  //定时器工作在方式2//定时器初值TH1=0xfa;TL1=0xfa;  //自动重装载//SMOD是在PCON寄存器中,且不能使用位操作   PCON=0x80;  //1000 0000  倍频//打开定时器 TR1=1;//设置串行口控制 SCONSCON=0x50;//打开中断ES=1;  //打开串口中断EA=1;  //打开总中断
}
// 说明
// 设置的波特率为9600,其中的倍频,并不是将9600翻倍变为9600*2
// 而是在波特率为9600的情况下,改变了定时器T1的初值。//中断服务函数
//接收到的数据在SBUF这个寄存器中,SBUF是系统自定义好的,一个字节。
void Uart_IRQ() interrupt 4 {u8 rData;   rData=SBUF;  //RI清零等待下一次接收,取消中断申请,置1的过程是硬件自动完成的RI=0;  //将数据返回给发送方//通过发送缓冲器 SBUFSBUF=rData;//发送完成后 TI会被硬件置1while(!TI);  //等待数据发送完成TI=0;  //软件清零,等待下一次发送
}

对于串口通信,是一个字节一个字节的发送和接收,每发送/接收一个字节就会进入中断,处理这个字节。
51单片机中的发送/接收缓冲器都是SBUF,但是两者是有做隔离的(系统会自动区分)。

uart.h文件

#ifndef _UART_H_
#define _UART_H_#include <reg52.h>
void Uart_Init(void);#endif

main.c文件

#include <reg52.h>
#include "uart.h"void main(){Uart_Init();while(1);
}

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

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

相关文章

ELK集群搭建流程(实践可用)

一、概述 ELK 是一个由三个开源软件工具组成的数据处理和可视化平台&#xff0c;包括 Elasticsearch、Logstash 和 Kibana。这些工具都是由 Elastic 公司创建和维护的。 Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;可以将大量数据存储在一个或多个节点上&#xf…

Xilinx FPGA 超温关机保护

在UG480文档&#xff0c;有关于FPGA芯片热管理的介绍。 首先需要理解XADC中的 Over Temperature&#xff08;OT&#xff09;和User Temperature的关系。片上温度测量用于关键温度警告&#xff0c;也支持自动关机&#xff0c;以防止设备被永久损坏。片上温度测量在预配置和自动关…

【建议收藏】Kubernetes 网络策略入门:概念、示例和最佳实践,附云原生资料

目录 摘要 一、Kubernetes 网络策略组件 二、实施网络策略 示例 1&#xff1a;在命名空间中限制流量 示例 2&#xff1a;允许特定 Pod 的流量 示例 3&#xff1a;在单个策略中组合入站和出站规则 示例 4&#xff1a;阻止对特定 IP 范围的出站流量 三、Kubernetes 网络策…

Mac 手动安装 sshpass

1. 下载安装包 https://sourceforge.net/projects/sshpass/ 解压并进入到安装包目录 tar -zxvf sshpass-xx.xx.tar.gz cd sshpass-xx.xx2. 检验环境&#xff0c;编译源码安装 ./configuremake&&make install3. 检测安装是否成功 ▶ sshpass Usage: sshpass [-f|-…

Python爬虫(十八)_多线程糗事百科案例

多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:https://cloud.tencent.com/developer/article/1021994 Queue(队列对象) Queue是python中的标准库&#xff0c;可以直接import Queue引用&#xff1b;队列时线程间最常用的交互数据的形式。 python下多线程的思考…

python-爬虫-xpath方法-批量爬取王者皮肤图片

import requests from lxml import etree获取NBA成员信息 # 发送的地址 url https://nba.hupu.com/stats/players # UA 伪装 google header {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.3…

【MySQL基础|第一篇】——谈谈SQL中的DDL语句

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言&#xff…

C# 中什么是重写(子类改写父类方法)

方法重写是指在继承关系中&#xff0c;子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中&#xff0c;方法重写是一种多态的表现形式&#xff0c;它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重…

基于单片机的点阵电子显示屏上下左右移加减速系统

一、系统方案 本设计的任务就是完成一个1616的点阵设计&#xff0c;并能滚动显示“********************”内容。 主要内容是&#xff0c;能同时流动显示汉字&#xff1b;能实现显示汉字无闪烁&#xff1b;能实屏幕亮度较高。本LED显示屏能够以动态扫描的方式显示一个1616点阵汉…

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析

前言 首先&#xff0c;热烈祝贺家姐申请到了国家自然科学基金&#xff08;8月底&#xff09;&#xff0c;找一些化学领域的程序和软件&#xff0c;助我姐一臂之力&#xff0c;顺便自己研究一下源码。 卟啉类化合物的结构分析 PorphyStruct&#xff0c;一种用于分析不同卟啉类非…

ac7260网卡不能连5g

之前路由器是双频&#xff0c;最近为了连物联网一堆&#xff0c;把双频拆成两个wifi 结果电脑上装的pdd网卡就罢工了&#xff0c;连4g可以&#xff0c;但是连5g网络就不行&#xff0c;连上却没网&#xff0c;导致网盘下东西慢。刚开始以为是tplink的易展问题&#xff0c;结果看…

【继RNN之后的一项技术】Transfomer 学习笔记

谷歌团队在17年的神作&#xff0c;论文17年6月发布 https://arxiv.org/abs/1706.03762 被NIPS2017收录&#xff0c;目前引用量已经逼近3w。 以下内容参考李沐老师的课程《动⼿学深度学习(Pytorch版)》 简介 注意力 自主性&#xff1a;有目的的搜索某样东西&#xff08;键&…