# 串口通讯

# 波特率

# 介绍波特率

波特率就是电脑和单片机之间通讯的速率 代表一秒钟可以传输多少位的二进制数据 而波特率有四种工作模式

工作编号工作模式
SM0 = 0 SM1 = 0 (模式 0)固定波特率 = 震荡频率 / 12
SM0 = 0 SM1 = 1 (模式 1)可变波特率 = (2^SMOD) * 32 * 溢出率
SM0 = 1 SM1 = 0 (模式 2)固定波特率 = (2^SMOD) * 64 / 震荡频率
SM0 = 1 SM1 = 1 (模式 3)可变波特率 = (2^SMOD) * 32 * 溢出率

# 计算方式

目前经常使用的是模式 1

如果我们需要一个 9600 的波特率 那么列出式子 :

9600 = (2^(1 或 0) / 32) * 11.0592M / 12 * (256 - 初值)

算出来的初值就是我们要得初始 TH1 和 TL1 的值

# 配置代码

设置波特率代码如下 (使用 T1):

1
2
3
4
5
6
7
8
9
EA = 1;			//开启总中断
ES = 1; //启用串口中断
TR1 = 1; //启用T1
REN = 1; //允许串口中断
TMOD = 0x20; //配置T1工作模式
SM0 = 0;
SM1 = 1; //配置波特率工作方式
TH1 = 0xfd;
TL1 = 0xfd; //配置初始寄存器值

# 发送数据

设置好了波特率 发送与接收数据就变得很简单了

串口通讯中 我们要把数据交给 SBUF 当 TI 处于 0 时 就可以发送出去了 之后通过判断 TI 是否为 1 来确定数据是否发送成功

在 SCON 寄存器中有这么两位 : RITI 当单片机接收到数据之后 RI 会被硬件置 1 而当单片机将数据发送出去之后 TI 会被硬件置 1 必须由软件置 0

我们让单片机对电脑输出数据时 第一次输出之前要先令 TI = 1 因为只有当 TI = 1 时 才能确定上一个数据已经发送完毕 (即使之前没有发送过数据)

# 代码如下

1
2
3
4
5
6
7
8
TI = 1;						//置1

while (1)
{
puts("hello world!!"); //发送数据
while (!TI); //判断是否发送成功
TI = 0; //软件置零
}

# 接收数据

接收数据也是一样的操作 只不过是把 SBUF 的值赋给程序中的变量

# 代码如下

1
2
3
dat = SBUF;			//赋值给变量
while(!RI); //等待数据传输完毕
RI = 0; //RI置0

# 完整代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<reg52.h>
#include<stdio.h>

void delay(int z)
{
int x,y;

for (x = 114; x; x--)
{
for (y = z; y; y--);
}
}

void main()
{
EA = 1;
ES = 1;
REN = 1;
SM0 = 0;
TR1 = 1;
SM1 = 1;
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;

while (1)
{
TI = 1;
printf("hello world!!!\n");
while (!TI);
TI = 0;
delay(1000);
}
}
更新于 阅读次数