(51单片机)第十一章-串行口应用提高

server/2024/10/18 22:33:20/

11.1 方式0应用

        在第6章中,已经对单片机>51单片机的串行口结构做过详细介绍,并且通过实例讲解了串行口的4种工作方式中方式1的具体用法,本节详细讲述串行口方式0的用法。

        串行口方式0被称为同步移位寄存器的输入/输出方式,主要用于扩展并行输入或输出口。数据由 RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均8位数据低位在先高位在后波特率固定为fosc/12。在该模式下,串行口的SBUF是作为同步移位寄存器使用的。在串行口发送时,SBUF相当于一个并行进入、串行输出的移位寄存器,由单片机的内部总线并行接收8位数据,并从RXD信号线串行输出。在接收操作时,它又相当于一个串行输入、并行输出的移位寄存器。该模式下SM2RB8TB8不起作用。其数据输出时序图如下图所示,数据输入时序图如下下图所示。

        发送操作在 TI=0 时进行,CPU将数据移入SBUF之后,RXD线上即可发出8位数据,TXD上发送同步脉冲。8位数据发送完后,TI由硬件置位,并在中断允许的情况下向CPU申请中断。CPU 响应中断后,先用软件使TI清0,然后再给SBUF 送下一个需要发送的字符如此重复上面的过程。

        接收过程是在 REN=1和 RI=0 的条件下启动的。此时,串行数据由 RXD 线输入,TXD线输出同步脉冲。接收电路接收到8位数据后,RI自动置位并在中断允许的条件下向CPU发出中断请求。CPU查询到RI为1或者响应中断以后便将SBUF 中的数据送到累加器。RI需要由软件复位。

        需要注意,串行口工作模式0并不是一个同步串口通信方式,它的主要用途是与外面的同步移位寄存器相连,以达到扩展单片机输入并行口和输出并行口的目的,其典型应用图如下图所示。

        74LS164 是一个8位串行输入、并行输出的移位寄存器,CLR用来清0,A、B 两个输入端,可使用任一个作为输入端,也可两个同时作为输入端,单片机的RXD 引脚将数据送至 A、B端,然后在CLK同步时钟脉冲作用下,8位串行数据全部移至8位并行口上。

        74LS165 是一个8位并行输入、串行输出的移位寄存器,上图中Q为串行输出端,S/L端为启动移位信号端,一个低脉冲可启动移位操作。

        示例

        设置单片机串行口工作模式 0,间隔循环发送十六进制数 0xAA,然后用双路示波器观察 P3.0和 P3.1口波形。程序代码如下:

#include <reg52.h>#define uchar unsigned char
#define uint unsigned intvoid main()
{void delayxms(uint xms); //延时函数 ms为单位SCON=0;EA=1;ES=1;TI=0;while(1){SBUF=0xaa;delayxms(1);}
}void delayxms(uint xms) //延时函数 ms为单位
{uint x,y;for(x=xms;x>0;x--)for(y=124;y>0;y--);	
}void ser() interrupt 4
{TI=0;
}

11.2 方式2和方式3应用

        方式2和方式3都为11位数据的异步通信口,它们的唯一区别是传输速率不同。TXD为数据发送引脚,RXD为数据接收引脚。用这两种方式传输数据时,起始位1位,数据位9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。一帧数据传输格式如图11.2.1所示。

        数据输出和数据输入的时序图如下图所示:

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

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

串口方式2的波特率=(2SMOD/64)*fosc

串口方式3的波特率=(2SMOD/32)*T1溢出率

        在方式2和方式3中,要用到SCON寄存器中的TB8位和RB8位,TB8为数据发送的第9位,用于模式2和模式3,由软件更改。RB8为数据接收的第9位,用于模式2和模式 3。在模式1中,如果SM2=0,则RB8用于存放接收的停止位,在模式0下不使用该位。

示例

        设置单片机串行口工作模式 2,间隔循环发送十六进制数 0xAA,然后用示波器观察单片机 P3.1口波形。,程序代码如下:

#include <reg52.h>#define uchar unsigned char
#define uint unsigned intvoid main()
{void delayxms(uint xms); //延时函数 ms为单位SM0=1;SM1=0;TB8=0;EA=1;ES=1;TI=0;while(1){SBUF=0xaa;delayxms(1);}
}void delayxms(uint xms) //延时函数 ms为单位
{uint x,y;for(x=xms;x>0;x--)for(y=124;y>0;y--);	
}void ser() interrupt 4
{TI=0;
}

11.3 单片机双机通信

        单片机的双机通信有短距离和长距离之分,1m之内的通信称为短距离,1000m左右的通信称为长距离。若要更长距离通信,如几十或几千千米,就需要借助其他无线设备方可实现。通常单片机通信可以有以下4种实现方式:TTL电平通信(双机串行口直接互连)RS-232C通信、RS-422A 通信、RS-485 通信等,不同的传输方式各有自己的特点。

1. TTL 电平通信

        TTL电平通信时,直接将单片机A的TXD 端接单片机 B的RXD 端,单片机 A的RXD端接单片机B的TXD端。需要强调的是,两个单片机系统必须要共地,即把它们的系统电源地线连接在一起(重要,相对电压值要一定)。

        单片机的 TTL电平双机通信通常多用在同一个系统中。当一个系统中使用一个单片机资源不够时,可再加入一个或几个单片机,两两单片机之间可以构成双机通信。当一个单片机连接两个或两个以上的单片机时,可以采用一机对多机通信。通常一个系统中单片机之间的距离都不会太远,设计系统时,尽量使单片机之间的通信距离缩短,距离越短,通信越可靠若数据线过长,很有可能受外界的干扰而在通信过程中造成数据错误。

2. RS-232C 通信

        RS-232C是EIA(美国电子工业协会)1969年制定的通信标准。RS-232C定义了数据终端设备(DTE)数据通信设备(DCE)之间的物理接口标准。RS-232C标准接头如下图所示。

        RS232标准接口主要引脚定义如下表所示:

        标准的 RS-232C最初用于计算机远程通信时的调制解调器上,即通常我们所说的“猫”当使用“猫”时,上图中9条信号线都要用到。但我们用RS-232C 标准进行两个单片机之间通信时,只需要用到表中的三条线:RXD,TXD和GND。RS-232C双机通信接口电路如下图所示。

        RS-232C 电平传输数据时,相比TTL电平距离要远,RS-232C总线标准受电容允许值的约束,使用时传输距离一般不要超过15m(线路条件好时也不要超过30m)。其最高传送速率为 20kbps。RS-232C 总线标准要求收、发双方必须共地。通信距离较大时,由于收、发双方的地电位差较大,在信号地上将有比较大的地电流并产生压降,这样会形成电平偏移。RS-232C 在电平转换时采用单端输入/输出,在传输过程中,干扰和噪声会混在正常的信号中为了提高信噪比,RS-232C总线标准要采用比较大的电压摆幅

3. RS-422A 通信

        RS-422A 输出驱动器为双端平衡驱动器。如果其中一条线为逻辑1态,另一条线就为逻辑0态,比采用单端不平衡驱动对电压的放大倍数大一倍。差分电路能从地线干扰中拾取有效信号,差分接收器可以分辨 200mV 以上电位差若传输过程中混入了干扰和噪声,由于差分放大器的作用,可使干扰和噪声相互抵消,因此可以避免或大大减弱地线干扰和电磁干扰的影响。RS-422A 传输速率 90kbps 时,传输距离可达1200m。RS-422A 双机通信接口电路如下图所示

4. RS-485 通信

        RS-485 是 RS-422A 的变型。RS-422A用于全双工,而RS-485 则用于半双工。RS-485 是种多发送器标准,在通信线路上最多可以使用 32对差分驱动器/接收器。如果在一个网络中连接的设备超过 32个,还可以使用中继器。RS-485 的信号传输采用两线间的电压来表示逻辑1和逻辑0。由于发送方需要两条传输线,接收方也需要两条传输线。传输线采用差动信道,所以它的干扰抑制性极好,又因为它的阻抗低,无接地问题,所以传输距离可达1200m传输速率可达1Mbps。RS-485双机通信接口电路如下图所示。

5. 远程无线通信

        当通信距离超过数百上千千米时,我们最好借助无线设备,当然如果距离较近,布线又不方便时,也可以使用近距离无线设备。近距离无线设备有无线数据传输模块、数据传输电台等,这些设备的传输距离很有限,通常与设备的发射功率有直接的关系,发射功率越大,传输距离就越远,但不会超过几十千米。通常的无线数据传输模块,小功率的只能传播数十米到一二百米,稍大功率的也就能传播几百米到几千米,这类设备价格较低,预留接口通常为 TTL电平、RS-232C或RS-485 接口,与单片机系统连接非常简单,编写程序也很容易,只需要一次性投入,便可永久使用。

11.4 单片机多机通信

        单片机构成的多机系统常采用总线型主从式结构。所谓主从式,即在数个单片机中,有一个是主机,其余的都是从机,从机要服从主机的调度、支配。单片机>51单片机的串行口方式2和方式3适于这种主从式通信结构。当然,采用不同的通信标准时,还需进行相应的电平转换有时还要对信号进行光电隔离。在实际的多机应用系统中,常采用RS-485 串行标准总线进行数据传输。多机通信连接如下图所示。

多机通信时,通信协议要遵守以下原则:

        (1)所有从机的 SM2 位置1,处于接收地址帧状态。

        (2)主机发送一地址帧,其中8位是地址,第9位为地址/数据的区分标志,该位置1表示该帧为地址帧。所有从机收到地址帧后,都将接收的地址与本机的地址比较。对于地址相符的从机,使自己的 SM2位置0(以接收主机随后发来的数据帧),并把本机地址发回主机作为应答;对于地址不符的从机,仍保持SM2=1,对主机随后发来的数据帧不予理睬。

        (3)从机发送数据结束后,要发送一帧校验和,并置第9位(TB8)为1,作为从机数据传送结束的标志。

        (4)主机接收数据时先判断数据接收标志(RB8),若RB8=1,表示数据传送结束,并比较此帧校验和,若正确则回送正确信号00H,命令该从机复位(即重新等待地址帧);若校验和出错,则发送信号 0FFH,命令该从机重发数据。若接收帧的RB8=0,则将数据存到缓冲区,并准备接收下一帧信息。

        (5)主机收到从机应答地址后,确认地址是否相符,如果地址不符,则发复位信号(数据帧中 TB8=1);如果地址相符,则TB8清0,开始发送数据。从机收到复位命令后回到监听地址状态(SM2=1),否则开始接收数据和命令。

编写程序时可以按以下方式操作:

        (1)主机发送的地址联络信号为00H,01H,02H,…(即从机设备地址):地址FFH为命令各从机复位,即恢复 SM2=1。

        (2)主机命令编码如下:01H—主机命令从机接收数据;02H—主机命令从机发送数据若有其他数据,则都按 02H对待。

        (3)从机状态字格式如下表所示。

        若 ERR=1,从机接收到非法命令

        若TRDY=1,从机发送准备就绪

        若RRDY=1,从机接收准备就绪。

        通常,从机以中断方式控制和主机的通信。

下面为多机通讯主机程序流程图和从机程序流程图。

参考资料: 

[1] 郭天祥. 新概念单片机>51单片机C语言教程:入门、提高、开发、拓展全攻略[M]. 北京: 电子工业出版社, 2009.


http://www.ppmy.cn/server/7907.html

相关文章

C语言练习——上三角矩阵

前言 今天我们来看看如何使用代码实现上三角矩阵吧。首先我们来了解一下上上三角矩阵是什么&#xff0c;上三角矩阵就是在矩阵从左上到右下的对角线之下的数组元素都为0的数组方矩阵&#xff0c;例如&#xff1a; 以一个三阶矩阵为例&#xff0c;在对角线元素之下&#xff0c;就…

大sql mysql执行

先把sql 拆分 太大的执行失败 使用 SQLDumpSplitter3 拆分sql 执行拆分的sql 拆分的sql 打开发现很多 ; 开头的空行 替换掉 正则 ^; 修改数据库 my.cnf my,ini 执行可能会提示 [ERR] 2006 - Server has gone away 错误 在 [mysqld] 添加以下几行 wait_timeout2880000 inter…

【Hadoop】- MapReduce YARN 初体验[9]

目录 提交MapReduce程序至YARN运行 1、提交wordcount示例程序 1.1、先准备words.txt文件上传到hdfs&#xff0c;文件内容如下&#xff1a; 1.2、在hdfs中创建两个文件夹&#xff0c;分别为/input、/output 1.3、将创建好的words.txt文件上传到hdfs中/input 1.4、提交MapR…

【讲解下Spring Boot单元测试】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Apache Spark 文件拆分机制

目录 数据拆分的基本概念 文件拆分的过程 保证数据完整性的机制 总结 数据拆分的基本概念 Apache Spark 在处理大规模数据集时&#xff0c;会将数据分成多个小块&#xff0c;这些小块称为分区&#xff08;partitions&#xff09;。数据被分区的目的是为了并行处理&#xff…

【Xilinx】时序约束学习 TIMING-2: 基准时钟源管脚无效

在错误的管脚 <pin_name> 上创建了基准时钟 <clock_name>。建议仅在适当的时钟根&#xff08;不含时序弧的输入端口或原语输出管脚&#xff09; 上创建基准时钟。 描述 基准时钟必须在时钟树的源时钟上定义。例如&#xff0c; 源时钟可能是设计的输入端口。如果在…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…

【python】Paste Mask

学习来自【OpenCv】利用roi 掩模 将一张图片添加到另一张上 任务描述&#xff1a;提取图片A的 mask 区域&#xff0c;并粘贴到图片B上 文章目录 1 代码实现2 结果展示3 涉及到的库cv2.bitwise_notcv2.bitwise_andcv2.add 附录——获取 mask 的边界框 1 代码实现 A 图 A 图的 …