51单片机 串口学习

本文详细介绍了51单片机的串口通信,包括串口电平标准如TTL、RS232和RS485,通信接口的全双工和半双工概念,以及51单片机UART的四种工作模式。同时,阐述了串行口相关寄存器的配置,特别是定时器1在设定波特率中的作用。最后,提到了串口的发送和接收过程。
摘要由CSDN通过智能技术生成

一、串口电平标准:

电平标准是与数据的对应关系数据1与数据0的表达方式,是传输线缆中认为规定的电压。
串口常用的电平标准有
1.TTL电平: +5V表示1,0V表示0
2.RS232电平: -3~ -15V表示1,+3V~+15V表示0
3.RS485电平:两线压差 +2 ~ +6V 表示1,-2~ -6V表示0

二、常用通信接口

名称引脚定义通信方式特点
UARTTXD、RXD全双工、异步点对点通信
I2CSCL、SDA半双工、同步可挂载多个设备
SPISCLK、MOSI、MISO、CS全双工、同步可挂载多个设备
1-WireDQ半双工、异步可挂载多个设备

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

单步: 只能有一方发送到另一方 不能反向传输
异步:通信双方各自约定通信速率
同步:通信双方依靠一根时钟线来约定通信速率

三、51单片机的UART

51单片机有一个UART
UART有四种工作模式
模式0:同步移位寄存器
模式1:8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变

在这里插入图片描述
SUBF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占有相同的地址
写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器

四、串行口相关寄存器

在这里插入图片描述
1.配置工作方式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.配置波特率加倍
在这里插入图片描述
3.配置定时器1

为什么要配置定时器?
51单片机的波特率是以定时器1的溢出率来计算的,定时器溢出32/16次的时间,即为串口传输1位的时间,通过改变定时器的初值,就改变了定时器的溢出率,也就改变了波特率。

TMOD &= 0X0F;	  // 高四位清0 低四位不变
TMOD |= 0X20;  	  // 配置定时器1模式3 	8位自动重装方式

4.使用波特率计算器
选择定时器1,定时器时钟12T,8位数据位,波特率及波特率倍速
在这里插入图片描述

五、串口发送:

#include "reg52.h"
#include <intrins.h>

unsigned char Data;

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void UART_Init()
{
	SCON = 0x40;
	PCON |= 0x80;		//使能波特率倍速位SMOD

	TMOD &= 0X0F;	  // 高四位清0 低四位不变
	TMOD |= 0X20;  	  // 配置定时器1模式3 	8位自动重装方式

					 // 配置波特率
	TL1 = 0xF4;		//设定定时初值
	TH1 = 0xF4;		//设定定时器重装值

	ET1 = 0;          //禁止定时器1中断
	TR1 = 1;		  // 开启定时器1
}

void UART_Send(unsigned char Byte)
{
	SBUF = Byte;
	while(TI==0);
	TI = 0;	
}

void main()
{
	UART_Init();
//	UART_Send(0x66);

	while(1)
	{
		UART_Send(Data);
		Data++;
		Delay500ms();	
			
	}

}

六、串口接收:

#include "reg52.h"
#include <intrins.h>

unsigned char Data;

void UART_Init()
{
	SCON = 0x50;
	PCON |= 0x80;		//使能波特率倍速位SMOD

	TMOD &= 0X0F;	  // 高四位清0 低四位不变
	TMOD |= 0X20;  	  // 配置定时器1模式3 	8位自动重装方式

					 // 配置波特率
	TL1 = 0xF4;		//设定定时初值
	TH1 = 0xF4;		//设定定时器重装值

	ET1 = 0;          //禁止定时器1中断
	TR1 = 1;		  // 开启定时器1
					
					// 开启串口中断
	ES = 1;
	EA = 1;
}

void UART_Rev(unsigned char Byte)
{
	SBUF = Byte;
	while(TI==0);
	TI = 0;	
}

void main()
{
	UART_Init();

	while(1)
	{

			
	}

}

void UART_Routine() interrupt 4	  // 串口接收
{
	if(RI==1)  
	{
	 	P1 = SBUF;	 // 接收数据到p1 口
		UART_Rev(SBUF);

		RI = 0;         // 软件复位
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值