MENU

23 RS485通信

July 23, 2020 • 51单片机

--- 当前时间: ---

23 RS485通信

23.1 RS485通信介绍

RS-485是RS-422A的变型:RS-422A用于全双工(串口通信),而RS-485则用于半双工485通信

RS-485是一种多发送器标准,在通信线路上最多可以使用32对差分驱动器/接收器

如果在一个网络中连接的设备超过32个,还可以使用中继器

RS-485的信号传输采用两线间的电压来表示逻辑1和逻辑0

由于发送方需要两根传输线,接收方也需要两根传输线

传输线采用<u>差动信道</u>,所以它的干扰抑制性极好,又因为它的阻抗低,<u>无接地问题</u>,所以传输距离可达1200米,传输速率可达$1Mbps$

RS-485是一点对多点的通信接口,一般采用双绞线的结构

  • 普通的PC机一般不带RS485接口,因此要使用<u>RS-232C/RS-485转换器</u>
  • 对于单片机可以通过芯片MAX485来完成TTL/RS-485的电平转换

在计算机和单片机组成的RS-485通信系统中,下位机由单片机系统组成,上位机为普通的PC机,负责监视下位机的运行状态,并对其状态信息进行集中处理,以图文方式显示下位机的工作状态以及工业现场被控设备的工作状况

系统中各节点(包括上位机)的识别是通过设置不同的站地址来实现的

23.2 RS485模块电路

  • RS485:与电脑<u>RS-232C/RS-485转换器</u>上的A、B相连
  • RXD2 contact pin:连接P3.0管脚
  • TXD2 contact pin:连接P3.1管脚
  • RS485DIR contact pin:控制发送还是接受的使能端(无法同时进行,因为是半双工的)

23.3 编写RS485通信程序

只需要稍微修改一下串口通信的程序即可

main.c

#include <reg52.h>

typedef unsigned char u8;    // 1 byte: 0 ~ 255
typedef unsigned int u16;    // 2 byte: 0 ~ 65535

sbit RS485DIR = P1^0;

void Delay(u16 i)
{
    while(i--);
}

void UsartInit()            // Universal Synchronous/Asynchronous Receiver/Transmitter
{
    TMOD = 0x20;            // 0010 0000
    
    // Method: 2
    // ------Baud rate: 4800------!!
    TH1 = 0xF3;
    TL1 = 0xF3;
    // --------Rate double--------!!
    PCON = 0x80;            // Unable to perform bitwise operations, SMOD = 1
    
    TR1 = 1;                // Open T1
    
    // Method: 1
    // Baud rate: changeable
    SCON = 0x50;            // 0101 0000
    
    ES = 1;                    // Interrupt of serial communication
    EA = 1;
    
    RS485DIR = 0;            // Receive mode
}

void main()
{
    UsartInit();
    while(1);
}

void Usart() interrupt 4
{
    u8 receiveData;            // Save data from PC
    
    receiveData = SBUF;
    RI = 0;                    // Clear
    
    Delay(100);                // 1ms
    RS485DIR = 1;            // Send mode
    
    // Sand it out
    SBUF = receiveData + 1;
    while(!TI);                // Sending......
    TI = 0;                    // Clear after sending
    
    RS485DIR = 0;            // Receive mode
}
Last Modified: August 21, 2020
Archives QR Code
QR Code for this page
Tipping QR Code