一、串口电平标准:
电平标准是与数据的对应关系数据1与数据0的表达方式,是传输线缆中认为规定的电压。
串口常用的电平标准有:
1.TTL电平: +5V表示1,0V表示0
2.RS232电平: -3~ -15V表示1,+3V~+15V表示0
3.RS485电平:两线压差 +2 ~ +6V 表示1,-2~ -6V表示0
二、常用通信接口
名称 | 引脚定义 | 通信方式 | 特点 |
---|---|---|---|
UART | TXD、RXD | 全双工、异步 | 点对点通信 |
I2C | SCL、SDA | 半双工、同步 | 可挂载多个设备 |
SPI | SCLK、MOSI、MISO、CS | 全双工、同步 | 可挂载多个设备 |
1-Wire | DQ | 半双工、异步 | 可挂载多个设备 |
全双工: 通信双方可以在同一时刻互相传输数据
半双工: 可以互相传输数据 当某一时刻 只能一方传输
–
单步: 只能有一方发送到另一方 不能反向传输
异步:通信双方各自约定通信速率
同步:通信双方依靠一根时钟线来约定通信速率
三、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_Rev(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_Rev(SBUF);
RI = 0; // 软件复位
}
}