51单片机(八)串口通信

这篇具有很好参考价值的文章主要介绍了51单片机(八)串口通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取码:gdzf

本节主要介绍学习串口通信的相关知识,包括串口基础知识介绍、本节目标等;并利用两个小实验来进行练习,分别是串口向电脑发送数据以及电脑通过串口控制LED。

一、串口介绍和本节目标

1.1 串口介绍

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

本节主要介绍51单片机和个人电脑之间,是如何使用串口进行通信的。

串口的硬件电路

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

电平标准

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

  • 我们单片机使用的就是TTL电平;(缺点:只能传输10米之内)
  • CAN总线以及USB使用的是RS485电平,通过两根线的压差来区分,也就是查分信号;而不是用电源正负极来区分电压。(最大传送距离可以达到千米以上)

接口及引脚定义:

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

常见的通信接口

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
相关术语

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

  • 全双工方式,在A和B双方之间存在两根通信线,通信双方使用这两根线,A在向B发送数据的同时,B也可以通过另一个线向A发数据;

  • 半双工方式,再A和B双方之间只存在一根通信线,利用这根线,通信双方可以互相发送数据,分时复用,也就是说同一时间只能有一方发送,另一方接收;

  • 同步和异步比较,同步会比异步多一根时钟线,用来实现同步的功能。

下面介绍一下51单片机里的UART。

51单片机里的UART

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

STC89C52里只集成了一个UART

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

上图是其电路图,上图中的TXD和RXD就分别连接到单片机上的RXD和TXD;也就是下图的11和10口:

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

这些其实单片机开发板已经帮我们焊好了,所以将USB插到电脑上就可以进行通信了。

串口参数和时序图

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

检验位:用于检验发送数据的正确性;一般的方法有,奇偶校验(校验发送的数据和接收的数据里的1的个数是奇数还是偶数);

串口模式图

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

上图解释了在串口内部,数据是如何进行收发的;

上图虚线右边的部分都是单片机内部的电路;

其中最左边的双向箭头表示单片机的总线;T1溢出率部分是时钟;

除此之外还有两个寄存器SBUF(串口数据缓存寄存器),这两个寄存器都叫SBUR,且拥有相同的地址;上面的为写SBUF,MCU向该寄存器写入数据,并通过TXD发送出去;下面的为读SBUF,通过RXD接收数据,然后MCU读取该寄存器中的数据。

串口和中断系统

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

串口相关寄存器

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

1.2 本节目标

1.2.1 目标1:单片机通过串口向个人电脑发送数据

具体的为,单片机每隔1s,向电脑发送一次递增的数据;如下图所示:
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

1.2.2 目标2:电脑通过串口控制LED

电脑通过串口向单片机发送数据,进而控制LED的状态,例如当发送1时,第一个LED点亮
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

当发送0时,第一个LED熄灭,同时单片机会将收到的信息原封不动发回给电脑

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

当发送十进制的55时(对应的16进制是0101 0101),所以LED等也按照0101 0101的方式点亮;

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

当发送十六进制的aa给单片机时,也会按照对应的顺序点亮LED,如下图所示:

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

二、串口向电脑发送数据

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\8-1 串口向电脑发送数据

具体代码:

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

unsigned char Sec;

void main()
{
	UART_Init();			//串口初始化
	while(1)
	{
		UART_SendByte(Sec);	//串口发送一个字节
		Sec++;				//Sec自增
		Delay(1000);		//延时1秒
	}
}

UART.c代码如下:

#include <REGX52.H>

/**
  * @brief  串口初始化,4800bps@12.000MHz
  * @param  无
  * @retval 无
  */
void UART_Init()
{
	SCON=0x40;
	PCON |= 0x80;
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF3;		//设定定时初值
	TH1 = 0xF3;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

/**
  * @brief  串口发送一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

代码解释:

UART_Init函数其实就是在对串口相关的寄存器进行初始化配置,也就是对以下八个寄存器进行配置,下面一一解释各个寄存器的配置。
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

在UART_Init函数中,各个寄存器为什么会进行以上设置呢?

SCON

首先是SCON寄存器的配置,代码中写的是SCON=0x40;,关于SCON的设置,我们看下手册的内容,如下图所示,SCON由B0-B7 等8位构成,那么每一位分别设置成0还是1,怎么确认呢?
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
在上面的内容中有写我们最常用的就是8位UART模式,所以SM0(B7)设置为0,SM1(B6)设置为1;
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
从上图可知,
SM2是方式2和方式3用的,我们使用的方式1,所以不用管这个值,直接给0即可。
REN负责控制是否允许接收操作,我们此次是单片机向电脑发送数据,所以不涉及到接收,给0即可;
TB8和RB8也是方式2和方式3用的,我们使用的方式1,所以不用管这个值,直接给0即可;

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
对于TI和RI,上图手册中描述的有些难以理解,通俗点解释就是,参考串口模式图,其实就是图中的TI和RI:

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
TI和RI都是标志位,当TI等于1时,表示已经发送完成;当RI等于1时表示已经接收完成;当检测到发送完成时,TI必须手动置为0;当检测到接收完成时,RI必须手动置为0;

所以总结一下,在初始化时,SCON的配置如下:
从高到低以此为B7=0,B6=1,B5=0,B4=0,B3=0,B2=0,B1=0,B0=0;
SCON=0100 0000,也就是SCON=0x40

SBUF
SBUF是串口数据缓存,在初始化的时候不需要配置。

PCON
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
SMOD对应串口模式图中位置如下:
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
SMOD控制波特率是否加倍,当SMOD=0时,表示波特率除以2;当SMOD=1时,表示不除以2,也就相当于加倍。

SMOD0表示帧错误检查,如果不需要,配置0即可。

因为是初始化,所以以下几个都可以不用配置。

IE
不配置

IPH
不配置

IP
不配置

SADEN
不配置

SADDR
不配置

至此,串口部分就配置好了,剩下还需要配置定时器的初始化,结合上一节,上一节我们使用的是定时器0,但是串口部分需要定时器1,即将TMOD的高四位设置为1,低四位为0;TMOD &= 0x0F表示先把高四位清空,以便后面对其进行设置。
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
另外,在串口模式,定时器要使用双八位自动模式,
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

即M1、M0要设置为1、0,即TMOD |= 0x20

另外TH1和TL1涉及到波特率的设置,如下图所示:
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

TL1和TH1的值的设置,我们可以使用STC-ISP里带的波特率计算器生成工具来生成代码,如下进行配置:

单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32
然后拿出其中的TL1和TH1的配置即可。

所以代码如下:

TMOD &= 0x0F;		//设置定时器模式
TMOD |= 0x20;		//设置定时器模式
TL1 = 0xF3;		//设定定时初值
TH1 = 0xF3;		//设定定时器重装值
ET1 = 0;		//禁止定时器1中断
TR1 = 1;		//启动定时器1

所以整体的UART_Init函数代码就写好了:

void UART_Init()
{
	SCON=0x40;
	PCON |= 0x80;
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF3;		//设定定时初值
	TH1 = 0xF3;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

初始化函数写好后,下面就是串口向电脑发送数据,写一个发送数据的函数,如下:

/**
  * @brief  串口发送一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

即将Byte赋值给SBUF即可,(SBUF在左边,即给他赋值,此时SBUF就默认是写寄存器了。
前面提到,发送完成之后,TI被置为1,需要我们软件手动置为0,所以当检测到TI为0时,说明发送完了,手动TI=0

然后将代码写好编译后,下载到单片机,打开STC-ISP软件中的串口助手,点击打开串口,按下单片机的复位键,即可发现单片机在向电脑从0开始递增发数据,即目标1的效果;(这里需要注意,因为我们代码中写的波特率是4800,所以串口助手中一定要选择波特率为4800,即约定好波特率,否则数据会发送错误,如下图进行设置)
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

三、电脑通过串口控制LED

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\8-2 电脑通过串口控制LED

具体代码如下:

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

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

void UART_Routine() interrupt 4
{
	if(RI==1)					//如果接收标志位为1,接收到了数据
	{
		P2=~SBUF;				//读取数据,取反后输出到LED
		UART_SendByte(SBUF);	//将受到的数据发回串口
		RI=0;					//接收标志位清0
	}
}

这里需要注意的是,接收函数设置为了中断触发模式,即void UART_Routine() interrupt 4
为什么是 interrupt 4呢?因为 interrupt 4表示串口的中断函数:
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

所以相较于上一节,需要多配置中断模式;如下,初始化时,EA=1,表示启动所有中断;ES=1,表示启动串口中断:

/**
  * @brief  串口初始化,4800bps@12.000MHz
  * @param  无
  * @retval 无
  */
void UART_Init()
{
	SCON=0x50;
	PCON |= 0x80;
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF3;		//设定定时初值
	TH1 = 0xF3;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	EA=1;
	ES=1;
}

在中断处理函数中:

void UART_Routine() interrupt 4
{
	if(RI==1)					//如果接收标志位为1,接收到了数据
	{
		P2=~SBUF;				//读取数据,取反后输出到LED
		UART_SendByte(SBUF);	//将受到的数据发回串口
		RI=0;					//接收标志位清0
	}
}

RI==1表示如果是接收到了信息,因为RI是接收的标志位,当RI等于1时,说明已经成功接收到了数据(判断RI=1的目的是一定要保证这是接收数据触发的中断,因为发送数据也会触发该中断,从以下串口和中断系统图中可以看出,发送和接收是共用同一个中断的,所以一定要进行判断)。
单片机串口怎么发送数据,51单片机和STM32单片机入门,单片机,51单片机,stm32

下一步P2=~SBUF;表示将接收到的数据赋值给P2,此时SBUF在右边,说明是读取SBUF的值,此时SBUF就表示读SBUF了。后面RI=0,是表示读取到数据后,需要软件手动将RI置为0;

其他的代码,跟第二节的代码基本一致。不再详细讲解。文章来源地址https://www.toymoban.com/news/detail-754551.html

到了这里,关于51单片机(八)串口通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c51单片机串口通信(中断方式接收数据)(单片机--单片机通信)示例代码 附proteus图

         单片机一般采用中断方式接受数据,这样便于及时处理 其中发送数据段采用的是查询方式,接收端采用了中断方式, 要注意的地方有: 在中断处理函数int_0()内,处理数据前要先关闭中断,否则中断可能会不断传过来, EA=0; 然后退出中断处理函数前恢复中断处理能力:

    2024年02月13日
    浏览(65)
  • 51单片机串口通信的原理及使用方法(附串口收发数据例程代码)

    温馨提示:本篇文章详细介绍了串口的原理及使用方法,涉及的内容较多,但也较为全面,学者若想充分掌握串口通信的原理和具体使用方法(部分限于51单片机),请静下心来将其读完,相信一定会受益匪浅!而且对32单片机的串口学习也有非常好的辅助! 一.串行通信的原

    2024年02月09日
    浏览(42)
  • 基于串口通信技术——让数码管显示的数据发送给电脑,电脑控制单片机外设——15单片机

    目录 1.使用的单片机为IAPI15F2K61S2 2.使用的外设 3.各个外设的作用 1.数码管功能  2.LED灯 3.蜂鸣器与继电器 4.按键 5.串口通信 4.利用发送单个字符函数 发送字符型的数字值,为一个变量+\\\'0\\\',发送为字符型数字。 4.初始化 5.程序 1.main 2.iic.h 3.onewire.c 1.LED灯,继电器与蜂鸣器。 2.数

    2024年02月10日
    浏览(47)
  • 51单片机-串口通信

    目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部结构 2.5.相关寄存器 2.6.工作模式(模式1) 2.7.如何配置串口中断 3.实际应用 3.1.单片机向电脑发送数据 3.2.电脑向单片机发送

    2024年02月01日
    浏览(50)
  • 51单片机串口通信

    串口通信(serial communication)是指外设和计算机间通过数据信号线、地线等按位进行传输数据的一种通信方式,属于串行通信方式。 接口标准:常用RS-232和RS-485 RS-232C有一种9针的非标准连接器口,简称DB9。串口通信使用的大多都是DB9接口。在串口通信中,通常我们只使用2、

    2024年02月05日
    浏览(49)
  • 51单片机学习--串口通信

    首先需要配置寄存器: 下面这里SCON配0x40和0x50都可以,因为暂时还不需要接受信息,所以REN置1置0都可 在main中调用SendByte函数,每按下一次复位键,接收缓冲区就会收到一个11 这就是单向发送的一个简单实例,接下来实现每隔一秒发送一个递增的数据,只需要添加一个全局变

    2024年02月14日
    浏览(50)
  • 51单片机 | 串口通信实验

      这一节我们就来学习 51 单片机的串口通信。开发板上集成了 1 个串口通信电路,是 USB 转串口模块,它既可下载程序也可实现串口通信功能。本节要实现的功能是: 51 单片机通过串口( UART )实现与 PC 机对话, 51 单片机的串口收到 PC 机发来的数据后原封不动的返回给

    2024年02月04日
    浏览(64)
  • 51单片机(八)串口通信

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月05日
    浏览(53)
  • 51单片机(串口通信、蓝牙)

    串行接口简称串口,也称 串行通信接口 或串行通讯接口(通常指COM接口),是采用串行通信方 式的扩展接口。串行接口(Serial Interface)是指 数据一位一位地顺序传送。 其特点是通信线路简 单,只要一对传输线就可以实现 双向通信( 可以直接利用电话线作为传输线),从

    2024年02月15日
    浏览(45)
  • 【51单片机】串口通信&&使用串口通信控制LED灯

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Promise】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔串口通信 😎代码   🍔串口初始化 ⭐分析  🏳️‍🌈确定T1的工作方式 🎈TMOD=0X20;  🏳️‍🌈确定T1的初值 🎈

    2024年02月17日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包