『51单片机』串口通信配置

news2024/9/20 14:41:00

🚩write in front🚩   

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~作者周榜89﹣作者总榜832~阿里云专家博主 & 阿里云星级博主~掘金优秀创作者⇿InfoQ创作者⇿51CTO红人⇿全网访问量40w+🏅
🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠
📝个人主页-謓泽的博客_CSDN博客 📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏-
【51单片机】系列_謓泽的博客-CSDN博客🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

💬本系列哔哩哔哩江科大51单片机的视频为主以及博主自己的总结梳理📚 

目录

⒈串口向电脑发送数据

配置串口

串口相关寄存器 

SM0和SM1工作模式

SCON串行控制寄存器 

PCON电源控制寄存器

定时器1&工作模式二

STC-ISP波特率计算

发送

串口向电脑发送数据 - 代码

main.c

Delay.c & Delay.h

UART.c & UART.h

接收 

接收中断

⒉电脑通过串口控制LED灯 && 将接收到的数据发送到串口当中里面去 - 代码

main.c

 Delay.c & Delay.h

UART.c & UART.h

数据显示模式 


⒈串口向电脑发送数据

配置串口

串口相关寄存器 

串口这个寄存器就是相当于按钮,也可以是指示灯或者是数据的什么。

SCON是控制这个电路如何运转开关怎么拨。里面有很多位可以。控制这个电路

SBUF是串口数据缓存寄存器,发送的数据存储到这里。

PCON是电源管理寄存器其中有SMOD和SMOD0这两位是控制串口的,之所以放在电源这里可能是单片机当中资源有点紧张。然后串口又多了所以分配到电源管理寄存器当中去了。

IE是允许中断标志当种有EA和ES是这个中断控制的东西与串口有关。

SM0和SM1工作模式

在这里由于我们只讲述最常用的模式一

SCON串行控制寄存器 

注→串行控制寄存器为可位寻址:可以单独的对一位寄存器进行赋值。

B7→FE:检测帧错误,也就是说它有一个奇校验和偶校验。如果错误的话就会在这一位当中检测FE这个帧错误。注:当我们去使用⒏位串口的时候就不需要来检测这个帧错误了。这里所说的是『模式1:8位UART[⒈个字节],波特率可变』— 最常用的一个模式。

B7→SM0 = 0

B6→SM1 = 1 [决定工作模式,在这里我们是工作模式⒈] 

B5→SM2 = 0 [多机通信是方式⒉和方式⒊的,如果是这两个的话设置SM2 = 1反之SM2 = 0]

B4→REN = 1||0 [是否允许它进行接收RXD,如果REN = 0的话就是不允许接收 REN = 1的话就是允许接收。想让单片机接收数据的话就置为1,不想让单片机接收就置为0]

B3→TB8 = 0 [方式三和方式二置1用于发送第⑨位数据,方式一置0]

B2→RB8 = 0 [方式三和方式二置1用于发送第⑨位数据,方式一置0]

B1→TI = 0 [初始化配置给0]

B0→RI = 0 [初始化配置给0]

串行口数据缓冲器SBUF 

PCON电源控制寄存器

注→PCON电源控制寄存器:不可位寻址就是它的寄存器只能进行整体的进行赋值。 

对应着串口逻辑图当中的SMOD控制波特率是否加倍的。

​在上述图当中说明了SMOD=⒈的时候波特率就会加倍。一般来说不会进行波特率的加倍。

​SMOD0:帧错误我们在这里是不需要的所以不用进行配置。 

注→ 【在串口向电脑发送数据】单片机只是需要给电脑发送就行。所以没有必要开启中断。

定时器1&工作模式二

注→这个串口只能配置定时器⒈这是它专用的。 

模式2→8位自动重装模式,这个算是第二个最常用的一个模式。第二种模式主要用于串口通信产生波特率来用的『在电子通信领域,波特(Baud)即调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数』

STC-ISP波特率计算

在这里要注意下你的晶振频率如果是12MHZ的话可以选择波特率倍速使误差更小。

AUXR→在五一单片机当中是不需要的这个是如何确定高系列的单片机里面有可选择的东西因为在我们的89C52当中是不可选的所以是不需要的。

下面我们来说说它的波特率计算方式如下

SMOD 是决定要不要进行波特率加倍的。

fosc 晶振频率。51单片机的晶振频率一般为12或11.0592(MHZ) 注:在串口通信上我们一般都是用11.0592(MHZ)因为用12MHZ它会产生百分之五的一个误差算出的结果会有小数。

发送

在发送当中内部的移位的过程还是比较复杂的,但是在我们编写程序当中的操作还是比较容易的。我们只需要把数据写到SBUF当中去,一旦我们写进去的时候它就会发送出去。

当SBUF被赋值为左值的时候就带表它是写入SBUF被写入的话它就是发送的。

//例如↓
SBUF = Byte;//发送-单片机向电脑发送数据
P2 = SBUF;  //接收-单片机接收电脑的数据

注→当我们发送完成之后是还需要进行检测的。TI = 发送控制位。

//例如↓
while(TI==0);
TI == 0;

当 TI == 0 时候就一直循环下去,直到TI == 1的时候就会跳出循环,然后再用软件复位置0。

串口向电脑发送数据 - 代码

代码的内容→单片机每隔⒈s向电脑发送一次数据。

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

int main()
{
	unsigned char Sec = 0;
	UART_Init();			//串口初始化
	while(1)
	{
		UART_SendByte(Sec);	//串口发送一个字节
		Sec+=2;					//Sec自增
		Delay(1000);		//延时1秒 准确精准,防止有误差!
	}
}

Delay.c & Delay.h

//Delay.c
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
//Delay.h
​
#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

UART.c & UART.h

//UART.c
#include <REGX52.H>

void UART_Init()  
{
	SCON = 0x40;		
	TMOD &= 0x0F;//0000 0000 & 0000 1111 定时器1的话高四位清0 定时器0的话低四位清0 
	TMOD |= 0x20;//0000 0000 | 0010 0000
	TL1 = 0xFA;		
	TH1 = 0xFA;		
	ET1 = 0;		
	TR1 = 1;		
}

void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;//TX发送 SBUF被赋值为左值
	while(TI==0);//发送到了数据置TI == 1
	TI=0;//软件复位
}
//UART.h
#ifndef __UART_H__
#define __UART_H__

void UART_Init();
void UART_SendByte(unsigned char Byte);

#endif

接收 

注:一般发送数据是不需要中断号的,但是接收数据的话是需要中断号的。发送是因为是我们的单片机来进行发送到电脑端当中去的。

接收的话之所以要中断系统是因为我们并不清楚电脑什么时候发送过来,我们也不能一直检测所以我们就可以利用中断电脑发送过来的时候(单片机接收)触发这个中断在中断函数当中进行处理。

注→SCON串行控制寄存器当中REN现在我们是要进行接收了所以需要REN置1的值。

接收中断

接收的时候需要中断所以我们需要在串口初始化当中加上ES = 1 和 EA = 1 的值,优先级默认。 其实无论在发送还是接收只要有一个条件满足了它就会触发中断。当中断使能[EA]之后程序会跳转到中断服务函数里面 —  void UART_Routine interrupt4 表示(串口中断)

⒉电脑通过串口控制LED灯 && 将接收到的数据发送到串口当中里面去 - 代码

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

void main()
{
	UART_Init();		//串口初始化
	while(1)
	{
		
	}
}

//中断服务子函数
void UART_Routine() interrupt 4 // interrupt 4 中断的入口-中断服务子函数
{
	if(RI==1)					//如果接收标志位为1,接收到了数据.[之所以需要判断是因为我们要区分接收RI=TXD和发送TI=RXD]
	{
		P2=~SBUF;				//读取数据,取反后输出到LED  SBUF在等号的右边说明它是接收位
		UART_SendByte(SBUF);	//将接收到的数据发回串口
		RI=0;					//接收标志位清0 软件复位
	}
}

 Delay.c & Delay.h

//Delay.c
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
//Delay.h
​
#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

UART.c & UART.h

//UART.c
#include <REGX52.H>

void UART_Init(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES=1;
	EA=1;
}

void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;//发送-单片机向电脑发送数据
	while(TI==0);
	TI=0;
}
//UART.h
#ifndef __UART_H__
#define __UART_H__

void UART_Init();
void UART_SendByte(unsigned char Byte);

#endif

数据显示模式 

HEX模式/十六进制模式/二进制模式→都以原始数据的形式进行显示。

文本模式/字符模式→以原始数据编码后的形式进行显示。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术分享 | 黑盒测试方法论—因果图

因果图法是一种利用图解法分析输入与输出的各种组合情况&#xff0c;从而设计测试用例的方法&#xff0c;它适合于检查程序输入条件的各种组合情况。 因果图法比较适合输入条件比较多的情况&#xff0c;可以测试所有的输入条件的排列组合。因果图的 “ 因 ” 就是输入条件&…

Flutter滚动悬浮效果

有以下几种效果 1、tabBar透明度随偏移0-1渐变过度 2、app上下滚动触发tabBar同步滚动 3、tabBar切换触发app上下同步滚动 1、计算每个区块的高度 用keyList保存声明的key&#xff0c;用heightList保存每个key对应的组件高度 // key列表 List<GlobalKey> keyList [Gl…

lower_bound与upper_bound的应用

<1>lower_bound (1). . 上述代码返回在升序排序的序列a中第一个大于等于 t 的元素的地址. 示例: (2) 上述代码返回在升序排序的序列a中第一个大于等于 t 的元素的下标. 示例: 例题: P2249 【深基13.例1】查找 P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生…

JavaSE(多态、abstract、接口)

1.多态 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同 的状态。 向上转型 向上转型&#xff1a;实际就是创建一个子类对象&#xff0c;将其当成父类对象来使用。 语法格式&…

(牛客)小杜跑酷

链接&#xff1a;https://ac.nowcoder.com/acm/contest/49244/F?&headNavacm 来源&#xff1a;牛客网 题目描述 小杜又在玩游戏了&#xff01;这回他玩的是跑酷游戏&#xff01; 已知该跑酷地图长为n&#xff0c;有3层&#xff0c;可以理解为一张3n的地图。令人新奇的是&…

Shiro学习看这一篇文章就够了

第一章 Shiro简介 第1节 shiro介绍 1官网地址: http://shiro.apache.org/Apache Shiro 是一个功能强大,易于使用的Java安全框架,他执行认证、授权、加密、会话管理等功能,使用Shiro易于理解的API,使你能够轻松的保护任何应用,如移动端应用,大型web应用以及企业级应用. Shiro可…

当前主流的后端语言,谁能夺得桂冠,果然是后生可畏!

主流后端语言 如今编程语言遍地开花&#xff0c;烟花迷乱&#xff0c;小编整理了最流行的几种编程语言如下&#xff1a; 这几种语言都是经久不衰&#xff0c;占领着后端编程界的半壁江山。TIOBE上的语言排名&#xff1a; C、Java、python&#xff0c;C&#xff0c; C#鏖战榜首…

元宇宙浪潮下,数智人拒绝“标品”

作者 | 曾响铃 文 | 响铃说 在各地文博会、生活节等大型文娱活动上&#xff0c;在博物馆等各类场馆的线上平台&#xff0c;在企业与用户交互的窗口&#xff0c;在政务平台滚动政策宣讲片中&#xff0c;尤其是&#xff0c;在各大卫视的跨年晚会上…… 2022年末、2023年年初&a…

MyBatis Generator ORM层面的代码自动生成器

在日常开发工作中&#xff0c;我们往往需要自己去构建各种数据表所对应的持久化对象&#xff08;POJO&#xff09;、用于操作数据库的接口&#xff08;DAO&#xff09;以及跟 DAO 所绑定的对应 XML。这都是一些重复性的操作&#xff0c;不需要多大技术含量。MyBatis Generator工…

优思学院|Minitab中的子组大小应该怎样填写?

关于SPC中的均值极差控制图&#xff08;X-bar-R Chart&#xff09;&#xff0c;都是质量管理和六西格玛最常用的工具之一&#xff0c;学生经常都会问及SPC和子组的问题。 所谓的子组&#xff08;Subgroup&#xff09;&#xff0c;是指在同一组条件&#xff08;包括人、机、物、…

人工智能辅助药物发现(2)苗头化合物筛选

目录AI辅助苗头化合物筛选概述AI辅助CPICPI数据库蛋白质和化合物的特征表示深度学习CPI预测经典Y型架构基于注意力的架构基于复合物的架构CPI性能评估苗头化合物筛选的发展前景挑战与趋势实际应用AI辅助苗头化合物筛选概述 新型小分子药物的开发通常从生物学家确定疾病靶标开始…

oracle数据库初始化问题及处理方法记录

环境&#xff1a; 服务器装机是redhat7.9&#xff0b;oracle19&#xff0c;用户是oracle&#xff0c;用户组dba 装机后进行初始化&#xff1a; 1.配置oracle用户环境变量&#xff1a;~/.bash_profile export ORACLE_SIDxxx export ORACLE_BASE/oracle/app/oracle export OR…

海康visionmaster-在WPF中使用Winform控件的方法

描述 环境&#xff1a;VM4.0.0 VS2013及以上 现象&#xff1a;在算子SDK开发过程中&#xff0c;用户如何使用封装好的Winform模板匹配等控件&#xff1f; 解答 首先添加对如下两个dll文件的引用&#xff1a;WindowsFormsIntegration.dll&#xff0c;System.Windows.Forms.…

深入MySQL字符编码与对照规则

前言 本篇和大家一起深入MySQL的字符集与对照规则&#xff0c;剖析下我们存储在MySQL中的字段是如何进行存储和校验比对的。 先看问题&#xff1a;unique key为什么失效了&#xff1f;拉齐共识&#xff1a;回顾下字符编码的基础知识&#xff0c;回炉下ASCII和Unicode。深入了解…

算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点

算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点 二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度…

第三章 逻辑与推理

命题逻辑谓词逻辑知识图谱推理因果推理 3.1 命题逻辑 逻辑和推理是基于知识的操作。 命题逻辑是应用一套形式化规则对以符号表示的描述性陈述进行推理的系统。在命题逻辑中&#xff0c;一个或真或假的描述性陈述被称为原子命题&#xff0c;对原子命题的内部结构不做任何解析。…

UnityC#的lock用法简记

UnityC#的lock用法简记简述代码实例一、单线程二、多线程无lock三、多线程使用lock死锁注意拓展lock->InvokeMonitor参考链接简述 多线程环境中&#xff0c;不使用lock锁&#xff0c;会形成竞争条件&#xff0c;导致错误。 使用lock锁可以保证当有线程操作某个共享资源时&a…

【ONE·C || 操作符详解】

总言 C语言&#xff1a;各种操作符的使用介绍。 文章目录总言1、算术操作符2、移位操作符2.1、整体介绍2.2、左移操作符2.3、右移操作符&#xff08;逻辑右移、算术右移&#xff09;3、位操作符3.1、整体介绍3.2、演示实例3.2.1、按位与3.2.2、按位或3.2.3、按位异或3.2.4、按位…

离线文章画像计算--Tfidf计算

2.4.2 Tfidf计算 2.4.2.1 目的 计算出每篇文章的词语的TFIDF结果用于抽取画像 2.4.2.2TFIDF模型的训练步骤 读取N篇文章数据文章数据进行分词处理TFIDF模型训练保存&#xff0c;spark使用count与idf进行计算利用模型计算N篇文章数据的TFIDF值 2.4.2.3 实现 想要用TFIDF进行…

【数据结构初阶(Java)】认识时间复杂度和空间复杂度

目录 前言&#xff1a; 1、算法效率 2、时间复杂度 1、大O的渐近表示法&#xff08;不是一个准确的&#xff09; 2、时间复杂度练习题&#xff08;没有明确要求&#xff0c;计算的时间复杂度就是最坏情况下&#xff09; 3、空间复杂度 前言&#xff1a; 如何衡量一个算法的…