51单片机学习记录(四)———串口


前言

一个学习嵌入式的小白~ 有错误评论区或私信指出~


提示:以下是本篇文章正文内容,下面案例可供参考

一、串口的介绍及使用

1什么是串口?

串口是一种十分广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART(),可实现单片机的串口通信。

在这里插入图片描述

2.串口的连接方式

简单双向串口通信有两根通信线(发送端TXD和接收端RXD)TXD与RXD要交叉连接
当只需单向的数据传输时,可以直接一根通信线
当电平标准不一致时,需要加电平转换芯片
在这里插入图片描述

3.串口电平标准

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

4.常用通信接口比较

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

在这里插入图片描述

二、51单片机的UART

1.引脚定义

在这里插入图片描述

2.相关寄存器

在这里插入图片描述

3.工作模式

STC89C52有一个UART
STC89C52的UART有四种工作模式:
模式0:同步移位寄存器 波特率固定
模式1:8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变
在这里插入图片描述

4.时序及帧格式介绍

波特率:串口通信的速率(发送和接收各数据位的间隔时间)
校验位:用于数据验证
停止位:用于数据帧的间隔
在这里插入图片描述

5.内部工作过程

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

三、串口练习

1.发送接收

#include <REGX52.H>

void UART_Init()
{
	SCON  = 0x50;
	PCON |= 0x80;
	
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

void UART_SendByte(unsigned char Byte)
{
		SBUF = Byte;//SBUF接收要传的数据
		while(TI == 0);//等待TI置1表示传输完成
		TI = 0;//清除标志位
}

unsigned char UART_Receive()
{
	unsigned char Byte;
	if(RI == 1)
	{
		RI = 0;
		return 1;
	}
	
	return 0;
}


void main()
{
		UART_Init();
		UART_SendByte(0x66);
		
		while(1)
		{
				if(UART_Receive() == 1)
				{
					if(SBUF == 0x55{
						UART_SendByte('O');
						UART_SendByte('K');
						UART_SendByte('\r');
						UART_SendByte('\n');
					}
					else
					{
						UART_SendByte('N');
						UART_SendByte('G');
						UART_SendByte('\r');
						UART_SendByte('\n');
					}
				
				}
		}

}

2.中断接收

#include <REGX52.H>

void UART_Init()
{
	SCON  = 0x50;
	PCON |= 0x80;
	
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	ES = 1;
	EA = 1;
	
}

void UART_SendByte(unsigned char Byte)
{
		SBUF = Byte;
		while(TI == 0);
		TI = 0;
}
void main()
{
		UART_Init();
		
		while(1)
		{
		}

}

void UART_Routine () interrupt 4
{
		unsigned char Byte;
		if(RI == 1)
		{
			Byte = SBUF;
			UART_SendByte(Byte);
			RI = 0;
		}


}
  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值