C51_串口通信

通信协议介绍

并行通信和串口通信

  • 并行通信的各个位同时传输,每一位数据都需要一条传输线。优点是传输快,适合短距离传输,但是成本高
  • 串行通信将数据分成位的形式,在一条传输线上逐个传输

单工、半双工和全双工数据传输

  1. 单工数据传输
    只有一方能接受或发送信息,不能实现反向传输
  2. 半双工数据传输
    是一种可以切换方向的单工通信,在同一时间只可以有一方接收或发送信息
  3. 全双工数据传输
    允许数据同时在两个方向上传输

串口通信协议介绍

UART物理层

UART是异步串行全双工通信协议,没有时钟协议

UART数据帧格式

  1. 起始位
    逻辑电平为低电平
  2. 数据位
  3. 校验位
  4. 停止位
  5. 空闲位

UART传输速率

在需要保证稳定传输的场合,通常采用较低的波特率

UART通信实例

UART电路原理图

在这里插入图片描述

串口中断

串口中断请求标志位

串口中断允许控制位

串口中断允许控制位决定CPU能否响应中断

串口中断优先级控制位

注意:IPH寄存器不可以进行位寻址操作

串口工作模式

工作模式0

工作模式1

工作模式2

工作模式3

实例与代码解析

  1. 包含头文件
#include <reg52.h>
  1. 编写串口配置函数
static void InitUART()
{
    SCON = 0x50; // 设置串口为工作模式1,并打开接受允许
    TMOD= 0x20; // 设置定时器1为工作模式2(8位自动重装载定时器)
    PCON = 0x80; // 设置波特率加倍
    TL1 = 0xF3; // 设置定时器1计数初值,波特率为4800
    TH1 = TL1; // 设置定时器1重装载值,等于计数初值
    TR1 = 1; // 打开定时器1
}
  1. 编写中断配置函数
static void InitInterrupt()
{
    ES = 1; // 打开串口接收中断允许
    EA = 1; // 打开总中断允许
}
  1. 编写主函数
void main()
{
    InitInterrupt(); // 初始化中断
    InitUART(); // 初始化串口
    while (1)
    {
        
    }
}
  1. 编写中断服务函数
void UART_Handler() interrupt 4
{
    static unsigned char s_iBuffer; // 定义缓冲变量
    s_iBuffer = SBUF; // 将数据从寄存器中取出
    RI = 0; // 清除接收中断标志位
    
    SBUF = s_iBuffer; // 将数据放入寄存器
    while (!TI) // 等待数据发送完成
    {
        
    }
    TI = 0; // 清除发送中断请求标志位
}
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值