51单片机玩转物联网基础篇09-串口通信

前言

串口通信在嵌入式开发中占据非常重要的低位,串口经常被用来调试系统,打印必要的调试信息,帮助我们分析定位问题,同时很多常见的外设也支持串口协议,如WIFI模块、蓝牙模块、4G模块、指纹模块、PM2.5传感器、甲醛传感器等诸多元器件,本节开始,我们正式学习51单片机的串口。

一、基础知识

1. 通信方式简介

串口使用的通信方式是串行通信,串口通信是相对于并行通信来说的,所谓并行通信的是数据的各位同时传送,其特点是传输速度快、效率高,但是使用数据线较多,传输成本较高,适合近距离通信,其示意图如下:
图片
所谓串行通信其实是指数据通过一根数据线一位一位依次传送给目标设备,其特点是至少只需要一根传输线即可完成,成本低但传输速断慢,其只需要少数几条线就可以在系统间交换信息。其示意图如下:
图片

2. 串行通信制式

按照数据传输方向,可以分为三张总制式,即单工、半双工、全双工。 图片(a) 单工制式

A站和B站数据只能从一个设备发至另一个设备,单向传输。

(b) 半双工工制式

A站和B站数据传送是双向的,但同一时刻只能有一个方向数据传送,接收开关可由软件控制。

© 全双工制式

A站和B站任意时刻数据都可以同时发送和接收数据

3. 单片机串口介绍

我们将从单片机串口结构原理、串口通信方式特点两个方面介绍单片机串口,串口结构原理了解即可,串口通信方式特点需要重点掌握

(a) 串口结构原理

图片
单片机串口内部结构如上图所示,主要由两个物理上独立的串行数据缓冲寄存器SBUF、发送控制器、接收控制器、输入移位寄存器和输出控制门组成,单片机发送数据时候通过TXD(P3.1引脚)发出,接收数据时使用RXD(P3.0引脚),注意发送SBUF和接收SBUF共用一个地址,不可同时使用。

(b) 串口相关寄存器

(1) 控制寄存器SCON(88H)
图片
TCON用于控制定时器的启动、停止、溢出标志和外部中断信号触发方式。

(2) 方式控制寄存器TMOD(89H)
图片
从上图中可知,GATE为0时候,定时器由TR0或TR1控制启动,为1的时候,只有在外部中断引脚为高电平时候,TR0或者TR1才可以控制启动,对于T1,有3种工作方式,而T0有四种工作方式;

© 串口工作方式

串口的工作方式由控制寄存器SCON的SM0和SM1两位进行控制,具体工作方式如图所示。
在这里插入图片描述
(1) 方式0

在方式0下,串行口位同步移位寄存器方式,波特率固定位fosc/12。这时的 数据传送,无论是输入还是输出,均由RXD端完成,由TXD端输出移位时钟脉冲。发送和接收一帧的数据为8位二进制,不设起始位和停止位,低位在前,高位在后,一般用于I/O的扩展。对应的时序图如下所示。

①方式0发送
在这里插入图片描述
②方式0接收
在这里插入图片描述
方式0下,SCON中的TB8、RB8位没有用到,发送或接收完8位数据由硬件置“1”TI或RI中断标志位,CPU响应中断, TI或RI标志位须由用户软件清“0”。

(2) 方式1

在方式1下,串行口位10位通用异步通信接口。一帧信息包括1位起始位,8位数据位和1位停止位,8位数据位是低位在前高位在后。方式1的时序图如下所示。

①方式1发送
图片

②方式1接收
图片

串行口以方式1发送时,数据由TXD端输出。任何一条以SBUF为目的的寄存器都启动一次发送,发送条件是TI=0.发送开始时内部SEND信号变为有效电平,随后由TXD端输出自动加入的起始位,此后每过一个时钟脉冲,由TXD端输出一个数据位,8位数据位发送完后,置位TI,TI置是通知CPU可发下一个字符。

方式1接收时,数据从RXD端输入,当REN置后,就允许接收器接收,接收器便以波特率的倍速率采样RXD端电平,当采样到RXD端从到的跳变时就启动检测器,接收的值是3次连续采样(第7、8/9个脉冲时采样)取其中两次相同的值,以确认是否真正的(负跳变)的开始。

(3)方式 2和方式3

串行口工作在2、3时,为11位异步通信口,发送、接收一帧信息由11位组成,即1位起始位,8位数据位,1位可编程位和1位停止位。发送时,可编程位(TB8)可设置0或1,该为一般用做校验位或地址为/数据位标志。接收时,可编程位送入SCON中的RB8。

在接收器收到第9位数据后,需满足一下两个条件,才能将接收到的数据送入SBUF。(1)SM2=0或接收到的第9位数据位RB8=1时。(2RI=0,意味着接收缓冲器为空。当上述两个条件满足时,接收到的数据送入SBUF,第9位数据送入RB8,RI置1,若不满足这两个条件,接收到的信息将被丢弃。方式2和方式3的时序图如下所示。

①方式2和方式3发送
图片

②方式2和方式3接收
图片
方式2、3的区别在于:方式2的波特率位fosc/32或fosc/64,而方式3的波特率可变。方式2/3发送时,数据由TXD端输出,附加的第9位数据位SCON中的TB8,方式2/3接收时,可编程送入SCON中的RB8。

4. 串口波特率计算

在方式0时,每个机器周期发送或接收一位数据,因此波特率固定为单片机时钟频率的1/12,且不受SMOD的影响。若晶振频率fosc=12MHZ时,则波特率=fosc/12=1Mb/s,即1us移位一次。

方式2的波特率取决于PCON中的SMOD的值,当SMOD=0时,波特率位fosc的1/64,若SMOD=1时,则波特率位fosc的1/32.

方式1、方式3的波特率可变,由定时器T1的溢出率与SMOD的值共同决定,波特率=2SMOD/32×(定时器1溢出率) ,其中溢出率取决于计数速率和定时器的预置值。定时器的溢出周期为=(256-X)×12/fosc,溢出率为溢出周期的倒数。

因此,波特率的公示可以写成波特率=(2SMOD/32)×[fosc/12×(256-X)]。实际应用时,总是先确定波特率,再计算定时器1的定时初值,根据上述波特率的公式,得出定时器方式2的初值公式为:X=256-(2SMOD×fosc)/(384×波特率)。例如,已知8051单片机时钟频率为11.0592MHZ,选用T1工作方式2作为波特率发生器,波特率位9600,则定时器初值,TH1=256-(11059200/384/9600)256-3=253。

二、实例运行

1、程序

串口初始化程序:

void ConfigUART(unsigned int baund)
{
    SCON  = 0x50;  //配置串口为模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1为模式2
    TH1 = 256 - (11059200/12/32)/baund;  //计算T1重载值
    TL1 = TH1;     //初值等于重载值
    ET1 = 0;       //禁止T1中断
    ES  = 1;       //使能串口中断
    TR1 = 1;       //启动T1
}

串口中断程序

void InterruptUART() interrupt 4
{
    if (RI)  //接收到新字节
    {
       RI = 0;  //清零接收中断标志位
       SBUF=SBUF+1;//将接收到的数据加1发回去
    }
    if (TI)  //字节发送完毕
    {
        TI = 0;   //清零发送中断标志位
    }
    
}

三、运行

将hex文件烧录到开发板中,显示效果如下图所示,串口助手发送数据,单片机返回数据。 图片

四、结语

如您在使用过程中有任何问题,请加QQ群进一步交流。

QQ交流群:906015840 (备注:物联网项目交流)

源码获取:扫描下方二维码,关注公众号,回复"51单片机"即可

硬件获取:淘宝搜索店铺"小驿物联"。或者点我
在这里插入图片描述
小驿物联出品:专注开源智能硬件,促进更多创意产品诞生,让技术不再是阻碍!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值