串口通信实验

通信的基本概念

         51 单片机不仅可以实现串口通信,还可以通过 IO 口模拟实现多种其他通信,比如 SPI、IIC 等。

         通信的方式可以分为不同类型,按数据传送方式可分为串行通信并行通信。按通信的数据同步方式可分为异步通信同步通信。按照数据的传输方向又可分为单工通信半双工通信全双工通信。简单介绍一下这几种通信方式。

 串行通信与并行通信

   串行通信

         串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度,只需几条数据线便可实现在系统之间交换信息。如下图所示

         特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。

   并行通信

         并行通信通常是将 “数据字节的各位(一字节8位)” 用多条数据线同时进行传送,通常是 8 位、16 位、32 位等数据一起传输。如下图所示:

         特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高 ,且同时接收各“位”存在困难,抗干扰能力差。

 异步通信与同步通信

   异步通信

        异步通信是指 “通信的发送与接收设备” 使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。

        异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各个位是以 “固定的时间(位间隔)” 传送的。即,字符之间不一定有 “位间隔” 的整数倍的关系,但字符内的各个位之间的距离均为  “位间隔”  的整数倍。如下图所示:

          异步通信的特点:不要求收发双方时钟的严格一致,实现容易,成本低,但每个字符要附加 2~3 位用于起止位,各帧之间还有空闲,因此传输效率不高。 

   同步通信

        同步通信时,要建立 “发送方时钟” 对 “接收方时钟” 的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为  “位间隔”  的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。如下图所示:

  单工、半双工与全双工通信

   单工通信

        单工是指数据传输仅能沿一个方向,不能实现反向传输。如下图所示:

 

   半双工通信

        半双工是指数据传输可以沿两个方向,但需要分时进行。如下图所示:

   全双工通信

        全双工是指数据可以同时进行双向传输。如下图所示:

通信速率

        通信速率,通常以“比特率”(Bit Rate)来表示。比特率是每秒传输二进制代码的位数,单位是:位/秒( bps)。如每秒钟传送 100 个字符,每个字符格式包含 10 位(1 个起始位、1 个停止位、 8 个数据位),此时比特率为:10\cdot 100= 1000 bps。

        后面会遇到一个“波特率”的概念,表示每秒传输了多少个码元。码元是通信信号调制的概念,通信中常用 “时间间隔相同的符号” 来表示一个二进制数字,这样的时间间隔内的信号称为(二进制)码元。比如用 0V 表示数字 0,5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位(比特位即bit,是计算机最小的存储单位。以0或1来表示比特位的值。),此时波特率的大小与比特率一致(因为传输的都是二进制位);如果在通信传输中,有 0V、 2V、 4V 以及 6V 分别表示二进制数 00、 01、 10、 11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。由于很多常见的通信中一个码元都是表示两种状态, 所以常常直接以波特率来表示比特率。

串口通信简介

        串口通信(Serial Communication),是指外设和计算机间通过数据信号线、 地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。

  接口标准

        串口通信常用的的接口标准是 RS-232 和 RS-485。RS-232 其是 RS-232C 的改进,原理一样。以 RS-232C 接口为例:

        RS-232C 定义了数据终端设备(DTE:Data Terminal Equipment)与数据通信设备(DCE:Distributed Computing Environment)之间的物理接口标准,规定使用 25 针连接器,简称 DB25,连接器的尺寸及每个插针的排列位置都有明确的定义,如下图所示:

          RS-232C 还有一种 9 针的非标准连接器接口,简称 DB9。大部分串口通信都是 DB9 接口。DB25 和 DB9 接头有公头和母头之分,其中带针状的接头是公头,而带孔状的接头是母头。9 针串口线的外观图如下图所示:

         管脚的功能说明如下所示(注:插针序号()内为9针非标准连接器的引脚号):

RS-232C标准接口主要引脚定义
插针序号名称说明信号方向
1PGND接地保护
2(3)TXD传送数据(串行输出)DTE←DCE
3(2)RXD接收数据(串行输入)DTE→DCE
4(7)RTS请求发送DTE→DCE
5(8)CTS允许发送DTE←DCE
6(6)DSRDCE就绪(数据建立就绪)DTE←DCE
7(5)SGND信号接地
8(1)DCD载波检测DTE←DCE
20(4)DTRDTE就绪(数据终端准备就绪)DTE→DCE
22(9)RL振铃提示

DTE←DCE

         RS-232C 对逻辑电平也做了规定,如下:

         在 TXD 和 RXD 数据线上:

  • 逻辑 1 为-3~-15V 的电压 
  • 逻辑 0 为 3~15V 的电压

         在 RTS、CTS、DSR、DTR 和 DCD 等控制线上:

  • 信号有效( ON 状态) 为 3~15V 的电压
  • 信号无效( OFF 状态) 为-3~-15V 的电压

         由此可见,RS-232C 是用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集成电路(TTL)以高低电平表示逻辑状态的规定正好相反。51 单片机使用的是 TTL 电平,所以要实现 51 单片机与计算机的串口通信,需要进行 TTL 与 RS-232C 电平转换。通常使用的电平转换芯片是 MAX232。

         在串口通信中通常 PC 机的 DB9 为公头,单片机上使用的串口 DB9 为母头, 通过一根直通串口线进行相连。在 9 针串口线实物图即为直通型串口线,串口线 母头连接计算机 DB9 的公头,串口线公头连接单片机上使用的 DB9 母头,这样就是将 2、3、5 管脚直接相连。如果要实现两台计算机串口通信, 那么就需要一根交叉串口线,将 2 对 3、3 对 2、5 对 5 连接,交叉串口线一 般两头都是母头。

          串口通信中还需要注意的是,串口数据收发线要交叉连接,计算机的 TXD 要对应单片机的 RXD,计算机的 RXD 要对应单片机的 TXD,并且共 GND,如下图:

通信协议

          RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式。

          “96”表示的是通信波特率为 9600。串口通信中,通常使用的是异步串口通信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率。波特率常用值还有 4800、 115200 等。

          “N”表示的是无校验位,由于串口通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。 

          “8”表示的是数据位数为 8 位,其数据格式在前面介绍异步通信中已讲过。 数据位数还可以为 5、6、7 位长度。

          “1”表示的是 1 位停止位,串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。      

串口内部结构

          图中的 TXD 和 RXD 为单片机 IO 口,TXD 对应 P3.1 管脚,RXD 对应P3.0 管脚。

串口相关寄存器

串口控制寄存器 SCON

76543210
字节地址:98HSM0SM1SM2RENTB8RB8T1RL

          SM0 和 SM1 为工作方式选择位: 

串口行的工作方式
SM0SM1方式说明波特率
000移位寄存器Fosc/12
01110位异步收发器(8位数据)可变
10211位异步收发器(9位数据)Fosc/12或Fosc/32
11311位异步收发器(9位数据)可变

          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,可以实现多机通信。

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

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

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

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

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

电源控制寄存器 PCON

76543210
字节地址:97HSM0D 

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

串口工作方式

方式 0

          方式 0 时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由 RXD(P3.0)引脚输入或输出,同步移位脉冲由 TXD(P3.1)引脚输出。发送和接收均为 8 位数据,低位在先,高位在后。波特率固定为 fosc/12。对应的输入输出时序图如下所示:

          方式 0 输出:

           方式 0 输入:

方式 1

           方式 1 是 10 位数据的异步通信口。TXD 为数据发送引脚,RXD 为数据接收引脚,传送一帧数据的格式如下所示。

            其中 1 位起始位,8 位数据位,1 位停止位。对应的输入输出时序图如下所示:

          方式 1 输出:

          方式 1 输入:

          用软件置 REN 为 1 时,接收器以所选择波特率的 16 倍速率采样 RXD 引脚电平,检测到 RXD 引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当 RI=0,且 SM2=0(或接收到的停止位为 1)时,将接收到的 9 位数据的前 8 位数据装入接收 SBUF,第 9 位(停止位)进入 RB8,并置 RI=1,向 CPU 请求中断。

方式 2 和方式 3

          方式 2 或方式 3 时,为 11 位数据的异步通信口。TXD 为数据发送引脚,RXD 为数据接收引脚。其数据格式如下所示:

           对应的输入输出时序图如下所示:

          方式 2、方式 3 输出:

          发送开始时,先把起始位0输出到 TXD 引脚,然后发送移位寄存器的输出位 (D0)到 TXD 引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由 TXD 引脚输出。第一次移位时,停止位“1”移入输出移位寄存器的第 9 位上,以后每次移位,左边都移入 0。当停止位移至输出位时,左边其余位全为 0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置 TI=1,向 CPU 请求中断。

          方式 2、方式 3 输入:

          接收时,数据从右边移入输入移位寄存器,在起始位 0 移到最左边时,控制电路进行最后一次移位。当 RI=0,且 SM2=0(或接收到的第 9 位数据为 1)时, 接收到的数据装入接收缓冲器 SBUF 和 RB8(接收数据的第 9 位),置 RI=1,向 CPU 请求中断。如果条件不满足,则数据丢失,且不置位 RI,继续搜索 RXD 引脚 的负跳变。

串口的使用方法

计算波特率

          几种方式下波特率的计算公式:

方式 0 的波特率 :  fosc/12

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

方式 2 的波特率 :(2^{SMOD}/64)· fosc

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

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

串口初始化步骤

          使用串口,可以按照以下几个步骤配置。

  1. 确定 T1 的工作方式(TMOD 寄存器)
  2. 确定串口工作方式(SCON 寄存器)
  3. 计算 T1 的初值(设定波特率),装载 TH1、TL1
  4. 启动 T1(TCON 中的 TR1 位)
  5. 如果使用中断,需开启串口中断控制位(IE 寄存器)

          例如:设置串口为工作方式 1、波特率为 9600、波特率加倍、使用中断。其配置程序如下:

void uart_init(u8 baud)
{
TMOD|=0X20; //设置计数器工作方式 2
SCON=0X50; //设置串口为工作方式 1
PCON=0X80; //波特率加倍
TH1=baud; //计数器初始值设置
TL1=baud;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}

硬件部分

        USB 转 TTL 模块:

        由上图可以看出,通过 CH340 芯片把 51 单片机的串口与 PC 机的 USB 口 进行连接,不仅可以实现程序的烧入,还可实现串口通信功能。根据前面介绍, 串口通信需将数据收发管脚交叉连接,所以可以看到在 CH340 芯片的 2 和 3 脚 已做处理。电路中其他部分是自动下载电路部分,目的是控制单片机的电源,无需冷启动。使用 USB 转串口芯片,免去了一根串口线,使用普通 USB 数据线(支持安卓手机数据线)就可以进行串口通信。

         从上图中可以看到 CH340 的 2、3 脚串口并非直接连接到单片机串口,而是连接在 J39 和 J44 端子上,这样就把 CH340 的串口与单片机串口独立出来。 使用黄色跳线帽将 J39 和 J44 端子的 2、3 短接,那么 CH340 串口与单 片机串口是连接一起的,此时即可实现程序的下载或串口通信。

        使用黄色跳线帽将 J39 和 J44 端子的 3、4 短接,那么 RS232 模块串口与单片机串口是连接 一起的,此时可通过 RS232 模块下载程序或串口通信。

 软件部分 

        实验代码比较简单,首先定义了串口通信中断配置函数 uart_init,该函数有一个入口参数 baud,该值可改变通信波特率。该函数的实现即是按照前面介绍的串口配置步骤。最后进入 while 循环,在循环体内不执行任何功能程序。如果发生接收中断,即会进入串口中断执行,执行完后回到主函数内继续运行,如此循环。

#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;

void uart_init(u8 baud)
{
	TMOD|=0X20; //设置计数器工作方式 2
	SCON=0X50; //设置为工作方式 1
	PCON=0X80; //波特率加倍
	TH1=baud; //计数器初始值设置
	TL1=baud;
	ES=1; //打开接收中断
	EA=1; //打开总中断
	TR1=1; //打开计数器
}

void main()
{
	uart_init(0XFA);//波特率为 9600
	while(1)
	{

	}
}

void uart() interrupt 4 //串口通信中断函数
{
	u8 rec_data;
	RI = 0; //清除接收中断标志位
	rec_data=SBUF; //存储接收到的数据
	SBUF=rec_data; //将接收到的数据放入到发送寄存器
	while(!TI); //等待发送数据完成
	TI=0; //清除发送完成标志位
}

现象 

        使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口), 把编译后产生的.hex 文件烧入到芯片内,实现现象如下:当串口助手发送数据 给单片机,单片机原封不动转发给串口助手显示。

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值