前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单片机通信之串口通信

单片机通信之串口通信

作者头像
飞哥
发布2020-07-10 10:17:57
1.8K0
发布2020-07-10 10:17:57
举报

单片机常用的通信方式有串口通信,I2C,SPI,UART等等,在这里说一下基于8051单片机串口通信的基本原理。简要介绍单片机与PC机之间的通信。

80C51串行口的控制寄存器

串口通信首先要配置各个控制寄存器的工作方式,因此先介绍控制寄存器

一、SCON控制寄存器:SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:

1、SM0和SM1为工作方式选择位,可选择四种工作方式:

2、SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。

3、REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收

4、TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。

5、RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。

6、TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。

7、RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。

二、PCON控制寄存器:PCON中只有一位SMOD与串行口工作有关 :

SMOD(PCON.7) 波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。

定时器作为波特率发生器

在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。

波特率是每秒传输的位数,在工作方式1当中,一帧数据有十位,分别是起始位、八位数据位、一位停止位。

波特率的计算; 串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。

方式0的波特率 = fosc/12

方式2的波特率 =(2^SMOD/64)· fosc

方式1的波特率 =(2^SMOD/32)·(T1溢出率)

方式3的波特率 =(2^SMOD/32)·(T1溢出率)

当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。

T1 溢出率 = fosc /{12×[256 -(TH1)]}

串口使用方法(方式1):

具体步骤如下:

一:串口初始化。主要包括确定定时器的工作方式和利用波特率计算初值、确定串口的工作方式,以及打开相应的中断等。

1、确定T1的工作方式(编程TMOD寄存器);

通常使用定时器的工作方式2,8位自动重装,TL1溢出后TH1自动装入。

所以可以设置定时器TMOD=0010 0000=0x20

2、根据波特率计算T1的初值,装载TH1、TL1;可以利用辅助软件计算

3、启动T1(编程TCON中的TR1位);

4、确定串行口控制(编程SCON寄存器);工作在方式1(10位异步收发器) 0101 0000 即SCON=0x50,串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。打开串口中断允许位ES和总中断EA.

二、中断函数的编写

中断函数部分比较简单,就是定义一个变量receivedata用来存放缓冲器SBUF中的值。

接时令变量receivedata=SBUF,然后清除接收标志位(令RI=0)即可。

发送时只需要将receivedata的值赋给SBUF,然后清除发送标志位(令TI=0)即可。

整个过程需要用到串口调试助手。

利用单片机与PC机的通信,可以实现PC机发送指令来控制单片机进行操作。

总结

总的来说,串口通信有以下几个关键的地方。

①利用定时器来作为波特率的发生器。我们要设定通信的波特率,不然的话,单片机是没办法进行采样的,这样也不会得到正确的结果了。根据需要的波特率来计算定时器的初值,这是串口初始化的一部分。

②配置串口相关的寄存器SCON和PCON,SCON主要是用来配置串口的工作方式以及串口使能,以及清除接收/发送中断标志位,PCON用来配置波特率是否加倍。这样初始化就完成了。

③接下来是中断函数的编写。只要设置一个变量用来存放SBUF中的数据就可以接收了,把变量中的值赋给SBUF就可以发送数据了。还可以根据接收的不同数据编写不同的函数,让执行相应的操作。注意每次发送或者接收完数据之后都要清除中断标志位。

④接收和发送缓冲器SBUF具有相同的地址。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子技术研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 80C51串行口的控制寄存器
  • 定时器作为波特率发生器
  • 串口使用方法(方式1):
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档