RYMCU

NO11.串口通信实验-NEBULA-VSCODE

devcui 2 年前
# nebula-vscode

所属作品集

什么是串口?

  • a.9 针串口: image.png
  • 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
    起始+数据+结束	           起始+数据+结束

image.png

一共 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

image.png

image.png

以上是 UART,中断寄存器中的信息
T1 为 SBIT 0x98 中的 1
R1 为 SBIT 0x98 中的 0

image.png

简单的来说,通过 TI =1/RI = 1 进入不同的中断函数判别是接收还是发送

串口内部原理图

image.png

image.png

  • a.TH1 和 TL1 为定时器 T1,因波特率涉及到每秒发送多少位,所以需要时间辅助
  • b.两个控制器,发送为 T1,接收为 R1,T1/TR 任意一个电平为高电平,那么就会进入中断
  • c.中断位于 SBUF 到 TXD 或 RXD 之间,如中断 SBUF 和 RXD 之间,那么就代表 SBUF 中有了数据可以读取了

串口通信控制寄存器

image.png

SCON & PCON

  • a.SCON:串口控制寄存器
  • b.PCON:波特率选择特殊功能寄存器

image.png
上图为 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

image.png

如上是 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.image.png
    TH1 为定时器工作在模式 2 的初始值,溢出时自动重载 TL1 的值重新定时
  • f.不用向我们使用定时器时每次中断重新赋值

单片机在 12T 模式下定时器 1 初始值:
TH1= TL1 = 256 - 系统时钟频率 2^SMOD/32/12 波特率
6T 模式下:
TH1 = TL1 = 256 - 系统时钟频率
2^SMOD/32/6 波特率

串口转 USB

image.png

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 克隆 串口调试助手获取可执行文件

根据不同平台选择不同的可执行文件

image.png

设置

image.png
定义需要设置的位和寄存器地址

image.png
设置串口工作方式为 UART

image.png
允许串口接收数据

image.png
设置波特率倍数

image.png
设置定时器

image.png
设置中断并开启串口中断

中断逻辑

image.png

image.png

应用案例 2

image.png

image.png

image.png

所属作品集

后发布评论