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

07:串口通信二

串口编程

  • 1、与波特率之相关的寄存器
  • 2、PCON寄存器
  • 3、SCON寄存器
  • 4、配置的代码分析
  • 5、向PC发送一段字符串
  • 6、PC机向单片机发送字符控制LED1灯的亮灭

1、与波特率之相关的寄存器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8DCWyk5-1720973827296)(https://i-blog.csdnimg.cn/direct/e3d9031f80624989965e2c7032d80458.png)]

如图,与串口通信相关的寄存器主要是SCON和PCON寄存器。

2、PCON寄存器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K8GFUA4e-1720973827300)(https://i-blog.csdnimg.cn/direct/1fde62fb51c7497e970738a39950ff7f.png)]

SMOD:为1时,通信方式1,2,3波特率加倍,为0时不加倍。
SMOD0:帧错误检测位,为1时,SCON寄存器中的SM0用于帧错误检测。为0时,用于指定的串口工作方式

3、SCON寄存器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ROY56emb-1720973827301)(https://i-blog.csdnimg.cn/direct/ca0be444120045fa9fb3f54e7c9a1364.png)]

SM0:当PCON的SMOD0为1时,这个位用于帧错误检测。当SMOD0为0时,则用于通信方式的选择
SM0,SM1:
0     0           工作方式0 
0     1           工作方式1           8位异步位数据传输(波特率可配)
1     0           工作方式2           9位(波特率不可配)
1     1           工作方式3           9位(波特率可配)
SM2:允许方式2,3多机控制
REN:运行接收控制位,为1,允许接收;为0,禁止接收。
TB8/RB8先不管它
T1:发送中断请求
R1:接收中断请求
  • 工作方式0的波特率 = 系统晶振/12 = 11.0592MHz/12=11059200/12
  • 工作方式1的波特率 = (2^SMOD/32)*定时器1的溢出率
  • 工作方式2的波特率 = (2^SMOD/64)*11.0592MHz
  • 工作方式3的波特率 = (2^SMOD/32)*定时器1的溢出率

定时器1的溢出率:

  • 工作在12T时:溢出率 = 11.0592MHz / 12 / (256 - TH1)
  • 工作在6T时:溢出率 = 11.0592MHz / 6 / (256 - TH1)

4、配置的代码分析

void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位数据,可变波特率AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12TAUXR &= 0xFE;		//串口1选择定时器1为波特率发生器TMOD &= 0x0F;		//清除定时器1模式位TMOD |= 0x20;		//设定定时器1为8位自动重装方式TL1 = 0xFD;		//设定定时初值TH1 = 0xFD;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1
}
PCON &= 0X7F;代表PCON变为0xxx xxxx,则最高位变为0,其他位不变。因为PCON的初始值为00x1 0000,所以PCON = 00x1 0000,代表波特率不加倍
SCON = 0x50; 代表0101 0000。8位数据传输(波特率可变),可以读取数据
AUXR = 0X01; 代表降低时钟对外界的辐射
TMOD &= 0X0F;
TMOD |= 0X20; 代表TMOD = 0010 0000,选用定时器1,且为8位自动重装,低8位溢出时,自动将高8位的值给低8位
TL1 = 0XFD;
TH1 = 0XFD; 代表1111 1101,波特率 = (2^0/32)*(11059200/12/(256 - 253)) = 9600,则波特率为9600
TR1 = 1;打开定时器1。

5、向PC发送一段字符串

代码①:

#include <REGX52.H>
#include "intrins.h"sfr AUXR = 0X8E;void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//波特率9600
{PCON &= 0x7F;		//波特率不倍速SCON = 0x40;		//8位数据,可变波特率AUXR = 0x01;	TMOD &= 0x0F;		//清除定时器1模式位TMOD |= 0x20;		//设定定时器1为8位自动重装方式TL1 = 0xFD;		//设定定时初值TH1 = 0xFD;		//设定定时器重装值TR1 = 1;		//启动定时器1
}void sendByte(char data_sj)
{SBUF = data_sj;/*单片机向SBUF里面开始写入数据,注意是开始,要经过一段时间才能写入完毕*/
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{UartInit();while(1){sendString("wohaoshuai");Delay1000ms();}
}

出现的现象:

wwwoohhwwo

  • 为什么是乱的喃?

因为啊,单片机向SBUF写入数据需要移位寄存器进行操作,而移位寄存器操作也是需要时间的,假设需要10us。当第一个数据写入并发送出去后,要等一段时间第二个数据才能写入成功,而这段时间SBUF里面只有一个w,而发送数据不需要时间,所以他会不断的把SBUF里面的w进行向外发送。
在这里插入图片描述

其实可以这样理解,如上图:SBUF = data_sj;开始向SBUF里面写入数据,而在这段代码后面,有一行代码代表着将SBUF里面的数据输出给上位机只是系统将这行代码隐藏起来了。不然程序员自己编写类似:SBUF = data-sj;开始向SBUF里面写入数据internal = SBUF 将SBUF里面的数据输出给上位机 (被隐藏)
  • 解决方法1:
    只需要在写入SBUF后面添加一个延迟函数,等待向SBUF成功写入数据后,然后才执行数据输出的代码

代码①:

void sendByte(char data_sj)
{SBUF = data_sj;//开始向SBUF里面写入数据Delay10ms();//等待10ms,让数据成功写入SBUF里面internal = SBUF;//这行代码被隐藏了,不可编辑的
}
  • 解决方法2:
    通过中断请求标志位
    在这里插入图片描述

如图,当使用工作方式1(8位数据传输),当8位数据通过移位寄存器成功写入结束时,TI变为1。例如第二个o用8位二进制数据表示,当第8位通过移位寄存器成功写入时,也代表着字符o成功的被写入SBUF里面,此时TI自动变为1,但是变为1后需要手动置0 ,以便下次数据的写入成功标志
代码②:

void sendByte(char data_sj)
{SBUF = data_sj;while(!TI);/*还没有写入完毕时,TI=0,则一直困在这个循环里面,当写入完毕时,TI=1,退出循环,进入下一行程序*/TI = 0;
}

还没有写入完毕时,TI=0,则一直困在这个循环里面,当写入完毕时,TI=1,退出循环,进入下一行程序

6、PC机向单片机发送字符控制LED1灯的亮灭

#include <REGX52.H>
#include "intrins.h"sfr AUXR = 0X8E;
sbit LED1 = P3^7;void Delay300ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//波特率9600
{PCON &= 0x7F;		//波特率不倍速SCON = 0x40;		//8位数据,可变波特率REN = 1;				//运行单片机读取数据AUXR = 0x01;	TMOD &= 0x0F;		//清除定时器1模式位TMOD |= 0x20;		//设定定时器1为8位自动重装方式TL1 = 0xFD;		//设定定时初值TH1 = 0xFD;		//设定定时器重装值TR1 = 1;		//启动定时器1
}void main()
{char mark;//第一一个mark存储字符LED1 = 1;UartInit();while(1){Delay300ms();if(RI == 1)  //表示上位机给单片机的SBUF已经写入数据完成了,RI会自动变为1,而需要手动置0,以便下次写入完成进行标志。{RI = 0;//手动置0mark = SBUF;  //将SBUF里面的数存放在变量mark中if(mark == 'o')//如果读取的字符是O{LED1 = 0; //开灯}if(mark == 'c'){LED1 = 1;}}}
}

其实可以这样理解:

mark = SBUF;代表着将SBUF里面的数据交给mark这个变量。而在行代码之前,同样有一行代码代表着上位机将数据写入SBUF。只是这行代码被隐藏,不可编辑类似:SBUF = internal; 上位机将数据写入SBUF(被隐藏)mark = SBUF; SBUF将数据存在变量mark中

在这里插入图片描述

同理,RI代表着数据是否被成功写入SBUF里面,上位机成功将数据写入SBUF里面。则RI会自动变为1,同样的需要手动置0,以便下次数据的写入标志

相关文章:

07:串口通信二

串口编程 1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭 1、与波特率之相关的寄存器 如图&#xff0c;与串口通信相关的寄存器主要是SCON和PCON寄存器。 2、PCON寄存器 SMOD&#xff1…...

识别视频中的人数并统计出来

目的: 使用Python和pysimpleguil以及opencv写一个统计人流量的软件。要求:1 加载选定的视频 2 通过形态学特征识别人,3统计人数并且在界面上显示出来,4 保存识别出人数的信息。 步骤 1: 安装必要的库 首先,确保你已经安装了Python。然后,安装PySimpleGUI和OpenCV。你可…...

【TypeDB 】机器学习和符号 AI 在机器人技术中的作用

机器学习和符号 AI 在机器人技术中的作用 煤油灯科技2022-06-29 14:23前言 机器人学是计算机科学中的一个多学科领域,致力于机器人的设计和制造,机器人在制造、太空探索和国防等行业都有应用。虽然该领域已经存在了 50 多年,但随着科幻小说成为现实,波士顿动力公司的Spot和…...

EPLAN 去掉PDF中的红色跳转标识

EPLAN PDF图纸导出后体验跳转标识会有红色标识&#xff0c;如何去掉呢&#xff1f;下面介绍一下方法&#xff1a; 此为现象&#xff1a; EPLAN 2.9的帮助文档里提示&#xff1a; 在导出的 PDF 文档中&#xff0c;跳转后的跳转目标现在通过红色的闪烁框进行标识。可能的跳转目…...

【car】深入浅出学习机械燃油车知识、结构、原理、维修、保养、改装、编程

汽车的五大总成通常是指发动机、变速器、前后桥、车架和悬挂系统。 发动机&#xff1a;是汽车的动力来源&#xff0c;负责将燃料的化学能转化为机械能&#xff0c;驱动汽车行驶。常见的发动机类型有内燃机&#xff08;如汽油发动机、柴油发动机&#xff09;和电动机&#xff0…...

语音识别概述

语音识别概述 一.什么是语音&#xff1f; 语音是语言的声学表现形式&#xff0c;是人类自然的交流工具。 图片来源&#xff1a;https://www.shenlanxueyuan.com/course/381 二.语音识别的定义 语音识别&#xff08;Automatic Speech Recognition, ASR 或 Speech to Text, ST…...

勒索防御第一关 亚信安全AE防毒墙全面升级 勒索检出率提升150%

亚信安全信舷AE高性能防毒墙完成能力升级&#xff0c;全面完善勒索边界“全生命周期”防御体系&#xff0c;筑造边界勒索防御第一关&#xff01; 勒索之殇&#xff0c;银狐当先 当前勒索病毒卷携着AI技术&#xff0c;融合“数字化”的运营模式&#xff0c;形成了肆虐全球的网…...

elementui 日历组件el-calendar使用总结

功能&#xff1a; 1.日历可以周视图、月视图切换&#xff1b; 2.点击月视图中日期可以切换到对应周视图&#xff1b; 3.点击周视图查看当日对应数据&#xff1b; 4.周、月视图状态下&#xff0c;点击前后按钮&#xff0c;分别切换对应上下的周、月&#xff1b; 5.点击回到…...

RK3568 安卓12 EC20模块NOCONN没有ip的问题(已解决)

从网上东拼西凑找了不少教程&#xff0c;但是里面没有提到rillib.so需要替换&#xff0c;替换掉就可以上网了&#xff0c;系统也有4G图标了。 注意&#xff0c;这个rillib.so是移远提供的。把他们提供的文件放到rk3568_android_sdk/vendor/rockchip/common/phone/lib下&#x…...

【NLP自然语言处理】基于BERT实现文本情感分类

Bert概述 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种深度学习模型&#xff0c;用于自然语言处理&#xff08;NLP&#xff09;任务。BERT的核心是由一种强大的神经网络架构——Transformer驱动的。这种架构包含了一种称为自注…...

CSS选择器(1)

以内部样式表编写CSS选择器&#xff0c;其主要编写在<head></head>元素里&#xff0c;通过<style></style>标签来定义内部样式表。 基本语法为&#xff1a; 选择器{ 声明块 } 声明块&#xff1a;是由一对大括号括起来&#xff0c;声明块中是一个一个的…...

Claude 3.5 Sonnet模型发布,对比ChatGPT4o孰强孰弱

Anthropic 这家生而为打击 OpenAI 安全问题的公司&#xff0c;正式发布了Claude 3.5 Sonnet模型&#xff01; 用官网的话就是&#xff1a; 今天&#xff0c;我们推出了 Claude 3.5 Sonnet&#xff0c;这是我们即将推出的 Claude 3.5 型号系列中的第一个版本。Claude 3.5 Sonne…...

MySQL 分库分表

分表 分表 将表按照某种规则拆分成多个表。 分表的使用原因 当数据量超大的时候&#xff0c;B-Tree索引效果很变差。 垂直分区 切分原则&#xff1a;把不常用或存储内容比较多的字段分到新的表中可使表存储更多数据。 原因&#xff0c;Innodb主索引叶子节点存储着当前行的所有信…...

AutoMQ 社区双周精选第十二期(2024.06.29~2024.07.12)

本期概要 欢迎来到 AutoMQ 第十一期双周精选&#xff01;在过去两周里&#xff0c;主干动态方面&#xff0c;AutoMQ 跟进了 Apache Kafka 3.4.x BUG 修复&#xff0c;并进行了CPU & GC 性能优化&#xff0c;另外&#xff0c;AutoBalancing 的 Reporter 和 Retriever 也将支…...

Web开发:<div>标签作用

div作用 介绍基本用法特点和用途样式化示例嵌套示例与其他标签的对比总结 介绍 在Web开发中&#xff0c;<div> 标签是一个通用的容器元素&#xff0c;用于将HTML文档中的内容分组。它是一个块级元素&#xff0c;通常用于布局目的&#xff0c;因为它可以包含其他块级元素…...

如何使用unittest框架来编写和运行单元测试

Python 的 unittest 框架是用于编写和运行可重复的测试的一个强大工具。它允许你定义测试用例、测试套件、测试运行器和测试固件&#xff08;fixtures&#xff09;&#xff0c;从而系统化地测试你的代码。以下是如何使用 unittest 框架来编写和运行单元测试的基本步骤&#xff…...

2024最新超详细SpringMvc常用注解总结

SpringMVC常用注解 控制器&#xff08;Controller&#xff09;相关注解&#xff1a; 1.Controller Controller 注解用于标识一个类为 Spring MVC 的控制器&#xff0c;它能够处理用户的请求并返回相应的视图或数据。通常与 RequestMapping 注解一起使用&#xff0c;以定义请求…...

Linux硬件中断(IRQ)的基础知识

目录 一、中断的概念1.1 什么是硬件中断1.2 中断类型二、中断处理的工作原理2.1 中断请求2.2 中断向量2.3 中断服务例程(ISR)2.4 上下文切换2.5 中断处理2.6 任务恢复三、中断处理的编程3.1 注册中断处理函数3.2 注销中断处理函数四、中断和系统性能4.1 中断风暴4.2 IRQ亲和性…...

DP讨论——适配器模式

学而时习之&#xff0c;温故而知新。 敌人出招&#xff08;使用场景&#xff09; 说是自己的程序对接第三方的库&#xff0c;但是自己的代码的接口设计完毕了&#xff0c;如何对接上&#xff1f; 你出招 适配器模式就是为此而生的——我觉得应该是该解决方法被命名为了适配…...

window下tqdm进度条

原代码是linux下运行&#xff0c;修改后可在window下运行。 #ifndef TQDM_H #define TQDM_H#include <chrono> #include <ctime> #include <numeric> #include <ios> #include <string> #include <cstdlib> #include <iostream> #i…...

CANN/asc-devkit同步通知API文档

asc_sync_notify 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcod…...

Universal Router与Express/Koa对比分析:选择最适合你的路由方案

Universal Router与Express/Koa对比分析&#xff1a;选择最适合你的路由方案 【免费下载链接】universal-router A simple middleware-style router for isomorphic JavaScript web apps 项目地址: https://gitcode.com/gh_mirrors/un/universal-router Universal Route…...

Word文档保护技巧:防止内容被轻易复制

Word文档如何防止复制呢&#xff1f;其实&#xff0c;Word根本没有真正意义上的禁止复制&#xff0c;因为用户按一下手机截图&#xff0c;或者拍张照片&#xff0c;内容照样能拿走。但是&#xff0c;我们可以提高复制门槛&#xff0c;也就是让其他用户通过“CtrlC”无法直接复制…...

10B小模型为何在真实业务中碾压百B大模型

1. 项目概述&#xff1a;小模型正在悄悄改写大模型的游戏规则最近在几个技术团队的内部分享会上&#xff0c;我连续三次被问到同一个问题&#xff1a;“你们还在追着百B参数的大模型跑吗&#xff1f;”——问话的人里&#xff0c;有刚从云厂商调来的架构师&#xff0c;有带AI产…...

书匠策AI:让毕业论文从“熬秃头“变成“点一下“的黑科技全解读

各位正在被毕业论文折磨得睡不着觉的同学们&#xff0c;先别急着打开第18个浏览器标签页去查资料了。今天这篇文章&#xff0c;我要用最接地气的方式&#xff0c;给你们扒一扒一个叫书匠策AI的工具——它到底能帮你把论文这件事"省事"到什么程度。 官网地址先存好&a…...

2026免费在线去水印软件怎么选?实测5款推荐+功能对比指南

为什么需要去水印工具&#xff1f; 在内容创作和日常使用中&#xff0c;水印是版权保护的重要标志&#xff0c;但有时我们需要处理自己拥有版权的内容或进行合法的编辑操作。无论是整理自己的工作素材、编辑设计稿&#xff0c;还是去除合法获取内容上的平台标记&#xff0c;都需…...

智能驾驶系统场景下的自动化仿真测试评价技术【附仿真】

✨ 长期致力于智能驾驶系统、有效性评价、测试用例生成、测试场景优化、自动化仿真测试平台研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于复杂度…...

CANN/asc-devkit atanf函数文档

atanf 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann…...

【Linux】网络基础2---Socket编程预备

&#x1f4cc; 相关专栏 【Linux专栏】【C语言专栏】【测试专栏】 上期回顾【Linux 】网络基础1 文章目录1. 理解源IP地址和目的IP地址2. 认识端口2.1端口号范围划分2.2 理解 "端⼝号" 和 "进程ID"2.3 源端口号与目的端口号2.4 理解Socket2. 传输层的典型代…...

86、【Agent】【OpenCode】bash 工具提示词(完结)

【声明】本博客所有内容均为个人业余时间创作&#xff0c;所述技术案例均来自公开开源项目&#xff08;如Github&#xff0c;Apache基金会&#xff09;&#xff0c;不涉及任何企业机密或未公开技术&#xff0c;如有侵权请联系删除 背景 上篇 blog 【Agent】【OpenCode】bash 工…...