51单片机基础 06 串口通信与串口中断

目录

一、串口通信

二、串口协议

三、原理图

四、串口通信配置参数

1、常用的串行口工作方式1

2、数据发送

3、数据接收

4、波特率计算

5、轮询接收

6、中断接收


一、串口通信

串口通信是一种常见的数据传输方式,广泛用于计算机与外部设备或嵌入式系统之间的通信。串口通信的特点是逐位传输数据,与并口相比具有以下优势:

  • 传输距离长:适合远距离通信。
  • 占用引脚少:只需两条通信线(发送和接收)。
  • 简单可靠:易于实现和调试。

常见的串口标准

  • RS-232:传统的串口标准,常用于PC和设备之间的通信。
  • RS-485:支持多点通信,适合工业应用。
  • UART(通用异步收发器):嵌入式系统中常用的一种硬件模块,实现异步串口通信。

二、串口协议

串口通信参数

  • 波特率:每秒传输的位数,如9600、115200等。
  • 数据位:每个数据帧的位数,通常为8位。
  • 停止位:用于标识一帧数据的结束,常为1位或2位。
  • 校验位:用于错误检测,可选择无校验、奇校验、偶校验等。

三、原理图

四、串口通信配置参数

|------|-------|-----|
| 中断编号 | 中断名 | 中断源 |
| 4 | 串行口中断 | RI |

可以看到串口接收中断是单片机中断的最低权限位。

|-------|------------|-------------------|
| 中断控制位 | 功能 | 实现 |
| ES | 串行口中断允许控制位 | 1:允许串口中断 0:禁止串口中断 |

SCON串行控制寄存器。

|-----|-----|-----------|---------------|---------|---------|--------|--------|
| 9FH | 9EH | 9DH | 9CH | 9BH | 9AH | 99H | 98H |
| SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
| 00:同步,波特率固定fosc/12 01:10位异步,波特率可以变 10:11位异步,波特率固定fosc/32\64 11:11位异步,波特率可变 || 0:双机 1:多机 | 0:禁止接收 1:允许接受 | 发送数据第九位 | 接收数据第九位 | 发送中断标志 | 接收中断标志 |

1、常用的串行口工作方式1

方式1是一帧10位的异步串行通信方式,包括1个起始位(0),8个数据位和一个停止位(1),其帧格式如下:

|------|----|----|----|----|----|----|----|----|------|
| 起始位0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 停止位1 |

2、数据发送

当TI=0时,执行"MOV SBUF,A"指令后开始发送,由硬件自动加入起始位和停止位,构成一帧数据,然后由TXD端串行输出。发送完后,TXD输出线维持在"1"状态下,并将SCON中的TI置1,表示一帧数据发送完毕

3、数据接收

RI=0,REN=1时,接收电路以波特率的16倍速度采样RXD引脚,如出现由"1"变"0"跳变,认为有数据正在发送。

在接收到第9位数据(即停止位)时,必须同时满足以下两个条件:RI=0和SM2=0或接收到的停止位为"1",才把接收到的数据存入SBUF中,停止位送RB8,同时置位RI。若上述条件不满足,接收到的数据不装入SBUF被舍弃。在方式1下,SM2应设定为0。

4、波特率计算

其中fosc为晶振频率,M为重装载值,T为定时器1的初值,SMOD可选为加倍。

例如fosc=11.0592MHz、9600波特率,如果在定时器1模式2下,M=256,SMOD=0,可以算出

T=253=0XFD

cpp 复制代码
TMOD |= 0x20; // 定时器1设置为模式2(8位自动重载)
TH1 = 0xFD;   // 设置初值为0xFD,波特率9600
TL1 = 0xFD;   // 装载初值
TR1 = 1;      // 启动定时器1
SCON = 0x50;  // 设置串口为模式1,允许接收

5、轮询接收

cpp 复制代码
ES=0;                  //禁止串口中断
while(1)               //死循环,单片机初始化后,将一直运行这个死循环
{
    //****查询式串口接收程序****
    if(RI==1)               //如果接收标志位为1,说明有数据接收完毕
    {                       //RCIF在寄存器被读出后自动清零
        USARTbuf=SBUF;      //将接收缓冲区内容转至USARTbuf寄存器中
        RI=0;               //清除接收标志位
        SBUF=USARTbuf+1;    //将接收到的内容+1后发送出去
        while(!TI);         //一直等到数据发送完毕
    }
}

可以看到在主函数判断RI是否为1,得到获取SBUF的值,如果要发送,则赋值给SBUF即可。

6、中断接收

cpp 复制代码
ES=1;                  //允许串口中断
EA=1;                  //开全局中断
void UART_SER (void) interrupt 4 
{
    if(RI==1)              //如果接收标志位为1,说明有数据接收完毕
    {                      //RCIF在寄存器被读出后自动清零
        USARTbuf=SBUF;     //将接收缓冲区内容转至USARTbuf寄存器中
        RI=0;              //清除接收标志位
        SBUF=USARTbuf+1;   //将接收到的内容+1后发送出去
        while(!TI);        //一直等到数据发送完毕
    }
    if(TI) TI=0;           //如果是发送引起的中断,清零
}

可以看到中断服务函数,不仅会让接收进入中断,发送也会进入中断,其不通过轮询可以大大降低系统的占用。

同样,中断服务函数不要写太多乱七八糟的代码,越简洁越好。

相关推荐
小殷学长6 分钟前
【单片机毕业设计12-基于stm32c8t6的智能称重系统设计】
stm32·单片机·课程设计
编程圈子1 小时前
I.MX6U 裸机开发20. DDR3 内存知识
嵌入式硬件·嵌入式linux·i.mx6u
广药门徒1 小时前
stm32内部高速晶振打开作为主时钟
单片机·嵌入式硬件
7yewh3 小时前
嵌入式硬件杂谈(六)充电器原理 线性电源 开关电源 反激电源原理
单片机·嵌入式硬件·mcu·物联网·硬件架构·硬件工程·pcb工艺
秋风&萧瑟3 小时前
【freertos】FreeRTOS消息队列的介绍与使用
单片机
FlechazoCLF4 小时前
小柴冲刺软考中级嵌入式系统设计师系列三、嵌入式硬件设计(1)嵌入式系统电源管理
嵌入式硬件
drinow12 小时前
【纸飞机串口调试工具】预设曲线名称
arm开发·驱动开发·单片机·mcu·dsp开发·fpga·iot
时光の尘12 小时前
C语言菜鸟入门·关键字·int的用法
c语言·开发语言·数据结构·c++·单片机·链表·c
深圳市青牛科技实业有限公司 小芋圆14 小时前
【青牛科技】 GC2803:白色家电与安防领域的卓越驱动芯片可替代ULN2803
科技·单片机·嵌入式硬件·电脑·白色家电·电动卷帘门·工业设备