什么是串口?
- a.9 针串口:
- b.串口又叫串行口
- c.将数转换成连续的串行数据发送的接口
- d.接收串行数据的接口
什么是串口通信?
- a.通信分为 并行通信 串行通信两种
- b.连接方和被连接方收发数据的过程
什么是波特率?
- a.1 秒传输多少位数据
- b.双方约定好波特率保证数据传输完整性
- c.例如双方约定为: 9600bps,每秒传输 9600 位
- d.bps = bit per second
- e.A 向 B 发送数据,但 B 不知道 A 何时发何时停止,于是有起始位和结束位
起始位结束位?
假如 A 向 B 发送数据,约定波特率为 9600bps,单片机在没有串口通信的情况下,数据发送引脚: TxD 为高电平
起始
将A的TXD引脚拉低,B监测到接收引脚RXD电平被拉低
A发送0到TXD,B从RXD接收0
0为起始位
A: 0-> TXD, B: RXD->0
过程
起始位后加入正常的8位数据
A: 1111 1111 0 -> TXD, B: RXD -> 0 1111 1111
结束
相比过程的数据这里多了一位 1,标志数据发送结束,1为结束位
A: 1 1111 1111 0 -> TXD, B:RXD -> 0 1111 1111 1
起始+数据+结束 起始+数据+结束
一共 10 位数据,10 位数据称作一帧数据。
那么算一下,一帧数据 10 位,波特率为 9600,实际上每秒传递 960 帧数据,去掉起始和结束也就是 960*8 位数据。
单片机串口通信原理
- a.STC89C52 有两个独立串行口缓冲器(SBUF*2)
- b.两个 SBUF 均为 8 位,一个负责发送,一个负责读取
- c.发送数据:将数据写入 SBUF,通过 TXD 引脚发送
- d.10 位数据帧发送完毕,TI=1 请求中断
- e.进入中断函数
- f.接收数据: 接收到 10 位数据后,RI=1 请求中断
- g.进入中断函数,读 SBUF
以上是 UART,中断寄存器中的信息
T1 为 SBIT 0x98 中的 1
R1 为 SBIT 0x98 中的 0
简单的来说,通过 TI =1/RI = 1 进入不同的中断函数判别是接收还是发送
串口内部原理图
- a.TH1 和 TL1 为定时器 T1,因波特率涉及到每秒发送多少位,所以需要时间辅助
- b.两个控制器,发送为 T1,接收为 R1,T1/TR 任意一个电平为高电平,那么就会进入中断
- c.中断位于 SBUF 到 TXD 或 RXD 之间,如中断 SBUF 和 RXD 之间,那么就代表 SBUF 中有了数据可以读取了
串口通信控制寄存器
SCON & PCON
- a.SCON:串口控制寄存器
- b.PCON:波特率选择特殊功能寄存器
上图为 SCON 串口控制寄存器
- a.SM0,SM1 确定串口工作方式
- 00:同步移位,移位寄存器
- 01:8 位 UART 波特率可变
- 10:9 位 UART
- 11:9 位 UART 波特率可变
- b.SM2: 当 SM0 SM1 组合为 10,11 时,SM2 为多机控位
- c.REN: 允许/禁止串行接收控制位。
- d.TB8: 当 SM0 SM1 组合为 10,11 时,充当第 9 位数据
- e.RB8: 当 SM0 SM1 组合位 10,11 时,充当接收位第 9 位数据
- f.TI: 发送中断请求标志位 硬件置 1 软件置 0
- g.RI: 接收中断请求标志位 硬件置 1 软件置 0
如上是 PCON 特殊寄存器
- a.SMOD: 波特率选择位。SMOD = 1,SCON 为 01,10,11 时,波特率加倍。当 SMOD = 0,波特率不加倍
- b.IE/ES 为允许串口中断位
波特率计算
常用波特率 | 系统时钟频率(MHz) | SMOD | 定时器 1 CT | 定时器 1 方式 | 定时器 1 重新装入值 |
---|---|---|---|---|---|
SM0,SM1 = 0,0 ,MAX: 1M | 12 | x | x | x | x |
SM0,SM1 = 1,0 ,MAX: 375K | 12 | 1 | x | x | x |
SM0,SM1 = 1,1/0,1 ,62.5K | 12 | 1 | 0 | 2 | FFH |
SM0,SM1 = 1,1/0,1 ,19.2K | 11.059 | 1 | 0 | 2 | FDH |
SM0,SM1 = 1,1/0,1 ,9.6K | 11.059 | 0 | 0 | 2 | FDH |
SM0,SM1 = 1,1/0,1 , 4.8K | 11.059 | 0 | 0 | 2 | FAH |
SM0,SM1 = 1,1/0,1 ,2.4K | 11.059 | 0 | 0 | 2 | F4H |
SM0,SM1 = 1,1/0,1 ,1.2K | 11.059 | 0 | 0 | 2 | F8H |
SM0,SM1 = 1,1/0,1 ,137.5 | 11.986 | 0 | 0 | 2 | 1DH |
SM0,SM1 = 1,1/0,1 ,110 | 6 | 0 | 0 | 2 | 72H |
SM0,SM1 = 1,1/0,1 ,110 | 12 | 0 | 0 | 1 | FFFBH |
- a.SM0,SM1 为 01,11 时,波特率=2^SMOD/32x(定时器 1 的溢出率)
- b.12T 模式下,定时器 1 的溢出率=系统时钟频率/12/(256-TH1)
- c.6T 模式下,定时器 1 的溢出率=系统时钟频率/6/(256-TH1)
- d.NEBULA-PI 单片机系统时钟为晶振时钟频率 11.0592MHz
- e.
TH1 为定时器工作在模式 2 的初始值,溢出时自动重载 TL1 的值重新定时 - f.不用向我们使用定时器时每次中断重新赋值
单片机在 12T 模式下定时器 1 初始值:
TH1= TL1 = 256 - 系统时钟频率 2^SMOD/32/12 波特率
6T 模式下:
TH1 = TL1 = 256 - 系统时钟频率 2^SMOD/32/6 波特率
串口转 USB
USB-Tx,USB-Rx 为 单片机 TXD 和 RXD 引脚,按串口通信原理进行通信即可
同时也可以看两个都连着发光二极管 D8 和 D10
串口应用
功能: 由计算机通过串口调试助手往单片机发送一个数据,单片机收到数据后反转 led0 小灯,并将接收到的数据 +1 传递回计算机,发送完数据后反转 led1 小灯
实现过程:
a.下载安装调试助手
b.配置串口工作方式 SM0,SM1 为 0,1
c.允许接收串口数据
d.初始化 SMOD
e.配置定时器位工作模式 2,8 位自动重装模式
f.允许串口中断,允许总中断
g.编写串口中断程序
通过 git 克隆 串口调试助手获取可执行文件
根据不同平台选择不同的可执行文件
设置
定义需要设置的位和寄存器地址
设置串口工作方式为 UART
允许串口接收数据
设置波特率倍数
设置定时器
设置中断并开启串口中断