串口定义:
是一种应用十分广泛的通讯接口,成本低操作简单,可实现两个设备的互相通信。
51单片机内部自带UART,可实现单片机的串口通信。
硬件电路:
电平标准:
差分信号是指两根线之间的电平差,TTL与RS232电平只是相对于接地的电平差。
相关术语
- 全双工:通信双方可以在同一时刻互相传输数据
- 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
- 单工:通信只能有一方发送到另一方,不能反向传输
- 异步:通信双方各自约定通信速率
- 同步:通信双方靠一根时钟线来约定通信速率
- 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)
51单片机的UART:
STC89C52有1个UART,UART有4种工作模式。其中只对模式1进行详解
模式一:8位UART,波特率可变。
串口通信参数以及时序图:
三个核心参数
| 参数 | 含义 | 作用 |
|---|---|---|
| 波特率 | 通信速率 = 每秒传输的位数 | 收发双方必须一致,否则数据全是乱码。9600 bps = 每秒 9600 位 |
| 检验位 | 用于数据验证 | 检查传输过程中数据有没有出错(奇偶校验) |
| 停止位 | 用于数据帧间隔 | 标记一帧结束,让接收方"喘口气"准备接下一帧 |
发送方和接收方必须设成一样的波特率,否则采样时刻对不上
9种数据格式比8位数据格式多了一个校验位,奇偶校验就是0000 0001 0<--使得所有1加起来始终为奇数。
串口模式图:
中间圈起来的就是用来控制波特率的。上方是输出数据,下方是输入数据两者都需要先将数据存储到SBUF之中。
右边圈起来的是串口中断触发逻辑,只涉及4个东西:TI、RI、或门(≥1)、去向中断逻辑。
| 元素 | 含义 | 怎么工作 |
|---|---|---|
| TI | 发送中断标志(Transmit Interrupt) | 一帧数据发完后,硬件自动置 TI=1 |
| RI | 接收中断标志(Receive Interrupt) | 一帧数据收完后,硬件自动置 RI=1 |
| ≥1 | 或门(OR gate) | TI 和 RI 只要有一个=1,输出就=1 |
| 去中断逻辑 | 通往 CPU 中断系统 | 或门输出=1 时,触发串口中断(中断号4) |
并且T1,R1要手动清零,如果不清零,或门会一直是1导致一直中断。
串口向电脑发送数据:
1.配置寄存器
| SM0 | SM1 | 工作方式 | 功能说明 | 波特率 |
|---|---|---|---|---|
| 0 | 0 | 方式0 | 同步移位串行方式:移位寄存器 | SYSclk/12 |
| 0 | 1 | 方式1 | 8位UART,波特率可变 | (2^SMOD / 32) × (定时器1的溢出率) |
| 1 | 0 | 方式2 | 9位UART | (2^SMOD / 64) × SYSclk系统工作时钟频率 |
| 1 | 1 | 方式3 | 9位UART,波特率可变 | (2^SMOD / 32) × (定时器1的溢出率) |
由于只运用模式一所以SM0设置为0,SM1设置为1.
SM2:允许方式2或方式3多机通信控制位。所以设置为0.
REN:允许/禁止串行接收控制位。因为这段代码是发送给电脑不需要接收所以设置为0.
TB8:在方式2或方式3,它为要发送的第9位数据,按需要由软件置位或清0。设置为0.
RB8:在方式2或方式3,是接收到的第9位数据。设置为0
TI:工作模式是"硬件置1,软件清0",所以手动清0,设置为0,
这些寄存器可以直接用STC-ISP生成。
串口向电脑发送数据代码:
UART.c子函数:
main主函数:
电脑通过串口控制LED:
跟上面的两个差别:1.需要ES=1; EA=1作用是: CPU"允许你被打断去处理"。(打开中断)
2.新增串口中断接收函数,电脑发送的数据直接显示到LED上。
P2 = SBUF中 SBUF 在右边,意思就是"把电脑发过来、存到接收缓冲器里的数据读出来,写到 P2 口"。如果在左边,意思就是电脑接收缓冲器里的数据。
代码改进:需要取反原因:是共阳级接法(接反的如果让第一个灯亮,不取反只是最后一个灯亮)
UART_SendByte(SBUF); // 把收到的数据原样发回电脑
总结:就是进行串口通信时需要配置波特率(串口初始化),串口向电脑发送数据就时利用UART_sendByte函数进行操作,电脑通过串口控制LED就只是多了ES=1; EA=1 允许中断,并新增一个中断接收函数,用UART_sendByte只是单片机→电脑方向的数据传输。
方向1:单片机 → 电脑(发送) UART_SendByte(0x41) → SBUF=0x41 → TXD → 电脑显示
方向2:电脑 → 单片机(接收,需要中断) ES=1; EA=1 → 电脑发数据 → RXD收到 → RI=1 → 跳进 interrupt 4 → P2 = ~SBUF → LED变化