# 串口通讯
# 波特率
# 介绍波特率
波特率就是电脑和单片机之间通讯的速率 代表一秒钟可以传输多少位的二进制数据 而波特率有四种工作模式
| 工作编号 | 工作模式 |
|---|---|
| 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 | EA = 1; //开启总中断 |
# 发送数据
设置好了波特率 发送与接收数据就变得很简单了
串口通讯中 我们要把数据交给 SBUF 当 TI 处于 0 时 就可以发送出去了 之后通过判断 TI 是否为 1 来确定数据是否发送成功
在 SCON 寄存器中有这么两位 : RI 和 TI 当单片机接收到数据之后 RI 会被硬件置 1 而当单片机将数据发送出去之后 TI 会被硬件置 1 必须由软件置 0
我们让单片机对电脑输出数据时 第一次输出之前要先令 TI = 1 因为只有当 TI = 1 时 才能确定上一个数据已经发送完毕 (即使之前没有发送过数据)
# 代码如下
1 | TI = 1; //置1 |
# 接收数据
接收数据也是一样的操作 只不过是把 SBUF 的值赋给程序中的变量
# 代码如下
1 | dat = SBUF; //赋值给变量 |
# 完整代码如下
1 |
|
