当前位置: 首页 > news >正文

串口工作方式

串口工作方式

  • 方式0
    • 方式0输出
    • 方式0输入
  • 方式1
    • 方式1输出
    • 方式1输入
  • 方式2或方式3
    • 输出
    • 输入
  • 串口使用方法
    • 如何计算波特率
    • 串口初始化步骤
      • 串口回传实验
      • 模拟printf实验
      • 串口接收数据不丢失实验

方式0

方式 0 时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输 入或输出口。
数据由 RXD(P3.0)引脚输入或输出,同步移位脉冲由 TXD(P3.1) 引脚输出。发送和接收均为 8 位数据,低位在先,高位在后。波特率固定为 fosc/12

方式0输出

在这里插入图片描述

方式0输入

在这里插入图片描述

方式1

方式 1 是 10 位数据的异步通信口。TXD 为数据发送引脚,RXD 为数据接收引 脚,传送一帧数据的格式如下所示。其中 1 位起始位,8 位数据位,1 位停止位。
在这里插入图片描述

方式1输出

在这里插入图片描述

方式1输入

在这里插入图片描述

用软件置 REN 为 1 时,接收器以所选择波特率的 16 倍速率采样 RXD 引脚电 平,检测到 RXD 引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入 移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄 存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移 位。当 RI=0,且 SM2=0(或接收到的停止位为 1)时,将接收到的 9 位数据的前 8 位数据装入接收 SBUF,第 9 位(停止位)进入 RB8,并置 RI=1,向 CPU 请求中断。

方式2或方式3

输出

方式 2 或方式 3 时为 11 位数据的异步通信口。TXD 为数据发送引脚,RXD 为 数据接收引脚。

在这里插入图片描述

发送开始时,先把起始位 0 输出到 TXD 引脚,然后发送移位寄存器的输出位 (D0)到 TXD 引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由 TXD 引脚输出。第一次移位时,停止位“1”移入输出移位寄存器的第 9 位上, 以后每次移位,左边都移入 0。当停止位移至输出位时,左边其余位全为 0,检 测电路检测到这一条件时,使控制电路进行最后一次移位,并置 TI=1,向 CPU 请求中断。

输入

在这里插入图片描述

接收时,数据从右边移入输入移位寄存器,在起始位 0 移到最左边时,控制 电路进行最后一次移位。当 RI=0,且 SM2=0(或接收到的第 9 位数据为 1)时, 接收到的数据装入接收缓冲器 SBUF 和 RB8(接收数据的第 9 位),置 RI=1,向 CPU 请求中断。如果条件不满足,则数据丢失,且不置位 RI,继续搜索 RXD 引脚 的负跳变。

串口使用方法

如何计算波特率

在这里插入图片描述
(256 - TH1) = 11.0592M/12169600,所以TH1=TL1=250;

串口初始化步骤

如何使用串口,大家可以按照以下几个步骤配置。

  • ①确定 T1 的工作方式(TMOD 寄存器);
  • ②确定串口工作方式(SCON 寄存器);
  • ③计算 T1 的初值(设定波特率),装载 TH1、TL1;
  • ④启动 T1(TCON 中的 TR1 位);
  • ⑤如果使用中断,需开启串口中断控制位(IE 寄存器)。

串口回传实验

 //功能:串口回传实验,PC通过串口通讯工具,发送字符a或字符串hello,MCU回复相同内容#include "reg52.h"typedef unsigned int 	u16;
typedef unsigned char 	u8;
typedef unsigned long 	u32;//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(i=ms;i>0;i--)for(j=123;j>0;j--);
}						
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void);	  //串口1的初始化void main()
{Uart1_Init();while(1)	//保持应用程序不退出{}
}void Uart1_Init(void)//配置串口为工作方式1,定时器1,工作方式为2,8位自重载
{//串口模块寄存器PCON |= 0x80;			//使能波特率倍速位SMODSCON |= 0x50;			//配置串口工作方式1,允许接收数据//定时器1相关寄存器TMOD &= 0x0F;		//使用定时器1TMOD |= 0x20;		//配置工作方式2,8位自重载TL1 = 0xFA;			//设置定时计数器的低8位TH1 = 0xFA;			//设置定时计数器的高8位TR1 = 1;			//开启定时器1//中断相关寄存器ES = 1;			  	//串行口中断允许位EA = 1;				//CPU 中断允许(总允许)位
}void Uart1_Isp(void)	interrupt 4
{u8	u8RecData = 0;if(RI)	//检测串口接收完成中断{u8RecData = SBUF;		//将串口模块缓存寄存器中的数据读到用户内存	SBUF = 	u8RecData;		//将用户数据传输到串口缓存寄存器中,准备发送while(TI==0);			//用户在等待串口发送单元发送完成RI = 0;		//用户清除接收数据完成标志TI = 0;		//用户清除发送数据完成标志}
}

模拟printf实验

 //功能:实现printf的输出重定向#include "reg52.h"
#include "stdio.h"typedef unsigned int 	u16;
typedef unsigned char 	u8;
typedef unsigned long 	u32;//定义LED的引脚
sbit LED1 = P2^0;//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(i=ms;i>0;i--)for(j=123;j>0;j--);
}						
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void);	  //串口1的初始化
void Uart1_SendData(u8 u8data);		//串口1的发送数据void main()
{u16 i = 0;Uart1_Init();while(1)	//保持应用程序不退出{i++;delay_ms(1000);printf("i = %03d,hello world!\r\n",i);}
}void Uart1_Init(void)//配置串口为工作方式1,定时器1,工作方式为2,8位自重载
{//串口模块寄存器PCON |= 0x80;			//使能波特率倍速位SMODSCON |= 0x50;			//配置串口工作方式1,允许接收数据//定时器1相关寄存器TMOD &= 0x0F;		//使用定时器1TMOD |= 0x20;		//配置工作方式2,8位自重载TL1 = 0xFA;			//设置定时计数器的低8位TH1 = 0xFA;			//设置定时计数器的高8位TR1 = 1;			//开启定时器1//中断相关寄存器ES = 1;			  	//串行口中断允许位EA = 1;				//CPU 中断允许(总允许)位
}void Uart1_Isp(void)	interrupt 4
{u8	u8RecData = 0;if(RI)	//检测串口接收完成中断{u8RecData = SBUF;		//将串口模块缓存寄存器中的数据读到用户内存	switch(u8RecData){case 0x10:	LED1 = 1;break;case 0x11:	LED1 = 0;break;default:break;}RI = 0;		//用户清除接收数据完成标志}
}char putchar (char dat)	//标准C的输出重定向
{Uart1_SendData(dat);return dat;
}void Uart1_SendData(u8 u8data)
{SBUF = u8data;		//串口输出单元开始工作while(TI == 0)			//等TI为高电平,输出完成{}TI = 0;				//清除发送标志
}

串口接收数据不丢失实验

 //功能:串口接收长字符(50以内)不丢失数据,通过printf发送给PC#include "reg52.h"
#include "stdio.h"typedef unsigned int 	u16;
typedef unsigned char 	u8;
typedef unsigned long 	u32;u8 	u8Uart_Buffer[50]={0};		//串口缓存池
u8	u8Uart_Rx_STA = 0;		//串口接收状态标志
//bit7	0:表示没有接收完成,	1反之
//bit6	0:表示没有接收到'\r',	1反之
//bit5--bit0	表示接收到的有效数据长度//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(i=ms;i>0;i--)for(j=123;j>0;j--);
}						
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void);	  //串口1的初始化
void Uart1_SendData(u8 u8data);		//串口1的发送数据
void Uart1_RecvData(void);void main()
{u8 len = 0;Uart1_Init();while(1)	//保持应用程序不退出{if(u8Uart_Rx_STA & 0x80)	//串口数据接收完成{len = 	u8Uart_Rx_STA & 0x3f;u8Uart_Buffer[len] = 0;printf("%s\r\n",u8Uart_Buffer);u8Uart_Rx_STA = 0;		//清除状态标志}}
}void Uart1_Init(void)//配置串口为工作方式1,定时器1,工作方式为2,8位自重载
{//串口模块寄存器PCON |= 0x80;			//使能波特率倍速位SMODSCON |= 0x50;			//配置串口工作方式1,允许接收数据//定时器1相关寄存器TMOD &= 0x0F;		//使用定时器1TMOD |= 0x20;		//配置工作方式2,8位自重载TL1 = 0xFA;			//设置定时计数器的低8位TH1 = 0xFA;			//设置定时计数器的高8位TR1 = 1;			//开启定时器1//中断相关寄存器ES = 1;			  	//串行口中断允许位EA = 1;				//CPU 中断允许(总允许)位
}void Uart1_Isp(void)	interrupt 4
{u8	u8RecData = 0;if(RI)	//检测串口接收完成中断{Uart1_RecvData();RI = 0;		//用户清除接收数据完成标志}
}char putchar (char dat)	//标准C的输出重定向
{Uart1_SendData(dat);return dat;
}void Uart1_SendData(u8 u8data)
{SBUF = u8data;		//串口输出单元开始工作while(!TI);			//等TI为高电平,输出完成TI = 0;				//清除发送标志
}void Uart1_RecvData(void)
{u8 r = SBUF;if((u8Uart_Rx_STA & 0x80) == 0)//没有接收完成{if(u8Uart_Rx_STA & 0x40){if(r!='\n'){u8Uart_Rx_STA = 0;		//将状态清0}else{u8Uart_Rx_STA |= 0x80;	//标记数据接收完成}}else	//还没有接收过'\r'{if(r == '\r'){u8Uart_Rx_STA |= 0x40;	//标记数据接收到\r}else{if((u8Uart_Rx_STA & 0x3f)<48){u8Uart_Buffer[u8Uart_Rx_STA++] = r;}else{u8Uart_Rx_STA = 0;}}}}
}

相关文章:

串口工作方式

串口工作方式 方式0方式0输出方式0输入 方式1方式1输出方式1输入 方式2或方式3输出输入 串口使用方法如何计算波特率串口初始化步骤串口回传实验模拟printf实验串口接收数据不丢失实验 方式0 方式 0 时&#xff0c;串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输 入…...

统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现

要统计Nginx的客户端IP&#xff0c;可以通过分析Nginx的访问日志文件来实现。以下是一些常见的方法和步骤&#xff1a; 一、通过命令行工具统计 查看Nginx访问日志&#xff1a; Nginx的访问日志通常默认存储在/var/log/nginx/access.log&#xff0c;但具体位置可能因安装和配置…...

Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反&#xff0c;由于它的简单性和可扩展性&#xff0c;它已经获得了普及。在本文中&#xff0c;我将尝试概述它的主要概念&#xff0c;并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …...

42 基于单片机的智能浇花系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值&#xff0c;温度大于阈值则开启水泵&#xff0c;湿度大于阈值则开启风扇…...

乐橙云小程序插件接入HbuilderX

乐橙插件使用&#xff1a; 1.配置app.json文件&#xff0c;uniapp中在mainfest.json中配置 https://uniapp.dcloud.net.cn/collocation/manifest.html#mp-weixin ** 2、集成插件页面.json文件 ** uniapp在 pages.json 对应页面的 style -> usingComponents 引入组件&…...

VoCo-LLaMA: Towards Vision Compression with Large Language Models

视觉语言模型在各种多模态任务上取得了显著的成功&#xff0c;但经常受到有限上下文窗口和处理高分辨率图像输入和视频的高计算成本的瓶颈。视觉压缩可以通过减少视觉令牌数量避免该问题。先前方法使用额外模块压缩视觉令牌并强制LLM理解压缩的令牌。然而&#xff0c;LLM对视觉…...

Vue+vite 组件开发的环境准备

一.nodejs安装 进入Node.js 官网&#xff08;Node.js — Run JavaScript Everywhere&#xff09;&#xff0c;点击下载。 双击打开&#xff0c;进行安装 双击打开后&#xff0c;点击 next&#xff08;下一步&#xff09;,后面也是一直点击 next 无其他设置&#xff0c;直到 …...

基于社区发现的GraphRAG思路

GraphRAG出自2024年4月的论文《From Local to Global: A Graph RAG Approach to Query-Focused Summarization》&#xff0c;其代码也在2024年年中开源 。它在用图结构来完成RAG时&#xff0c;使用社区这个概念并基于社区摘要来回答一些概括性的问题。 Graph RAG流程如论文图1所…...

react学习记录

一、目录结构react优秀代码之react目录结构简洁之道React 作为一个库&#xff0c;不会决定你如何组织项目的结构。这是件好事&#xff0c;因为这样 - 掘金【React】项目的目录结构全面指南_react项目结构-CSDN博客 1、创建项目&#xff1a;开发文档 Getting Started | Create…...

Day2——需求分析与设计

教师端签到应用软件的需求分析&#xff1b; 产品经理如何写好产品需求文档&#xff08;附模板&#xff09; 需求分析是软件开发过程中的关键步骤&#xff0c;它确保了开发的软件能够满足用户的需求。以下是进行需求分析的具体步骤&#xff1a; 1. 确定分析目标 明确教师端签到…...

VScode离线下载扩展安装

在使用VScode下在扩展插件时&#xff0c;返现VScode搜索不到插件&#xff0c;网上搜了好多方法&#xff0c;都不是常规操作&#xff0c;解决起来十分麻烦&#xff0c;可以利用离线下载安装的方式安装插件&#xff01;亲测有效&#xff01;&#xff01;&#xff01; 1.找到VScod…...

【机器学习】机器学习的基本分类-监督学习-决策树(Decision Tree)

决策树是一种树形结构的机器学习模型&#xff0c;适用于分类和回归任务。它通过一系列基于特征的条件判断来将数据分割为多个子区域&#xff0c;从而预测目标变量的值。 1. 决策树的结构 根节点&#xff08;Root Node&#xff09; 决策树的起点&#xff0c;包含所有样本。根据某…...

【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤

目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步&#xff1a;定义程序的目标 1.8.2 第 2 步&#xff1a;设计程序 1.8.3 第 3 步&#xff1a;编写代码 1.8.4 第 4 步&#xff1a;编译 1.8.5 第 5 步&#xff1a;运行程序 1.8.6 第 6 步&#xff1a;测试和调试程序 1.8.…...

Docker 使用 Dockerfile 文件打包部署前端项目

编写 Dockerfile 文件&#xff1a; FROM nginx:latest ADD dist /etc/nginx/html/dist COPY nginx.conf /etc/nginx/nginx.conf ENV PATH /usr/sbin:$PATH EXPOSE 80 ENTRYPOINT ["nginx"] CMD ["-g","daemon off;"]编写 nginx.conf 文件&#…...

HTML-全

. CSS css后缀名的文件被html引用 在HTML中&#xff0c;CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种用于设置网页上的文本内容、图片布局和版面设计等外观样式的样式表语言。简单来说&#xff0c;CSS定义了HTML元素如何显示在浏览器中。…...

高效流程图绘制:开发设计流程图利器

在选择画流程图的工具时&#xff0c;不同的项目和使用场景会决定最佳的工具。以下是几款常见的流程图工具&#xff0c;并结合具体项目使用场景提供建议&#xff1a; 1. Lucidchart 特点&#xff1a; 在线协作&#xff1a;支持多人实时协作&#xff0c;适合团队合作。模板丰富&…...

数据仓库的概念

先用大白话讲一下&#xff0c;数据仓库的主要目的就是存储和分析大量结构化数据的。 > 那么它的核心目的是&#xff1a;支持商业智能&#xff08;BI&#xff09;和决策支持系统&#xff0c;也就是说&#xff0c;它不仅仅是为了存储&#xff0c;更重要的是为了分析提供便利。…...

AI - 谈谈RAG中的查询分析(2)

AI - 谈谈RAG中的查询分析&#xff08;2&#xff09; 大家好&#xff0c;RAG中的查询分析是比较有趣的一个点&#xff0c;内容丰富&#xff0c;并不是一句话能聊的清楚的。今天接着上一篇&#xff0c;继续探讨RAG中的查询分析&#xff0c;并在功能层面和代码层面持续改进。 功…...

Java基础面试题,46道Java基础八股文(4.8万字,30+手绘图)

Java是一种广泛使用的编程语言&#xff0c;由Sun Microsystems&#xff08;现为Oracle Corporation的一部分&#xff09;在1995年首次发布。它是一种面向对象的语言&#xff0c;这意味着它支持通过类和对象的概念来构造程序。 Java设计有一个核心理念&#xff1a;“编写一次&am…...

taro小程序马甲包插件

插件名 maloulab/taro-plugins-socksuppet-ci maloulab/taro-plugins-socksuppet-ci安装 yarn add maloulab/taro-plugins-socksuppet-ci or npm i maloulab/taro-plugins-socksuppet-ci插件描述 taro官方是提供了小程序集成插件的tarojs/plugin-mini-ci &#xff0c;且支持…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...