当前位置:主页 > 查看内容

51单片机 串口学习

发布时间:2021-08-10 00:00| 位朋友查看

简介:一、串口电平标准 电平标准是与数据的对应关系数据1与数据0的表达方式是传输线缆中认为规定的电压。 串口常用的电平标准有 1.TTL电平 5V表示10V表示0 2.RS232电平 -3~ -15V表示13V~15V表示0 3.RS485电平两线压差 2 ~ 6V 表示1-2~ -6V表示0 二、常用通信接口……

一、串口电平标准:

电平标准是与数据的对应关系数据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_Send(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_Send(SBUF);

		RI = 0;         // 软件复位
	}
}
;原文链接:https://blog.csdn.net/weixin_49001854/article/details/115741350
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐