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

news/2024/9/20 7:27:15/ 标签: 51单片机, 嵌入式硬件, 单片机

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/news/1429876.html

相关文章

SpringBoot---------@Value,@ConfigurationProperyies以及多环境开发配置

application.yml server:port: 8080#logging: # level: # root: info(默认)array:name: zzlage: 18subject:- Java- Vue- SpringBoot Value注解的使用:从yml配置文件中获取数据&#xff0c;即可在类中使用 Value("${server.port}")private String port;Value(&q…

【面试经典 150 | 数组】最后一个单词的长度

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;遍历 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

我与C++的爱恋:日期计算器

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们通过上述内容&#xff0c;来实现一个简易的日期计算器。 ​ ​ 头文件的声明 #pragma once #incl…

文档分享怎么用二维码?扫码获得文档的制作方法

现在日常工作和生活中&#xff0c;经常会看到可以用于展示文件的二维码图片&#xff0c;使用这种方式可以向其他人传递一些资料、通知、数据等情况。比如常见的内容有企业介绍、产品内容、使用说明、活动流程等类型的内容&#xff0c;那么这些不同类型的文件该如何制作二维码呢…

高光谱遥感数据处理与机器学习深度应用

高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。结合Python编程工具&#xff0c;专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&#xff0c;…

Redis快速入门操作

启动Redis 进入命令行客户端 字符串命令常用操作&#xff08;redis默认使用字符串来存储数据&#xff09; 列表&#xff08;Lists&#xff09;常用操作 集合&#xff08;Sets&#xff09;常用操作 &#xff08;无序集合且元素不可重复&#xff09; 有序集合&#xff08;So…

springboot实现图片防盗链功能

前言&#xff1a; 出于安全考虑&#xff0c;我们需要后端返回的图片只允许在某个网站内展示&#xff0c;不想被爬虫拿到图片地址后被下载。或者&#xff0c;不想浏览器直接访问图片链接。 出于性能考虑&#xff0c;不想要别人的网站&#xff0c;拿着我们的图片链接去展示&…

游戏缺少steam_api.dll解决方法-电脑无法找到steam_api.dll修复办法

在当今的数字娱乐领域&#xff0c;Steam作为全球最大的综合性数字发行平台之一&#xff0c;不仅为数以亿计的用户提供便捷的游戏购买、下载、更新服务&#xff0c;还集成了丰富的社交功能及开发者支持工具。对于任何通过Steam平台运行的游戏而言&#xff0c;其背后都离不开一个…

Android JetPack Compose+Room----实现搜索记录功能

文章目录 需求概述功能展示实现搜索功能使用的技术1.Android Jetpack room2.Android JetPack Compose 代码实现编写搜索界面接入Room实现搜索功能的管理引入依赖定义包结构定义操作表的Dao类定义数据库的基础配置定义数据库的Dao管理类使用数据库升级 源码地址 需求概述 搜索功…

好用、可靠有安全的企业局域网文件传输工具

在当今商业环境中&#xff0c;企业对于快速、安全的局域网(LAN)文件传输解决方案的需求不断攀升。选择恰当的工具对提升工作效率和保障数据安全至关重要&#xff0c;同时还能降低潜在的信息泄露风险。以下是企业在挑选局域网文件传输解决方案时应考虑的关键因素及其重要性的详细…

Java电子签名图片生成工具类

在业务中有需要用户信息确认时候去进行电子签名&#xff0c;在实现电子签名存证时候&#xff0c;可以在前端生成图片也可以在后端生成签名存证图片&#xff0c;这里实现一下关于后端Java实现的方法&#xff0c;并总结成工具类&#xff0c;方便之后调用。 工具类方法一 import…

玩转压力管理,轻松高效编程

程序员缓解工作压力的小窍门 在当今快速发展的科技时代&#xff0c;程序员作为数字世界的建筑师&#xff0c;面临着高强度、高压力的工作环境。为保持工作效率和创新能力&#xff0c;同时也确保身心健康和个人热情的持久续航&#xff0c;采取科学合理的减压策略至关重要。 方…

前端模块化整理汇总

AMD 异步加载&#xff0c;依赖前置&#xff0c;前置依赖建议写在前引用&#xff0c;在所有模块加载完成后立即执行回调函数&#xff0c;用户体验好&#xff0c;不容易造成卡顿 需要引用require.js //math.js define([], function () {function add(a, b) {return a b;}retur…

qt实现不定数量的按钮向前向后移动展示

按钮模拟移动 引言示例代码第一种思路开发环境代码结构实现代码第二种思路开发环境实现代码第三种思路开发环境实现代码总结引言 此文主要记录用qt实现按钮的移动,具体效果如下: 模拟按钮移动效果 示例代码 本文记录了三种实现方式。 第一种 思路 用动态数组vector存放创…

代码随想录算法训练营第四十八天|leetcode72、583题

一、leetcode第583题 本题要求删除两个单词中的字母使得剩余字母均相同&#xff0c;因此设置dp数组&#xff0c;dp[i][j]的含义是0-&#xff08;i-1&#xff09;个字母和0-&#xff08;j-1&#xff09;个字母相同时需要删除的最少次数。递推公式在word1[i-1]word2[j-1]时&…

探索DrissionPage:结合浏览器自动化与数据包操控的先进工具

在现代Web开发的世界中&#xff0c;自动化测试和网页操控已经成为日常开发、测试乃至运维工作的重要组成部分。随着技术的不断进步&#xff0c;开发者们总是在寻找更高效、更稳定且能绕过各种限制的工具来满足不断增长的需求。在这样的背景下&#xff0c;DrissionPage应运而生&…

STL-标准模板库

STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西c的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升大多数情况下&#xff0c;数据结构和算法都未能有一套标准&#xff0c;导致被迫从事大量重复工作为了建立数据结构和算法的一套标准&#xf…

C++高级特性:四种类型转换(九)

1、C四种类型转换 强制类型转换是有一定风险的&#xff0c;有的转换并不一定安全&#xff1b;如把整型数值转换成指针&#xff0c;把基类指针转换成派生类指针&#xff0c;把一种函数指针转换成另外一种函数指针&#xff0c;把常量指针转换成非常量指针等… C语言强制类型转换…

数据安全:口令

数据安全&#xff1a;口令 概念 在数据安全和网络安全领域中&#xff0c;口令&#xff08;或密码&#xff09;的安全性至关重要。其中&#xff0c;弱口令和强口令是两个核心概念&#xff0c;它们分别代表了不同级别的密码安全性。 弱口令通常指的是那些容易被猜测或破解的密…

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架 原创 QuantML QuantML 2024-04-17 09:53 上海 Content 本文提出了一个名为FTS-Diffusion的新颖生成框架&#xff0c;用于模拟金融时间序列中的不规则和尺度不变模式。这些模式由于其独…