day07 51单片机-串口通信

news/2024/5/4 1:36:35

51 单片机-串口通信

1 串口通信

1.1 需求描述

本案例讲解如何通过串口和PC以9600波特率,无校验位、1停止位通信。最终实现PC向单片机发送字符串,单片机回复PC。本案例中采用串口1通信。

1.2 硬件设计

1.2.1 串口工作原理

串口是将数据按照比特逐一发送的通信接口。在串口通信中,最重要的参数是波特率。在单片机中,波特率等于1s内传输的比特数。

串口通信中,要将波特率调整为9600,要求1秒钟内刚好发送9600个时钟信号,需要一个9600Hz的时钟源。单片机使用串口通信时,必须占用定时器1作为时钟源。定时器1每溢出1次,发送一个时钟信号。只要让它每秒钟溢出9600次即可。

串口通信需要占用定时器1,同时需要设置一些基本参数。

​ 串口工作模式设置为1(8位UART,波特率可变)。

​ 波特率要设置为9600。

在这里插入图片描述

1.1.2 串口具体设置

具体参数设置方式,需要配置串口通信,初始化流程如下:

在这里插入图片描述

1)SCON

在这里插入图片描述

​ SM0、SM1:本案例中采用 0、1工作方式。

在这里插入图片描述

​ SM2:在方式1时,如果SM2位为1,则只有在接收到有效的停止位时才置位中断请求标志位RI为1,如果SM2为0,则无论是否接收到有效的停止位都可以置位RI。官方推荐模式1,SM2应设置为0。

​ REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。

​ TI:发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位。

​ RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时,由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中串行接收到停止位的中间时刻由内部硬件置位,即RI=1,必须由软件复位即RI=0。

从以上内容中可以看出,我们应该进行如下设置:

SM0SM1SM2RENTB8B8TIRI
01010000

2)PCON

在这里插入图片描述

​ SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波特率加倍;SMOD=0,则各工作方式的波特率加倍。复位时SMOD=0。

PCON的主要作用是波特率选择。

#define FOSC     11059200 // 晶振频率
#define NT       12 // 单片机的工作周期为12T#define T2TEMP    256 - (FOSC / NT / 32 / BAUD_RATE)

3)SBUF

在这里插入图片描述

SBUF是串行口缓冲寄存器,地址为99H,实际上是2个缓冲器,发送SBUF和接收SBUF。写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。STC89C5xRC.H中已有如下声明。

sfr SBUF = 0x99;

对该变量赋值即可写入发送SBUF寄存器,读取该变量即可读取接收SBUF寄存器。

4)定时器1相关变量

在这里插入图片描述

目前为止我们已经可以通过设置TH1的值来设置串口波特率。TH1这个变量属于定时器1,也就是说当串口工作时,定时器1要被占用。关于定时器1的寄存器如下:

TL1/TH1:定时器相关变量:

在这里插入图片描述

其中关于定时器0的相关变量解释:

变量作用
TF1定时器T1溢出标志。T1被允许计数以后,从初值开始加1技术。当最高位产生溢出时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”TF1。这一位的置位和清零都可以由硬件控制,不需要软件控制。
TR1定时器1运行开关,置1开启定时器0,置0关闭定时器0
GATE计数器模式外部输入控制(定时器模式必须置为0)
C/T(——)置0表示定时器模式,1表示计数器模式
M1、M0(低4bit)M1=1,M0=0表示8位自动重载定时器,当溢出时将TL1存放的值自动重装入TH1.
TL1定时器1低8位寄存器
TH1定时器1高8位寄存器

综上所述,最终串口的初始化代码如下:

//波特率
#define BAUD_RATE 9600
//定时器初始值
#define T2TEMP    256 - (FOSC / NT / 32 / BAUD_RATE)void Dri_UART_Init()
{ // 设置串口工作模式SM0 = 0;SM1 = 1;SM2 = 0;REN = 1;//接受和发送完成标识//TI 1 :已经有数据//TI 0 :无数据数据//RI 1 :数据正在接收//RI 0 :无数据在接收TI  = 1

http://www.mrgr.cn/p/16048611

相关文章

开源博客项目Blog .NET Core源码学习(17:App.Hosting项目结构分析-5)

本文学习并分析App.Hosting项目中前台页面的作品展示页面和首页页面。 作品展示页面 作品展示页面总体上为上下布局,上方显示导航菜单,下方从左向右显示图片数据,支持放大查看图片和下载图片。整个页面使用了layui中的面包屑导航、弹出层、流…

如何判别三角形和求10 个整数中最大值?

分享每日小题,不断进步,今天的你也要加油哦!接下来请看题------> 一、已知三条边a,b,c能否构成三角形,如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形或普通三角形 …

读天才与算法:人脑与AI的数学思维笔记07_数字绘画

数字绘画1. 数字绘画 1.1. 事物的可预测性与不可预测性构成了我们熟识的世界 1.1.1. 汤姆斯托帕德(Tom Stoppard) 1.2. 艺术作品就是通过各种形式给人带来美的感受,从而使人们获得精神上的愉悦与放松 1.3. “像素化”的画作激发了人…

jmeter 指定QPS压测接口

文章目录 jmeter 指定QPS压测接口更换语言为中文创建测试任务新建线程组右键线程组,新建http request,填写要你要压测的接口地址、参数如果需要自定义请求头,添加一个Http头信息管理器要查看结果和QPS统计数据,给上门的http请求添…

牛客NC162 二叉树中和为某一值的路径(三)【中等 dfs C++、Java、Go、PHP】

题目 题目链接: https://www.nowcoder.com/practice/965fef32cae14a17a8e86c76ffe3131f 思路 既然要找所有路径上节点和等于目标值的路径个数,那我们肯定先找这样的路径起点啊, 但是我们不知道起点究竟在哪里, 而且任意节点都有…

项目大集成

一 keeplived 高可用 192.168.11.11nginx keeplived192.168.11.12nginx keeplived 两台均编译安装服务器 1 主服务器修改文件: 2 备服务器修改文本 scp keepalived.conf 192.168.11.12:/etc/keepalived/ 3 给主服务器添加虚拟ip ifconfig ens33:0 192.168…

机器学习-10-基于paddle实现神经网络

文章目录 总结参考本门课程的目标机器学习定义第一步:数据准备第二步:定义网络第三步:训练网络第四步:测试训练好的网络 总结 本系列是机器学习课程的系列课程,主要介绍基于paddle实现神经网络。 参考 MNIST 训练_副…

Linux:进程状态

Linux:进程状态 进程状态运行状态R状态 阻塞状态S状态D状态T状态t状态 挂起状态僵尸进程 & 孤儿进程X状态Z状态孤儿进程 进程状态 当一个可执行程序,被载入内存,获得自己的PCB,那么其就可以变成一个进程。也许你学习过一些进…

java高校办公室行政事务管理系统设计与实现(springboot+mysql源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于mvc的高校办公室行政…

AJAX——Promise-链式调用

1.Promise链式调用 概念:依靠then()方法会返回一个新生成的Promise对象特性,继续串联下一环任务,知道结束 细节:then()回调函数中的返回值,会影响新生成的Promise对象最终状态和结果 好处:通过链式调用&…

【Java基础】23.接口

文章目录 一、接口的概念1.接口介绍2.接口与类相似点3.接口与类的区别4.接口特性5.抽象类和接口的区别 二、接口的声明三、接口的实现四、接口的继承五、接口的多继承六、标记接口 一、接口的概念 1.接口介绍 接口(英文:Interface)&#xf…

鸿蒙OpenHarmony【小型系统编写“Hello World”程序】 (基于Hi3516开发板)

编写“Hello World”程序 下方将展示如何在单板上运行第一个应用程序,其中包括新建应用程序、编译、烧写、运行等步骤,最终输出“Hello World!”。 前提条件 已参考[创建工程并获取源码],创建Hi3516开发板的源码工程。 鸿蒙开发…

如何处理Keil uVision5注释无法输入汉字且输入汉字变成问号的问题

好久没用KEIL,今天在注释中出现无法输入汉字的情况,且输入或粘贴的汉字都变成了问号,解决方法很简单,将General Editor Settings: Encoding:设置为Chinese GB2312(Simplified)即可(出现问号的当前设置是Encode in ANSI…

海外云手机怎么解决tiktok运营难题?

最近打算做TikTok的商家越来越多了,而做TikTok的第一步就面临如何养号、涨粉的困境,本文将介绍如何通过海外云手机轻松解决这些问题。 早期大家用的比较多的,是真机科学上网的方法。但是这种方法,需要自己搭建海外环境&#xff0c…

day04 51单片机-矩阵按键

1 矩阵按键 1.1 需求描述 本案例实现以下功能:按下矩阵按键SW5到SW20,数码管会显示对应的按键编号。 1.2 硬件设计 1.2.1 硬件原理图 1.2.2 矩阵按键原理 1.3软件设计 1)Int_MatrixKeyboard.h 在项目的Int目录下创建Int_MatrixKeyboard…

【创建型模式】单例模式

一、单例模式概述 单例模式的定义:又叫单件模式,确保一个类只有一个实例,并提供一个全局访问点。(对象创建型) 要点: 1.某个类只能有一个实例;2.必须自行创建这个实例;3.必须自行向整…

探索RadSystems:低代码开发的新选择(二)

系列文章目录 探索RadSystems:低代码开发的新选择(一)🚪 文章目录 系列文章目录前言一、RadSystems Studio是什么?二、用户认证三、系统角色许可四、用户记录管理五、时间戳记录总结 前言 在数字化时代,低…

HarmonyOs开发:导航tabs组件封装与使用

前言 主页的底部导航以及页面顶部的切换导航,无论哪个系统,哪个App,都是最常见的功能之一,虽然说在鸿蒙中有现成的组件tabs可以很快速的实现,但是在使用的时候,依然有几个潜在的问题存在,第一&a…

CountDownLatch倒计时器源码解读与使用

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. CountDownLatch有什么用 3. CountDownLatch底层原理 3.1. count…

不如你把我杀了吧 | 绘制自定义的 3D 地图

如何根据自己的json数据绘制类似这种地图,仅供参考 1、准备数据。 因为自定义,所以全部的数据都来源自己。我们需要准备地图数据(包括但不限于地图轮廓数据,点数据) 这里我的数据使用的是arcgis导出json数据,因此数据格式足够规范,这省去了很多的麻烦。 2、导入相关库、…