串口
串口是一种十分广泛的通讯接口,可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。 51单片机内部自带UART(),可实现单片机的串口通信。 两个设备通讯的一般方式: TXD与RXD要交叉连接 当只需单向的数据传输时,可以直接一根通信线 当 电平标准不一致时,需要加电平转换芯片
串口电平标准
串口常用的电平标准有三种: 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:串行口工作方式选择位。用于选择四种工作方式 其中有 fosc
SM0 | SM1 | 方式 | 功能 | 波特率 |
---|
0 | 0 | 方式0 | 移位寄存方式 | fosc/ 12 | 0 | 1 | 方式1 | 8位异步通信方式 | 可变 | 1 | 0 | 方式2 | 9位异步通信方式 | fosc / 32或fosc/64 | 1 | 1 | 方式3 | 8位异步通信方式 | 可变 |
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)
{
TMOD &= 0x0F;
TMOD |= 0x20;
SCON = 0x50;
PCON &= 0x7F;
TL1 = 0xFD;
TH1 = 0xFD;
ET1 = 0;
TR1 = 1;
}
串口中断实例应用
.c文件
#include <REG52.H>
#include "Usart_init.h"
void USART_Init()
{
TMOD &= 0X0F;
TMOD |= 0X20;
PCON |= 0x80;
SCON = 0XD0;
TH1 = 0xFA;
TL1 = 0xFA;
ET1 = 0;
TR1 = 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.串口的初始化编程
|