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,以便下次数据的写入标志

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

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

相关文章

普通人还有必要学习 Python 之类的编程语言吗?

在开始前分享一些编程的资料需要的同学评论888即可拿走 是我根据网友给的问题精心整理的对于编程的重要性&#xff0c;这里就不详谈了。 未来&#xff0c;我们和机器的交流会越来越多&#xff0c;编程可以简单看作是和机器对话并分发给机器任务。机器不仅越来越强大&#xff0…

java面向对象进阶篇--static

一、前言 java进阶篇已经开始了&#xff0c;先从面向对象开始&#xff0c;由于时间原因今天就只更新了static部分&#xff0c;内容上特别详细&#xff0c;一些特别的注意事项也在反复的提醒大家。 温馨提示一下&#xff0c;往后的java篇会越来越难&#xff0c;希望大家能够坚…

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题&#xff1a; ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭&#xff0c;但是苹果这个默认开启&#xff0c;而且大部分客户也不会去自己关闭。 2、欺骗苹果手机&#xff0c;代码实现。 先说解决思路&#xf…

玩转HarmonyOS NEXT之IM应用首页布局

本文从目前流行的垂类市场中&#xff0c;选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互&#xff0c;主要包含对话聊天、通讯录&#xff0c;社交圈等交互功能。 应用首页 创建一个包含一列的栅格布…

[图解]SysML和EA建模住宅安全系统-14-黑盒系统规约

1 00:00:02,320 --> 00:00:07,610 接下来&#xff0c;我们看下一步指定黑盒系统需求 2 00:00:08,790 --> 00:00:10,490 就是说&#xff0c;把这个系统 3 00:00:11,880 --> 00:00:15,810 我们的目标系统&#xff0c;ESS&#xff0c;看成黑盒 4 00:00:18,030 --> …

Home Assistant在windows环境安装

Home Assistant是什么&#xff1f; Home Assistant 是一个开源的智能家居平台&#xff0c;旨在通过集成各种智能设备和服务&#xff0c;提供一个统一的、可自定义的家庭自动化解决方案。它可以允许用户监控、控制和自动化家中的各种设备&#xff0c;包括灯光、温度、安全系统、…

公司想无偿裁员,同事赖着不走

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这招好像也不错! 事情是这样的&#xff1a;某公司准备把成本高的员工都裁掉&#xff0c;主要包含研发部和程序员&#xff0c;总共18个人&#xff0c;准备裁掉10人&#xff0c;因为他们工资开的太高了&#xff0c;…

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器&#xff0c;它是用来监测硬件或软件的故障的&#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新&#xff0c;在程序运行过程中我们需不断地重装载看门狗&#xff0c;以使它不溢出&#xff1b;如果硬件或软件发生…

基于pytesseract的OCR图片识别

简介 pytesseract是基于谷歌的tesseract的OCR包&#xff0c;支持识别一些简单的数字、字母、中文。 安装 安装引擎 下载地址&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 一般是Windows 64位系统最新版&#xff1a; 如果要识别中文&#xff0c;注意选中中文…

python每日一题:回文数

题干 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。例如&#xff0c;121 是回文&#xff0…

02:项目二:感应开关盖垃圾桶

感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波&#xff1f;1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料&#xff1a; 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…

【香橙派AiPro】基于VGG16的火灾检测模型预测

目录 引言开发板介绍开发板使用准备工作工具文档 拨码开关镜像烧录连接开发板下载MobaXterm网线-SSH连接开发板设置WIFI连接WIFI-SSH连接开发板确定开发板IP方法 Vnc可视化WindowsiPad 开发工具安装 散热风扇基于VGG16的火灾检测模型预测数据集准备目录结构代码操作 安装宝塔最…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者&#xff0c;Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

有关电力电子技术的一些相关仿真和分析:⑤交-直-交全桥逆变+全波整流结构电路(MATLAB/Siumlink仿真)

全桥逆变+全波整流结构 参数:Vin=500V, Vo=200V, T=2:1:1, RL=10Ω, fs=100kHz, L=1mH, C=100uF (1)给定输入电压,输出电压和主电路参数,仿真研究电路工作原理,分析工作时序; (2)调节负载电阻,实现电流连续和断续,并仿真验证; (3)调节占空比,分析占空比与电…

微软Edge浏览器深度解析:性能、安全性与特色功能全面评测

一、引言 自Windows 10操作系统推出以来&#xff0c;微软Edge浏览器作为默认的网页浏览器&#xff0c;凭借其现代化的设计和出色的性能表现&#xff0c;逐渐获得了用户的认可。本文旨在对Edge浏览器进行深入分析&#xff0c;探讨其在多个方面的表现。 二、界面与操作体验 界面…

初识STM32:芯片基本信息

STM32简介 STM32是ST公司基于ARM公司的Cortex-M内核开发的32位微控制器。 ARM公司是全球领先的半导体知识产权&#xff08;IP&#xff09;提供商&#xff0c;全世界超过95%的智能手机和平板电脑都采用ARM架构。 ST公司于1987年由意大利的SGS微电子与法国的Thomson半导体合并…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据&#xff0c;我们生成了多种图表&#xff0c;包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足以下三种 一致性&#xff08;C:consistency&#xff09;可用性&#xff08;A:Available&#xff09;分区容错性&#xff08;P:Partition Tolerance&#xff09; 这三个基本要求&#xff0c;最多只能同时满足…