串口
串口是一种十分广泛的通讯接口,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
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
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) //波特率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.串口的初始化编程