首页 > 其他分享 >C51学习归纳6 --- UART串口数据通信

C51学习归纳6 --- UART串口数据通信

时间:2024-06-08 10:29:32浏览次数:13  
标签:发送 定时器 C51 UART TI --- 串口 接收

        这一部分我认为是十分重要的,没有了数据的传输,我们做的很多事情将是没有意义的。我们一般利用串口做两件事,一是单片机向电脑发送信息,二是单片机接收电脑的信息。

一、UART原理

        TXD:发送信息通道,RXD: 接收信息通道。我发送你接收,所以TXS和RXD相连。GND互连的意义在于有一个共同的低电平的定义,这样在处理数据的时候有了相同的标准,处理才不会出错。

        在芯片上我们连接在P3_0 和P3_1上.

        在串口转换部分,输出RXD-U,TXD-U。然后与主机的RXD,TXD相连。

        我们也发现了这种通信模式的缺点,只能1台设备发送,可以多台设备接收,但不能多发。

        除了UART外我们还有其他的通信方式,如下表:

全双工:通信双方可以在同一时刻互相传输数据 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线 单工:通信只能有一方发送到另一方,不能反向传输 异步:通信双方各自约定通信速率 同步:通信双方靠一根时钟线来约定通信速率 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

        我们用这个图 

二、单片机向电脑发送信息

#include <REGX52.H>

/**
  * @brief  串口初始化,[email protected]
  * @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的发送和初始化函数。 我们发现UART的使用和定时器1有关。这是因为

         我们要使用定时器定速度的发送接收数据。发送数据后,申请一个发送中断TI,收到数据以后,申请一个接收中断RI。然后转到中断。

         因为TI,RI占用同一个通道,所以进入中断以后,需要判断是接收中断还是发送中断。

        我们先看UART的初始化,我们需要设置PCON,SCON,和定时器的设置。PCON是为了控制串口工作的模式,SCON是为了电源的设置,但是电源控制器的最高位还是串口模式的设置位;定时器是为了产生固定的发送接收频率不产生中断。定时器选取定时器一,运行在模式2,8位自动重装模式上(这是规定),因为自动重载,所以不用每次赋初值。

        我们再看UART的发送数据函数,讲数据放在 SBUF 数据线上,然后当TI = 1的时候发送,发送完后给TI置0;每输入8位,电路自动将TI自动置于1,但是必须软件复位.RI一样。

#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秒
	}
}

        这里是main函数的逻辑。

三、单片机接收电脑的信息

#include <REGX52.H>

/**
  * @brief  串口初始化,[email protected]
  * @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;
}

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

        这里对比前面的代码发现没有任何变化,这是因为我们将接受代码以中断的形式写在了main函数中。

#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
	}
}

        进入中断iterrupt 4 以后判断是否是接收中断,将数据取反用LED显示出来,方便检查,然后还可以再将接收到了数据发送出去。记得手动清0。因为接收数据是不确定时间的,所以我们需要利用接收中断执行。

标签:发送,定时器,C51,UART,TI,---,串口,接收
From: https://blog.csdn.net/SPIRITE_SYF/article/details/139392664

相关文章

  • C51学习归纳7 --- LED点阵显示静态图片和动画
        今天学习一个非常常用的功能。外面的流动字母的LED大屏大家应该很常见吧。今天!学完这个,你就可以自己设计一个LED大屏了!一、开发板原理图    首先我们看点阵屏幕的输入信号,有P0_X和DP_X控制。P0_X直接就是芯片的P0输出端口,那么我们现在关注一下DP_X的产生......
  • 自媒体-社群
                                        ......
  • Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析
    本篇将继续深入OpenMAXILSpec,详细解析Non-tunneled(非隧道)组件的初始化、数据传递以及组件销毁过程。通过阅读本篇内容,我们应能对Non-tunneled组件的buffer分配与状态转换过程有一个清晰的了解。1、组件初始化以下是ILSpec给的Non-tunneled组件初始化时序图:ILClient首先......
  • SystemC & TLM-2.0 - SystemC vs SystemVerilog
    WhatisthedifferencebetweenSystemCandSystemVerilogSystemCisusedprimarilyasamodelinglanguageparticularlyforvirtualplatformmodelingwhereassystemverilogisusedmainly50chableHardwareverification.I'mgoingtodivedowninto......
  • 「漏洞复现」锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞(XVE-2024-211
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • 二叉树-数据结构
    父节点地址值左子节点地址右子节点地址每一个节点往下面,都是会分成左右两个树的结点度,就是子节点的数量二叉树就是生活中的树的概念树的高度是以最大的数量去数小的往左边放,大的往右边放以根节点为坐标,小于根节点的储存在左边,大的根节点放在右边和根节点相等的数,我们......
  • 红黑树-数据结构
    平衡二叉B树每个节点可以是红或者是黑红黑树不是高度平衡的,他的平衡是“通过自己的红黑规则实现的”红黑规则每个节点是红或者为黑根节点必须是黑色如果一个节点没有子节点或者是父节点,这个节点的相应的指针属性为nil,这些nil视为叶节点,每个叶节点nil是黑色的如果某个节......
  • 【产品经理修炼之道】- 产品的底层逻辑
    什么是产品?或许有些人对于这个司空见惯的概念,并没有一个很清晰的答案,或者不知道如何去回答。我们常常会去了解其中的深层逻辑,却忘了记住产品的基础与底层逻辑。作者分享了他关于产品底层逻辑的理解,希望对你有所启发。各位,产品到底是什么?饭店服务员的微笑属于产品吗?你健身房......
  • Android Media Framework - 开篇
    AndroidMedia多媒体框架全面解析开篇。前言AndroidMedia是一块非常庞大的内容,上到APP的书写,中到播放器的实现、封装格式的了解,下到编解码组件的封装、VPUAPI的了解,每块内容的学习都需要我们下很大的功夫。此外,我们还要对相关的模块进行了解,比如AudioFlinger、SurfaceFl......
  • 走走停停迅雷BT下载[DB-1280P/3.25GBMKV中字]4k高清百度云资源分享
    电影《走走停停》:探寻人生的迷茫与自我救赎电影《走走停停》是一部由李安执导,由乔·阿尔文主演的心灵探索之旅。这部电影以一个中年男子的迷失和自我救赎为线索,通过对人生中的停顿和挫折的描绘,引发观众对生活意义的思考。故事的主线由两个不同的时间线交......