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

embedded/2024/11/24 20:04:57/

目录

一、串口通信

二、串口协议

三、原理图

四、串口通信配置参数

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 SBUFA”指令后开始发送,由硬件自动加入起始位和停止位,构成一帧数据,然后由TXD端串行输出。发送完后,TXD输出线维持在“1”状态下,并将SCON中的TI置1,表示一帧数据发送完毕

3、数据接收

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

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

4、波特率计算

\frac{2^{^{SMOD}}*f_{OSC}}{32*12*(M-T))}

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

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

T=253=0XFD

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

5、轮询接收

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、中断接收

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;           //如果是发送引起的中断,清零
}

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

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


http://www.ppmy.cn/embedded/140194.html

相关文章

C++设计模式:建造者模式(Builder) 房屋建造案例

什么是建造者模式? 建造者模式是一种创建型设计模式,它用于一步步地构建一个复杂对象,同时将对象的构建过程与它的表示分离开。简单来说: 它将复杂对象的“建造步骤”分成多部分,让我们可以灵活地控制这些步骤。通过…

Let‘s Encrypt SSL证书:acmessl.cn申请免费3个月证书

目录 一、CA机构 二、Lets Encrypt特点 三、申请SSL 一、CA机构 ‌Lets Encrypt‌是一个由非营利组织Internet Security Research Group (ISRG)运营的证书颁发机构(CA),旨在通过自动化和开放的方式为全球网站提供免费、可靠的SSL/TLS证书。…

【C++入门(一)】半小时入门C++开发(深入理解new+List+范围for+可变参数)

目录 一.深入理解new 使用格式 二.List列表 定义一个列表 迭代器 添加元素 删除元素 排序 反转序列 三.范围for 四.可变参数 std::initializer_list 可变参数模板(variadic template) 一.深入理解new 类似于C语言中的malloc、calloc和reallo…

1. Klipper从安装到运行

本文记录Klipper固件从安装,配置到运行的详细过程 Klipper是3D打印机固件之一,它通常运行在linux系统(常使用Debian,其它的linux版本也可以)上,因此需要一个能运行Linux系统的硬件,比如电脑&am…

C++ list (链表)容器

C list 链表 #include<iostream> using namespace std; #include<list>void printList(const list<int>& L) {for (list<int>::const_iterator it L.begin(); it !L.end(); it){cout << *it << " ";}cout << endl;…

Sourcetree登录GitLab账号

1. 在GitLab上创建个人访问令牌 在gitlab中点击右上角的头像图标&#xff0c;选择设置进入 Access Tokens&#xff08;访问令牌&#xff09; 页面填写令牌名称和到期时间&#xff0c;指定Scopes&#xff08;范围&#xff09;。一般选择read_repository和api点击 Create person…

查看浏览器的请求头

爬虫时用到了请求头&#xff0c;虽然可以用网上公开的&#xff0c;但是还是想了解一下本机浏览器的。以 Edge 为例&#xff0c;其余浏览器通用。 打开浏览器任一网页&#xff0c;按F12打开DevTools&#xff1b;或鼠标右键&#xff0c;选择“检查”。首次打开界面应该显示在网页…

【LeetCode】每日一题 2024_11_23 矩阵中的蛇(哈希、计数)

前言 每天和你一起刷 LeetCode 每日一题~ 本期看点&#xff1a;算法基本功之哈希计数 LeetCode 启动&#xff01; 题目&#xff1a;求出胜利玩家的数目 代码与解题思路 先读题&#xff1a;题目给了 n 个玩家&#xff0c;和一个 pick 数组&#xff0c;pick 数组中 x 表示玩家…