您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页RS-485通信

RS-485通信

来源:爱问旅游网
项目4.4 RS-485通信 一、 任务目标。

 理解RS-485通信原理。

 实现单片机通信RS-485通信仿真实验。

二、任务要求。

任务主要实现单片机向计算机发送数据;同时实现接收计算机传送过来的数据并把接收到的数据回传给计算机。

三、相关知识点

通常的微处理器都集成有 1 路或多路硬件UART 通道,可以非常方便地实现串行通讯。在工业控制、电力通讯、智能仪表等领域中,也常常使用简便易用的串行通讯方式作为数据交换的手段。但是,在工业控制等环境中,常会有电气噪声干扰传输线路,使用RS-232 通讯时经常因外界的电气干扰而导致信号传输错误;另外,RS-232 通讯的最大传输距离在不增加缓冲器的情况下只可以达到15 米。为了解决上述问题,RS-485/422 通讯方式就应运而生了。

1、RS-232/422/485 标准

RS-232、RS-422 与RS-485 最初都是由电子工业协会(EIA)制订并发布的。RS-232在1962 年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-422是由RS-232 发展而来,它是为弥补RS-232 之不足而提出的。为改进RS-232 通信距离短、速率低的缺点,RS-422 定义了一种平衡通信接口,将传输速率提高到10Mbps,传输距离延长到4000 英尺(速率低于100kbps 时),并允许在一条平衡总线上连接最多10 个接收器。RS-422 是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A 标准。为扩展应用范围,EIA 又于1983 年在RS-422 基础上制定了RS-485 标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A 标准。由于EIA 提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS 作前缀称谓。RS-232、RS-422 与RS-485 标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。但由于PC 上的串行数据通讯是通过UART 芯片(较老版本的PC 采用I8250 芯片或Z8530 芯片)来处理的,其通讯协议也规定了串行数据单元的格式(8-N-1 格式):1 位逻辑0 的起始位,6/7/8 位数据位,1 位可选择的奇(ODD)/偶(EVEN)校验位,1/2 位逻辑1 的停止位。基于PC 的RS-232、RS-422 与RS-485标准均采用同样的通讯协议。

表格 1-1 列出了RS-232、RS-422、RS-485 通讯方式的区别。

表格 1-1 RS-232、RS-422、RS-485 的区别

标准 工作方式 节点数 最大传输电缆长度 最大传输速率 最大驱动输出电压 发送器输出信号电平 (负载最小值) 发送器输出信号电平 (空载最大值) 负载 RS-232 单端 1收、1 发 50英尺 20Kbps +/-25V +/-5V~+/-15V RS-422 差分 1发10 收 4000英尺 10Mbps -0.25V~+6V ±2.0V RS-485 差分 1发32 收 4000英尺 10Mbps -7V~+12V ±1.5V 空载 +/-25V 3K~7K 30V/μs ±15V ±3V 3K~7K -- -- ±6V 100 N/A -10V~+10V ±200mV 4K(最小) -3V~+3V -7V~+7V ±6V N/A -7V~+12V ±200mV ≥12K -1V~+3V -7V~+12V 发送器负载阻抗(Ω) 摆率(最大值) 接收器输入电压范围 接收器输入门限 接收器输入电阻(Ω) 发送器共模电压 接收器共模电压 2、RS-485数据传输协议

此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通

信的。它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息按本协议发出。

1)RS-485数据在网络上转输

控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。

主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则从设备不作任何回应。协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。 从设备回应消息也由协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误(无相应的功能码),或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

2)RS-485在对等类型网络上转输

在对等网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。

在消息位,本协议仍提供了主—从原则,尽管网络通信方法是“对等”。如果一控制器发送一消息,它只是作为主设备,并期望从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。

3)RS-485查询—回应周期 (1)RS-485查询

查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。错误检测域为从设备提供了一种验证消息内容是否正确的方法。

(2)RS-485回应

如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。

3、RS-485通讯协议传输方式

控制器能设置传输模式为RS-485串行传输,通信参数为9600,n,8,1。在配置每个控制器的时候,在一个网络上的所有设备都必须选择相同的串口参数。

地址 功能代码 数据数量 数据1 ……. 数据n CRC字节 每个字节的位 · 1个起始位

· 8个数据位,最小的有效位先发送 · 1个停止位 错误检测域

· CRC(循环冗余码校验)

4、RS-485通讯协议消息帧

1)RS-485通讯协议帧格式

传输设备将消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。错误消息也能侦测到并能返回结果。

消息发送至少要以10ms 时间的停顿间隔开始。传输的第一个域是设备地址。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少10ms 时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。

整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过5ms时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个

新消息在小于5ms的时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示: 起始间隔 设备地址 功能代码 数据数量及数据 CRC校验 结束

2)RS-485通讯协议地址域

消息帧的地址域包含一个字符8Bit。可能的从设备地址是0…247 (十进制)。单个设备的地址范围是1…247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,也把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。

地址0是用作广播地址,以使所有的从设备都能认识。 3)RS-485通讯协议如何处理功能域

消息帧中的功能代码域包含了一个字符8Bits。可能的代码范围是十进制的1…255。当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。 当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为。例如去读取当前检测参量的值或开关状态,读从设备的诊断状态,允许调入、记录、校验在从设备中的程序等。

当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应)。对正常回应,从设备仅回应相应的功能代码。对异议回应,从设备返回一等同于正常代码的代码,但功能代码的最高位为逻辑1。

例如:一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码: 0 0 0 0 0 0 1 1 (十六进制03H)

对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回: 1 0 0 0 0 0 1 1 (十六进制83H)

除功能代码因异议错误作了修改外,从设备将一独特的代码放到回应消息的数据域中,这能告诉主设备发生了什么错误。

主设备应对程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从设备的消息并报告给操作员。

4)RS-485通讯协议数据域

从主设备发给从设备消息的数据域包含附加的信息:从设备用于进行执行由功能代码所定义的行为所必须的数据。

如果没有错误发生,从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。

在某种消息中数据域可以是0长度。例如,主设备要求从设备回应通信事件记录,从设备回应不需任何附加的信息。

数据域最长为70字节。 5)RS-485通讯协议错误检测域

错误检测域包含一字节8Bits。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,故CRC字节是发送消息的最后一个字节。

5、RS-485通讯协议错误检测方法

1)RS-485通讯协议超时检测

用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作为正常反应。如果从设备检测到一传输错误,消息将不会接收,也不会向主设备作出回应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生超时。

2)RS-485通讯协议CRC检测

CRC域是一个字节,检测了整个消息的内容。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误,从设备对本消息不作回应。

通讯网络只设有一个主机,所有通信都由他发起。网络可支持2个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。

四、项目分析

本项目主要实现单片机与单片机之间进行485通信,通过甲单片机的按键弹压实现乙单片机控制的LED灯明灭。

1、硬件电路设计

在Proteus 8 Professional仿真软件中按下图设计出仿真原理图,硬件电路包括两个51单片机、8个LED发光管、8个按键、两个MAX487通信芯片。

图4.32 RS-485通信仿真硬件电路原理图

2、程序设计

发送部分程序设计 /*

实验 名称:RS-485通信仿真实验数据发送部分程序

功 能: 按下8个按键中的任意一个,单片机检测P0端口有无按键按下,把采集到的P0端口的按键情况以8位数据发送出去。 晶 振:11.0592MHz MCU 类型:ATC51 作 者:卢厚财 创建 日期:14-02-04 */

#include #include #define uchar unsigned char #define uint unsigned int

/************************************************************************* ** 函数名称: void delay(uchar k) ** 功能描述: 软件延时程序 ** 输 入: uchar k ** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无

** 说 明:延时约1MS ** 注 意:无

**************************************************************************/ void delay(uchar k) {

uchar j;

while((k--)!=0) {

for(j=0;j<125;j++) } }

/************************************************************************* ** 函数名称: void init(void) ** 功能描述: 系统配置初始化 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无

** 说 明:串口初始化

{;}

** 注 意:无

**************************************************************************/ void init(void) {

TMOD=0x20; TH1=0xe8; TL1=0xe8;

PCON=0x00; TR1=1; SCON=0x90; }

/************************************************************************* ** 函数名称: void send(uchar Send_Data)

** 功能描述: 采集P0端口的状态数据然后,通过串口进行数据发送 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无 ** 说 明:无 ** 注 意:无

**************************************************************************/ void send(void) {

SBUF= P0; while(TI==0) { ; } TI=0; }

/************************************************************************* ** 函数名称: void main(void)

** 功能描述: 主函数,不断调用发送模块send( SBUF)将P0口状态数据发送出去。 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无

** 调用模块: send(); delay(200);

** 说 明:不断调用发送模块将P0口状态数据发送出去。 ** 注 意:无

**************************************************************************/ void main(void) { init(); while(1)

{

send(); delay(200); } }

接收程序部分 /*

实验 名称:RS-485通信仿真实验数据接收部分程序 功 能: 接收到数据后控制LED灯的明灭。 晶 振:11.0592MHz MCU 类 型:ATC51 作 者:卢厚财 创建 日期:14-02-04 */

#include #define uchar unsigned char #define uint unsigned int uchar Receive_Data; uchar pf; uchar flag,flag1; sbit key2=P2^0;

/************************************************************************* ** 函数名称: void delay(uchar k) ** 功能描述: 软件延时程序 ** 输 入: uchar k ** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无

** 说 明:延时约1MS ** 注 意:无

**************************************************************************/ void delay(uchar k) {

uchar j;

while((k--)!=0) {

for(j=0;j<125;j++) } }

/************************************************************************* ** 函数名称: void init(void) ** 功能描述: 系统配置初始化 ** 输 入: 无

{;}

** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无

** 说 明:串口初始化 ** 注 意:无

**************************************************************************/ void init(void) {

TMOD=0x20; TH1=0xe8; TL1=0xe8; PCON=0x00; TR1=1; SCON=0x90; }

/************************************************************************* ** 函数名称: void receive(void) ** 功能描述: 串口数据接收 ** 输 入: 无 ** 输 出: 无

** 全局变量: 接收到数据存放在Receive_Data; ** 调用模块: 无 ** 说 明:无 ** 注 意:无

**************************************************************************/ void receive(void) { key2=0;

RI=0; while(RI==0) { ; }

Receive_Data=SBUF; }

/************************************************************************* ** 函数名称: void main(void)

** 功能描述: 主函数,不断调用发送模块send( SBUF)将P0口状态数据发送出去。 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无

** 调用模块: receive(); delay();

** 说 明:不断调用发送模块将P0口状态数据发送出去。 ** 注 意:无

**************************************************************************/ void main(void) { init(); while(1) {

receive(); delay(100); P1=Receive_Data; } }

五、项目实施

1、项目实施需要的准备工作

计算机一台,KeilC2.0或WAVE6000软件编程环境,Proteus 8 Professional仿真软件。 2、软件安装请在计算机上安装keilC2.0版本或WAVE6000版本单片机软件开发环境。 3、在keilC2.0或WAVE6000中编写和调试程序,并生成HEX文件。 4、设备使用方法

根据图4.26 IIC通信硬件原理电路图设计好电路,鼠标在单片机上方双击,弹出窗口如图。在窗口内在Program File内导入在keil2.0或WAVE6000软件编程环境编译好的后缀为hex文件,在Clock Frequency内设置好晶振频率为11.0592MHZ其他不变。

4.33仿真环境配置

5、用鼠标点击仿真软件的左下角方向向右的箭头,即开始运行仿真。

图4.34 仿真开始

6、在Proteus 8 Professional仿真软件中运行,观察结果如下图4.35。图中按下P0.7端口的按键,在接收端单片机控制的LED的第一个灯变暗,效果如下图。也可以按下任意一个按键在接收端相应的LED即变暗。

U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332212223242526272810111213141516170001020304050607U3U21234ROREDEDIMAX487A66AMAX487B7718XTAL2U4BROREDEDI12349RST393837363534333221222324252627281011121314151617P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDATC51XTAL119XTAL218RST9000102030405060712345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7ATC51293031PSENALEEAPSENALEEA293031U5P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.71234567820191817161514131211123456710甲单片机图4.35 485通信仿真局部效果图

乙单片机LED-BARGRAPH-RED

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务