版权声明:本文为博主原创文章,转载请附上原文出处链接。

文章目录

  • 前言
  • 一、硬件设计
    • 1.开发板串口硬件电路
    • 2.RS485电气性能
    • 3.RS485通信协议
    • 4.RS485电路设计
  • 二、软件设计
    • 1.RS485总线数据收发实验(串口4)
      • 1.1.工程需要用到的c文件
      • 1.2.头文件引用和路径设置
      • 1.3.编写代码
      • 1.4.硬件连接
  • 总结

前言

今天介绍下STC8A8K64S4A12系列MCU串行口原理,掌握RS485总线通信的硬件原理,了解RS485总线通信的软件协议。


一、硬件设计

1.开发板串口硬件电路

STC8A8K64S4A12开发板上设计了RS485电路(RS485接口芯片选择的是MAX485),具体电路及实物接口如下。

图1:开发板RS485电路

RS485电路占用的单片机的引脚如下表:

表1:串口电路引脚分配


☆注:独立GPIO表示开发板没有其他的电路使用这个GPIO。

2.RS485电气性能

RS485接口是一个物理接口,将多个RS485接口通过一定方式连接起来,可形成RS485总线。将多个RS485接口连接起来的方式有多种,一般不支持星型、树型或环型网络。下图是总线型连接的RS485系统通信框图,也是被最广泛应用的一种连接方式。

图2: RS485系统通信框图

☆注:RS485系统通信时有几点注意事项:
1)连接电脑(主机)和RS485总线的可以不选择USB转RS485模块,如果电脑有RS232接口,也可选择RS232转RS485模块。
2)RS485总线如果需要加终端电阻,最好的效果是总线的首尾两端各加一个。

RS485总线是一种常规的通信总线,他不能做总线的自动仲裁,也就是不能同时发送数据以避免总线竞争,所以整个系统的通信效率必然较低,数据冗余量较大,对于速度要求高的应用场所不适应用RS485总线。同时由于RS485总线上通常只有一台主机,所以这种总线方式是典型的集中——分散型控制系统。

概括一下,RS485接口或者说RS485总线具有以下电气性能:

  1. 传输方式:主从式,半双工。
  2. 传输速率:可配置(最高传输速率为10Mbps)。
  3. 最大挂接节点数:一般最大支持32个节点(如果使用特制的RS485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点)。
  4. 最大传输距离(不加中继):受传输速率、通信电缆是否双绞、通信电缆芯线截面积等因素影响,一般在100Kbps的传输速率下,才可以达到最大的通信距离约为1219米。

3.RS485通信协议

RS485接口本身只是硬件接口,硬件通信接口建立后,在进行数据传输的设备之间需要约定一个数据协议,以使接收端能够解析收到的数据,这便是“协议”的概念。

通信协议按照有无统一的标准来划分,可分成两种:

  1. 标准通信协议。此有统一标准的协议格式,如“ModBus”协议,标准的协议内容全面,包含的内容很多,但不易理解。
  2. 自定义通信协议或者说私有通信协议。用户可根据自已的需求,灵活定义一种协议,简单实用,这便是“自定义协议”。

☆注:“ModBus”协议也有ASCII模式和RTU模式两种,这两种又有很大差别,用户需根据自已实际需求来选择最合适自己的协议。

4.RS485电路设计

RS485电路总体上可以分为隔离型与非隔离型。隔离型比非隔离型在抗干扰、系统稳定性等方面都有更出色的表现,但有一些场合也可以用非隔离型。

非隔离型的电路非常简单,只需一个RS485芯片直接与MCU的串行通信口和一个GPIO控制口连接就可以。(开发板使用的就是最简单的非隔离型电路)

在某些工业控制领域,由于现场情况十分复杂,各个节点之间存在很高的共模电压。虽然RS485接口采用的是差分传输方式,具有一定的抗共模干扰的能力,但当共模电压超过RS485接收器的极限接收电压,即大于+12V或小于-7V时,接收器就再也无法正常工作了,严重时甚至会烧毁芯片和仪器设备。

解决此类问题的方法是通过DC-DC将系统电源和RS485收发器的电源隔离;通过隔离器件将信号隔离,彻底消除共模电压的影响。

实现隔离型RS485电路设计的方案可分为:

  1. 传统方式:用高速光耦、带隔离的DC-DC、RS485芯片构筑电路。
  2. 使用二次集成芯片,如ADM2483、ADM257E等。

☆注:隔离型RS485具体电路不在此介绍,还是那句话,根据自己的需求和成本来定方案。

二、软件设计

RS485通信本质还是异步串行通信,这和UART通信一样,不同之处是,RS485接收和发送需要专用使能引脚控制,软件设计时需要注意。(软件控制MAX485芯片RE引脚切换为接收或发送模式时,注意软件适当延时,以满足硬件切换的时间需求。)

1.RS485总线数据收发实验(串口4)

1.1.工程需要用到的c文件

本例需要用到的c文件如下表所示,工程需要添加下表中的c文件。

表2:实验需要用到的c文件

1.2.头文件引用和路径设置

■ 需要引用的头文件

#include "delay.h"
#include "uart.h"

■ 需要包含的头文件路径

本例需要包含的头文件路径如下表:

表3:头文件包含路径

MDK中点击魔术棒,打开工程配置窗口,按照下图所示添加头文件包含路径。

图3:添加头文件包含路径

1.3.编写代码

首先,在uart.c文件中编写串口4的初始化函数Uart4_Init,代码如下。

程序清单:串口4初始化函数

/*************************************************************************** * 描  述 : 串口4初始化函数 * 入  参 : 无 * 返回值 : 无
备注:波特率9600bps   晶振11.0592MHz **************************************************************************/
void Uart4_Init(void)
{     P_SW2|=S4_S;        //选择P5.2、P5.3为串口4使用   S4CON |= 0x10;      //启动串行接收器     S4CON &= 0x30;      //8位数据,可变波特率,串口4选择定时器2为波特率发生器  AUXR |= 0x04;         //定时器2时钟为Fosc,即1T  T2L = 0xE0;         //设定定时初值  T2H = 0xFE;         //设定定时初值  AUXR |= 0x10;         //启动定时器2  IE2 |= 0x10;      // 串口4中断打开
}

然后,编写串口4发送数据函数,把要发送的字节存放于数据缓存寄存器中,直到数据发送完成,代码如下。

程序清单:数据发送函数函数

/*************************************************************************** * 描  述 : 串口4发送数据函数 * 入  参 : uint8 数据 * 返回值 : 无 **************************************************************************/
void SendDataByUart4(uint8 dat)
{  S4BUF = dat;                 //写数据到UART数据寄存器  while(!(S4CON&S4TI));        //在停止位没有发送时,S4TI为0即一直等待  S4CON&=~S4TI;                //清除S4CON寄存器对应S4TI位(该位必须软件清零)
}

之后,编写串口4的中断服务函数,将接收的数据存放到用户自定义变量uart4temp中,代码如下。

程序清单:中断服务函数

/*************************************************************************** * 描  述 : 串口4中断服务函数 * 入  参 : 无 * 返回值 : 无 **************************************************************************/
void Uart4() interrupt 18 using 1
{  IE2 &= 0xEF;                           //串口4中断关闭  Flag=TRUE;                       //接收到数据,接收标识符有效  if (S4CON & S4RI)                //串行接收到停止位的中间时刻时,该位置1  {  S4CON &= ~S4RI;              //清除S4CON寄存器对应S4RI位(该位必须软件清零)  uart4temp = S4BUF;           //把串口4缓存SBUF寄存器数据存放到数组temp1中  }  if (S4CON & S4TI)               //在停止位开始发送时,该位置1  {  S4CON &= ~S4TI;                    //清除S4CON寄存器对应S4TI位(该位必须软件清零)  }  IE2 |= 0x10;                    //串口4中断打开
}

最后,用户定义一个自定义函数UART4_Tx485_Puts,该函数将接收的数据原样返回去并加上回车符,注意RS485发送完后要将RE引脚控制为接收模式,切换引脚发送还是接收时有软件延时。主函数main在主循环中调用该函数。具体代码如下。

代码清单:用户函数UART4_Tx485_Puts

/************************************************************************************** * 描  述 : RS485接收到数据后发送出去 * 入  参 : 无 * 返回值 : 无 **************************************************************************************/
void USART4_Tx485_Puts(void)
{  if(Flag)      //有新数据通过串口被接收到  {  rs485_dr=1;                            //控制485发送   delay_ms(1);                           //延时1ms,不可省去  IE2 &= 0xEF;                                 //串口4中断关闭  SendDataByUart4(uart4temp);            //发送字符   SendDataByUart4(0x0D);                 //发送换行符  SendDataByUart4(0x0A);                 //发送换行符                        IE2 |= 0x10;                           //串口4中断打开  delay_ms(1);                           //延时1ms,不可省去       rs485_dr=0;                            //控制485接收          Flag=FALSE;                            //清除接收标识符  }
}

代码清单:主函数

int main()
{  P5M1 &= 0xFB;   P5M0 &= 0xFB;                     //设置P5.2为准双向口  P5M1 &= 0xF7;   P5M0 |= 0x08;                     //设置P5.3为推挽输出  rs485_dr=0;           //控制485接收  Uart4_Init();         //串口4初始化  EA = 1;               //总中断打开  while(1)  {  USART4_Tx485_Puts();   //RS485接收到1个字符后返回该字符   }
}

1.4.硬件连接

本实验需要用到USB转RS485转换器,以实现开发板通过RS485接口与PC通信,实验连接图如下。

图4:RS485通信实验连接图

总结

以上就是今天要讲的内容,希望对你有帮助!

【STC8A8K64S4A12开发板】—RS485总线通信相关推荐

  1. STC8A8K64S4A12开发板介绍

    版权声明:本文为博主原创文章,转载请附上原文出处链接. 文章目录 前言 一.STC8A8K64S4A12系列单片机介绍 二.STC8A8K64S4A12开发板概述 三.STC8A8K64S4A12开发 ...

  2. 基于STM32开发板CAN总线通信协议浅析

    基于STM32开发板CAN总线通信协议浅析 一.前言 控制器局域网(Controller Area Network,CAN),是由德国BOSCH(博世)公司开发,是目前国际上应用最为广泛的现场总线之一 ...

  3. 【STC8A8K64S4A12开发板】—片外存储器FLASH讲解

    版权声明:本文为博主原创文章,转载请附上原文出处链接. 文章目录 前言 一.硬件设计 1.FRAM铁电存储器介绍 2.W25Q128JV存储芯片介绍 2.1.芯片引脚定义 2.2.芯片介绍及使用注意事 ...

  4. DSP:6678开发板NDK网口通信完整实现(附源码)

    如果出现图片打不开,或是显示异常,请点击下方链接阅读原文!!! DSP:6678开发板NDK网口通信完整实现(附源码) - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/ ...

  5. 安卓开发板之串口通信,通过modbus Rtu协议控制下位机

    安卓开发板之串口通信,通过modbus Rtu协议控制下位机 1.环境准备 2.编写串口操作核心类 3.编写测试类 前言:因为公司最近有个人脸识别门禁的项目,这个项目主要业务是实现远程人脸注册,管理员 ...

  6. 【STC8A8K64S4A12开发板】—4x4矩阵按键检测

    版权声明:本文为博主原创文章,转载请附上原文出处链接. 文章目录 前言 一.硬件电路设计 1.矩阵按键检测介绍 2.矩阵按键检测原理介绍 二.软件设计 1.矩阵按键扫描实验 – 指示灯闪烁 1.1.工 ...

  7. Android开发板串口(SerialPort)通信

    Android开发板串口(SerialPort)通信 Roy88关注 22017.09.07 18:01:22字数 1,618阅读 28,511 前言: 最近在总是看见有人在群里面问一些串口通信相关的 ...

  8. 树莓派Pico W无线开发板MQTT协议通信MicroPython编程实践

    本博文介绍采用Thonny+MicroPython和umqtt.simple库MQTTClient类的对象方法编制树莓派Pico W无线开发板MQTT协议通信程序,将Pico W无线开发板.电脑或An ...

  9. 【STC8A8K64S4A12开发板】—小白做GPIO按键实验

    版权声明:本文为博主原创文章,转载请附上原文出处链接. 文章目录 前言 一.硬件电路设计 1.开发板用户按键硬件电路 2.按键检测接法 3.按键检测电路考虑因素 二.软件设计 1.寄存器解析 1.1. ...

最新文章

  1. Wijmo 更优美的jQuery UI部件集:通过jsFiddle测试Wijmo Gauges
  2. 前端一HTML:十八:元素的显示方式
  3. dom4j和jaxb_JAXB,SAX,DOM性能
  4. 前端学习(2976):路由钩子函数
  5. 程序员面试金典 - 面试题 17.26. 稀疏相似度(哈希map)
  6. armbian docker Chrome_一起学docker06-docker网络
  7. linux查看tmp,linux下find(文件查找)命令的用法总结-tmp文件
  8. java改变实参_java中引用传递问题,在函数中修改引用的指向,会不会影响实参?...
  9. Jmeter(四十七)_性能测试统计超时率
  10. 跨时钟域问题(三)异步FIFO的Verilog实现(格雷码)
  11. 2_simulink搭建RCL_电阻电感电容模块
  12. 何谓计算机思维(转载)
  13. android mapping文件作用,Android打包代码混淆后的Mapping文件路径
  14. Apache-Ant下载以及安装步骤
  15. Java面试笔试题大汇总(最全+详细答案) 2019
  16. 没有android手机确切内核头文件,绕过模块的版本检查,构建一个内核模块
  17. 全自动苹果CMS火车头采集器,苹果CMS火车头发布插件
  18. 小米电视如何安装第三方软件观看有线电视?看我如何操作
  19. android 开发过程中涉及到的清除缓存操作
  20. Obsidian学习从0到1 —— Dataview

热门文章

  1. 【学习总结】MFC(CImagelist)(重绘)(双缓冲)
  2. 关于Vue使用ueditor富文本编辑器上传图片
  3. Arduino RP2040 读取ADC采样数据
  4. win10显示隐藏文件_如何在Mac上显示隐藏文件——macw
  5. 【Qt5开发】Qt Quick/QML快速入门视频教程
  6. 电压放大器在超声波电机研究中的应用
  7. mysql数据处理脱敏字段
  8. Sublime Text 4 如何安装插件
  9. 机器学习-62-Structured Learning-03-Structured Support Vector Machine(结构化学习-结构化支持向量机)
  10. 双反馈直流matlab仿真,双闭环直流调速系统设计及matlab仿真验证(