51单片机基础(3) - 串口通信

串口

串口是一种十分广泛的通讯接口,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART(),可实现单片机的串口通信。
两个设备通讯的一般方式:
在这里插入图片描述
TXD与RXD要交叉连接
当只需单向的数据传输时,可以直接一根通信线
当 电平标准1不一致时,需要加电平转换芯片

串口电平标准

串口常用的电平标准有三种:
1.TTL电平:+5V 表示1,0V表示 0
2.RS232电平:-3 ~-15V表示1,+3 ~ +15V表示0
3.RS485电平:两线压差 +2 ~ +6V 表示1, -2 ~ -6V表示0(差分信号)
常用的通信接口如下图,后面以51单片机UART接口为例
在这里插入图片描述
全双工:通信双方可以在同一时刻互相传输数据
半双工:通信双方可以互相传输数据,但某一时刻,只能一个状态
单工 :通信只能有一方发送到另一方,不能反向纯属
异步 :通信双方各自约定通信速率
同步 :通信双方靠一根时钟线来约定通信速率
讲了半天,串口通信的作用就是实现两设备或者是多设备间的通讯,实现数据的收发。串口就是它们之间的通讯通道

51单片机的UART

串行口架构以及相关寄存器

在这里插入图片描述
一.SUBF 缓冲寄存器。
一个是发送寄存器,一个是接收寄存器。负责收发数据,两个位于单片机同一个地址
例如 从单片机发送数据到串口(又叫串口发送) SBUF = xxx
从串口发送数据到单片机,并在串口显示(又叫串口接收) xxx = SBUF
总结: 发送数据将SBUF写在前面,接收数据将SBUF写在后面!

二.串行口控制寄存器 SCON
在这里插入图片描述
SM0、SM1:串行口工作方式选择位。用于选择四种工作方式
其中有 fosc2

SM0SM1方式功能波特率
00方式0移位寄存方式fosc/ 12
01方式18位异步通信方式可变
10方式29位异步通信方式fosc / 32或fosc/64
11方式38位异步通信方式可变

SM2:多机通信控制位。
REN:允许接收控制位。当REN=1,则允许接收,当REN=0,则禁止接收。
TB8:发送数据的第9位。
RB8:接收数据的第9位。
TI:发送中断标志位。
RI:接收中断标志位。

三.电源控制寄存器 PCON
在这里插入图片描述
SMOD: 为1,则波特率加倍;反之,不加倍

UART参数以及时序图

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

波特率计算

关于波特率的计算:
在模式0和模式2下,串口波特率固定,模式0为Fosc/12。
模式2为Fosc/32或Fosc/64,具体由PCON寄存器的SMOD位决定。
在模式1和模式3下,波特率是一个可变值,波特率可以由定时器1产生。波特率由定时器1的溢出率来决定
当使用timer 1作为波特率产生器时,通常需要将timer 1配置成8位自动重装的工作模式下,同时还要禁止timer 1中断
波特率 = (2SMOD/32)*(OSC_FREQ(Hz)/((256-TH1)*12))
OSC_FREQ(Hz) 晶振
TH1=TL1 初值
计算也可以直接通过ISP软件或者其他的单片机助手工具进行计算就好

代码

串口的初始化

1.确定TMOD的工作方式,一般是定时器1,采用工作方式2(自动8位重载)
2.串行口控制寄存器SCON位的确定
3.电源控制寄存器 PCON 位的确定(即SMOD)
4.设置波特率
5.打开中断允许位(总中断、串口中断)如果没有用到定时器中断(没有中断服务函数)就可以不用打开

具体见一个定时器1 工作方式2 配置的9600波特率的代码

void Uart_Init(void)		//波特率9600
{
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	
	SCON = 0x50;		//8位数据,可变波特率
	PCON &= 0x7F;		//高位变0,波特率不加倍
	
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

串口中断实例应用

.c文件

#include <REG52.H>
#include "Usart_init.h"			//串口的头文件

void USART_Init()		//9600波特率
{
		TMOD &= 0X0F;
		TMOD |= 0X20;	
		
		PCON |= 0x80;	
		SCON = 0XD0;	

		TH1 = 0xFA;
		TL1 = 0xFA;		//波特率配置
		ET1 = 0;		//禁止定时器1中断
		TR1 = 1;		//开定时器1
		ES = 1;
		EA = 1;			//总中断开启
}
//串口发送字节函数
void USART_SendByte(unsigned char temp)
{
		SBUF = temp;	
		while(TI == 0);
		TI = 0;
}
//串口接收中断
void USART_ser () interrupt 4 	
{
	 P2 = SBUF;
	 while(RI == 0);
	 RI = 0;
	 USART_SendByte(SBUF);
}

.h文件

#ifndef _USART_INIT_H_
#define _USART_INIT_H_

void USART_Init();
void USART_SendByte(unsigned char temp);

#endif

综上:
1.串口的概念,以及串口的电平标准
2.通信的几个方式以及通信接口的种类
3.串口的作用以及意义
4.51单片机UART串口对应的寄存器以及框架
5.串口的初始化编程


  1. 电平标准是与数据的对应关系数据1与数据0的表达方式,是传输线缆中认为规定的电压 ↩︎

  2. 晶振频率 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值