51单片机的串口

news2024/10/3 16:45:10

目录

一、串口的介绍

 1、硬件电路

二、51单片机的UART

1、串口参数及时序图

2、串口模式图

3、串口和中断系统结构图

4、串口相关寄存器

 三、串口向电脑发送数据

1、通过STC-ISP软件

四、电脑通过串口控制LED

1、主函数

2、 UART串口通信模块

一、串口的介绍

串口是一种应用十分广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设备的相互通信。

单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。

51但潘集内部自带UART(通用异步收发器),可实现单片机的串口通信

 1、硬件电路

简单双向串口通信有两根通信线(发送端TXD和接收端RXD)

TXD与RXD要交叉连接

当只需要单向的数据传输时,可以直接一根通信线

电平评标准不一致时,需要加电平转换芯片

注:电平标准

电平标准时数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有以下三种:

TTL电平:+5V表示1,0V表示0

RS232电平:-3~-15V表示1,+3~+15V表示0

RS485电平:两线压差+2~+6V表示1,-2~6V表示0(差分信号)

扩展:常见通信接口比较

二、51单片机的UART

STC89C52有一个UART

STC89C52的UART有四种工作模式:

模式0:同步移位寄存器

模式1:8位UART,波特率可变(常用)

模式2:9位UART,波特率固定

模式3:9位UART,波特率可变

注:我们这里也主要用模式1的形式

1、串口参数及时序图

2、串口模式图

SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的时发送寄存器,读操作时,读出的是接受寄存器。

3、串口和中断系统结构图

4、串口相关寄存器

这里我们根据串口中断结构图通过串口寄存器来配置,开启串口通信

 三、串口向电脑发送数据

1、通过STC-ISP软件

在STC-ISP软件中,有自带的波特率计算器,可以计算定时器的初值

如果板子型号是89C52RC,则选择如下参数

系统频率:11.0592MHZ

波特率:4800

UART选择:串口1

UART数据位:8位数据

波特率发生器:定时器1(8位自动重载)

定时器时钟:12T(FOSC/12)

注意:在江科大视频中的板子系统频率是12MHZ,所以他选择了波特率倍速,来减小误差,但是89C52RC的频率是11.0592MHZ,因此不需要选择波特率倍速

void UartInit(void)		//波特率计算器自动生成的串口初始化
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//这里打开了REN接收使能位
 
	AUXR &= 0xBF;		//89C52单片机中没有这项选择,更高级单片机才有
	AUXR &= 0xFE;		
 
	TMOD &= 0x0F;		//设置定时器工作方式
	TMOD |= 0x20;		
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}
void UART_Init()            //简化后的串口初始化
{
	SCON=0x40;				//0100 0000,SM0和SM1为0 1,采用方式1,REN位为0,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断
 
}

2、编写程序

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
 
unsigned char Sec;
 
 
void main()
{
	UART_Init();
	
	while(1)
	{
		UART_SendByte(Sec);
		Sec++;
		Delay(1000);
	}
}

UART串口通信模块

#include <REGX52.H>
 
/**
  * @brief  串口初始化,4800bps@11.0592MHz
  * @param  无
  * @retval 无
  */
  
void UART_Init()			//串口初始化
{
	SCON=0x40;				//0100 0000,SM0和SM1为0 1,采用方式1,REN位为0,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断
 
}
 
/**
  * @brief  串口发送的一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */
 
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;				//赋值给SBUF会直接将数据通过串口发出
	while(TI==0);			//TI=0时循环,发送完一帧数据后,TI=1时,跳出循环
	TI=0;
}

四、电脑通过串口控制LED

1、主函数

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
 
void main()
{
	UART_Init();
	while(1)
	{
		
	}
}
 
void UART_Routine() interrupt 4		//串口中断程序
{
	if(RI==1);
	{
		P2=~SBUF;					//将电脑发送到SBUF的值赋值给P2
		UART_SendByte(SBUF);		//将电脑发送到单片机的数据同时也发送到电脑
		RI=0;
	}
 
}

2、 UART串口通信模块

#include <REGX52.H>
 
/**
  * @brief  串口初始化,4800bps@11.0592MHz
  * @param  无
  * @retval 无
  */
  
void UART_Init()			//串口初始化
{
	SCON=0x50;				//0101 0000,SM0和SM1为0 1,采用方式1,REN位为1,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断
	EA=1;					//启动中断总允许位
	ES=1;					//启动串口中断
}
 
/**
  * @brief  串口发送的一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */
 
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;				//赋值给SBUF会直接将数据通过串口发出
	while(TI==0);			//TI=0时循环,发送完一帧数据后,TI=1时,跳出循环
	TI=0;
}
 
/*串口中断函数模板
void UART_Routine() interrupt 4
{
	if(RI==1);
	{
		RI=0;
	}
}
*/

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

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

相关文章

倒排索引是什么

倒排索引 简单了解&#xff1a; 什么是正向索引? 基于文档id创建索引。查询词条时必须先找到文档&#xff0c;而后判断是否包含词条 什么是倒排索引? 对文档内容分词&#xff0c;对词条创建索引&#xff0c;并记录词条所在文档的信息。查询时先根据词条查询到文档id&#…

C++和OpenGL实现3D游戏编程【连载13】——多重纹理混合详解

🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 前面说过纹理贴图能够大幅提升游戏画面质量,但纹理贴图是没有叠加的。在一些游戏场景中,要求将非常不同的多个纹理(如泥泞的褐色地面、绿草植密布的地面、碎石遍布的地面)叠加(混合)起来显示,实现纹理间能…

WPS(金山文档)与金蝶云星空通过HTTP实现连接

WPS(金山文档)通过HTTP与金蝶云星空实现数据互通 该方式不需要通过金蝶SDK webapi官方文档地址&#xff1a;https://vip.kingdee.com/article/407944297573586944?langzh-CN&productLineId1&isKnowledge2 一、两种方式 airscript脚本发送http请求和PY脚本编辑器发送…

SCoRe: 通过强化学习教导大语言模型进行自我纠错

大语言模型(LLMs)在推理任务中,如数学问题求解和编程,已经展现出了优秀的性能。尽管它们能力强大,但在实现能够通过计算和交互来改进其回答的算法方面仍然面临挑战。现有的自我纠错方法要么依赖于提示工程,要么需要使用额外的模型进行微调,但这些方法都有局限性,往往无法产生有…

Java项目实战II基于Java+Spring Boot+MySQL的海滨体育馆管理系统的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着健康意识的提升和体育运动的普及&#xff0c;海滨体育馆作为集休闲、健身、娱乐于一体的综合性场…

MongoDB伪分布式部署(mac M2)

1. 序言 本博客是上一博客的进阶版&#xff1a;mac M2安装单机版 MongoDB 7.x&#xff0c;上一博客可以看做是单机、单节点部署MongoDB本博客将介绍单机、多服务部署MongoDB&#xff0c;实际就是伪分布式部署 2. 副本集(Replica Set)方式部署 2.1 什么是副本集&#xff1f; …

DNS与ICMP

一、DNS 在TCP/IP协议中&#xff0c;要用IP地址和端口号来连接服务器&#xff0c;但是直接输入数字用户体验感不好&#xff0c;所以就发明了主机号&#xff08;字符串&#xff09;&#xff0c;用host文件作主机名与IP的映射关系储存。 随着数量的增多&#xff0c;手动管理太麻…

【机器学习】集成学习——提升模型准确度的秘密武器

【机器学习】集成学习——提升模型准确度的秘密武器 1. 引言 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过结合多个弱模型来提升整体预测准确性的技术。通过将多个模型的预测结果进行组合&#xff0c;集成学习在复杂任务中展现了极强的泛化能力。本文将探讨…

基于微信的乐室预约小程序+ssm(lw+演示+源码+运行)

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

深入探讨指令调优的局限性

深入探讨指令调优的局限性 摘要 指令调优&#xff08;Instruction Tuning, IT&#xff09;是通过使用指令-响应对训练大型语言模型&#xff08;LLMs&#xff09;的过程&#xff0c;已成为将基础预训练LLMs转化为开放领域对话代理的主要方法。尽管IT取得了显著的成功和广泛的应…

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例 在某地市的 XX 音乐节保障准备期间&#xff0c;为确保活动期间的网络质量&#xff0c;现场新开了 4.9G HUAWEI 室外基站。在网络优化和测试中&#xff0c;发现UE无法实现从 2.6G 到 4.9G 的正常切换。虽然现场具备 4.9G信号覆…

算法与数据结构--二分查找

原理 简单说就是每次二分取中间值&#xff0c;然后将中间值与我们要找的值比较&#xff0c;如果比它大就移动左边界到其右侧&#xff0c;如果比它小就移动右边界到其左侧。直到中间值等于该值或者经过移动直至右边界在左边界左侧为止。 二.具体实现 public int searchInsert(…

数据结构 ——— 单链表oj题:反转链表

目录 题目要求 手搓一个简易链表 代码实现 题目要求 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 手搓一个简易链表 代码演示&#xff1a; struct ListNode* n1 (struct ListNode*)malloc(sizeof(struct ListNode)); assert(n1);…

【重学 MySQL】五十三、MySQL数据类型概述和字符集设置

【重学 MySQL】五十三、MySQL数据类型概述和字符集设置 MySQL数据类型概述MySQL字符集设置注意事项 MySQL数据类型概述 MySQL是一个流行的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;以满足不同数据处理和存储的需求。理解并正确使用这些数据类型对于提高…

已解决:org.springframework.web.HttpMediaTypeNotAcceptableException

文章目录 写在前面问题描述报错原因分析&#xff1a; 解决思路解决办法1. 确保客户端请求的 Accept 头正确2. 修改 Controller 方法的 produces 参数3. 配置合适的消息转换器4. 检查 Spring 配置中的媒体类型5. 其他解决方案 总结 写在前面 在开发过程中&#xff0c;Spring 框…

实验1 集成开发环境的使用及程序设计入门

1、求两点之间的距离 【问题描述】从键盘输入平面上已知两点的坐标A(x1,y1)、B(x2,y2)&#xff0c;计算两点之间的距离。结果保留4位小数。 【输入形式】两个点的坐标 【输出形式】两点之间的距离 【样例输入】 0 0 3 4 【样例输出】 5.0000 #define _CRT_SECURE_NO_WARNI…

(C语言贪吃蛇)12.Linux线程概念引入及编程实现

目录 前言 Linux线程概念 解决方法 注意事项⚠️ 解决问题&#x1f525; 总结 前言 我们上节提出了两个死循环不能同时运行&#xff0c;导致我们无法控制贪吃蛇的运动方向&#xff0c;本节我们便来解决这个问题。 Linux线程概念 线程是一个进程内部的控制序列&#xff0c…

鸿蒙应用开发前置学习-TypeScript

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

杭州电子科技大学《2019年+2023年861自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《杭州电子科技大学861自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2019年真题 2023年真题 Part1&#xff1a;2019年2023年完整版真题 2019年真题 2…

【Linux私房菜(九)之进程间通信】

文章目录 进程间通信介绍进程间通信的概念进程间通信的目的进程间通信的本质进程间通信的分类 管道什么是管道匿名管道匿名管道的原理pipe函数匿名管道使用步骤管道读写规则管道的特点管道的四种特殊情况管道的大小 命名管道命名管道的原理使用命令创建命名管道创建一个命名管道…