串口通信(基于51单片机)

师从江科大

串口介绍

1、串口可以实现两个设备的相互通信。

2、单片机的串口可以使单片机与单片机,单片机与电脑,单片机与多种模块相互通信

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

硬件电路

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

2、TXD和RXD要交叉连接

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

3、当电平标准不一致时,需要加电平转化芯片

注:TXD和RXD的英文全称分别是:

  • TXD: Transmit Data,发送数据
  • RXD: Receive Data,接收数据

电平标准

电平标准是数据1和数据0的表达方式,串口常用的电平标准有如下三种:

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

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

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

常见通信接口比较

补充

全双工:通信双方可以在同一时刻互相传输数据

半双工:通信双方可以互相传输数据,但必须分时复用一根数据线

单工:通信只能有一方发送到另一方,不能反向传输

总线:连接各个设备的数据传输线路

同步:在同步模式下,调用方发起一个操作后会等待该操作完成并返回结果后才继续执行后续代码。

异步:异步操作则允许调用方发起请求后立即返回,无需等待响应。一旦发起请求,调用方可以继续执行其他任务,不会被阻塞。

串口模式图

单片机的UART

串口参数及时序图(了解即可)

1、波特率:串口通信的速率(发送和接收数据位的间隔时间)

2、检验位:用于数据验证

3、停止位:用于数据帧间隔

补充

  • 奇校验(Odd Parity):当包含校验位在内的所有位中的“1”的个数为奇数时,该数据块被认为是有效的。

    例如,对于8位数据,如果实际7位数据中有3个“1”,那么为了实现奇校验,校验位将被设置为“0”以确保总共有4个“1”(3个来自数据位,1个来自校验位)。//0000 0011 1

  • 偶校验(Even Parity):与此相反,在偶校验中,“1”的个数必须是偶数。

串口相关寄存器

SCON寄存器(串口控制寄存器)

 SM0/FE

 SM0,SM1按下列组合确定串行口的工作方式

 注:因为是要确定是模式1,即将SM0设为1,SM1设为1

SM2

 因为确认是模式1,所以SM2不用管,即设为0

REN 

TB8和RB8

TB8和RB8是在模式2.模式3中才需要设置,所以直接置为0

TI 和RI 

 故在UART初始化时,配置PCON=0x40   // 0100 0000

PCON寄存器(电源控制寄存器)(不可位寻址)

串口向电脑发送数据代码

main.c

#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.c

#include <REGX52.H>

/**
	*@brief  串口初始化 4800bps@12.000MHz
	*@param  无
	*@retval 无
  */
//配置定时器
void UART_Init()	
{
	SCON = 0x40;		//8位数据,可变波特率
	PCON |= 0x80;		//使能波特率倍速位SMOD  可以减小误差
	TMOD &= 0x0F;		//设置定时器1模式  
	TMOD |= 0x20;		//设置定时器1模式
	TL1 = 0xF3;			//设置定时初始值
	TH1 = 0xF3;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
}
/**
	*@brief  串口发送一个字节数据
	*@param  Byte要发送的一个字节数据
	*@retval 无
  */
void UART_SendByte(unsigned char Byte)
{
		SBUF=Byte;//将Byte中的数据传入到SBUF
		while(TI==0);//检测数据是否传入成功
		TI=0;//复位
		
}

UART.h

#ifndef __UART_H__
#define __UART_H__

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


#endif

 还有Delay.c,Delay.h文件

电脑通过串口控制LED代码

main.c

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

unsigned char Sec;

void main()
{
	UART_Init();
		while(1)
		{
				
		}
}
//电脑向单片机传入数据
void UART_Routine() interrupt 4 //串口4中断产生后,会转到此函数
{
		if(RI==1)//如果是接受中断  串口接收停止位的中间时刻
		{
				P2=~SBUF;//读入SUBF
				UART_SendByte(SBUF);
				RI=0;//串口接收停止位的中间时刻有由内部硬件置位,必须由软件复位即RI=0
				
		}
}

UART.c

#include <REGX52.H>

/**
	*@brief  串口初始化 4800bps@12.000MHz
	*@param  无
	*@retval 无
  */
//配置定时器
void UART_Init()	
{
	SCON = 0x50;		//8位数据,可变波特率  接受数据
	PCON |= 0x80;		//使能波特率倍速位SMOD
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xF3;			//设置定时初始值
	TH1 = 0xF3;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	EA=1;//启动使能中断
	ES=1;//启动串口中断
}
/**
	*@brief  串口发送一个字节数据
	*@param  Byte要发送的一个字节数据
	*@retval 无
  */
void UART_SendByte(unsigned char Byte)
{
		SBUF=Byte;//将Byte中的数据传入到SBUF
		while(TI==0);//检测数据是否传入成功
		TI=0;//复位
		
}
/*串口中断函数模板
void UART_Routine() interrupt 4 
{
		if(RI==1)
		{
				RI=0;
				
		}
}
*/

UART.h

#ifndef __UART_H__
#define __UART_H__

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


#endif

再加Delay.c和Delay.h文件即可

补充

数据显示模式

HEX模式/十六进制模式/二进制模式:以原始数据的形式显示

文本模式/字符模式:以原始数据编码后的形式显示

比如:0x30 在HEX模式下显示30,在文本模式下显示0(因为在ASCII中0x30为0))

若有侵权,请联系作者

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘~风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值