总线技术实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《总线技术与应用》
实验报告
学院:
专业:
班级:
姓名:
学号:
课程名称:总线技术与应用
实验题目:RS485总线扩展实验指导教师:
班级:学号:学生姓名:
一、实验目的和任务
(1)学习RS485总线系统的连接方法
(2)掌握RS485总线系统应用层协议的设计方法
(3)任务:
①进行各节点ADC的数据周期读取;
②进行LED灯闪烁同步控制:在主机上通过按键(按向右键)切换LED等显示,
底层同步进行LED灯显示切换;
③进行数字温度模块的数据周期读取,通过主机上通过按键(按向上键)切换温
度在数码管显示;
④主机通过向上键进行模式切换(共三种功能,顺序分别为LED显示功能、ADC
功能、温度功能);
⑤主机通过左、下、右按键选择从节点选择(A(2)、B(3)、C(4)),返回ADC
值或温度值;
⑥主机数码管第一个显示节点号(A(2)、B(3)、C(4)),后面显示电压值或温
度值;
⑦主机通过左、下、右按键选择从节点选择(A(2)、B(3)、C(4)),使LED闪
烁,数码显示第一个数字显示节点号(A(2)、B(3)、C(4)),其他三个数字显
示LED。
二、实验内容及原理
1、实验前准备
(1)安装好Keil工程软件;
(2)安装好USB/RS485转换器驱动;
(3)安装好串口调试助手;
2、RS485概述
RS485采用差分信号幅逻辑,+2V~+6V表示“0”,-6V~-2V表示“1”。RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓扑结构在同一总线上最多可以挂接32个结点。在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。
起始位:为信号0,占1位;
数据位:可以使5、6、7、8位,传输室低位在先,高位在后;
校验位:1位奇偶校验码(可不选);
停止位:用信号1表示字节结束,可以是1位、1.5位或2位;
空闲位:为信号1;
由于RS485总线只定义了物理层与数据链路层的一部分,因此一般需要自定义应用层协议。应用层协议一般包括同步字节、地址信息、功能信息、数据信息、校验信息。
3、RS485总线协议
三、实验步骤及源代码
1、实验步骤
(1)连线:将5V/2A电源线与各节点基板连接好,并将J-link仿真器及USB接口线与试验箱CPU板与电脑连接好;
(2)按《实验平台使用说明》中“第3章标准程序验证”对实验基板进行验证;
(3)双击打开实验程序文件夹“..\4_实验程序\总线类扩展实验\RS485从节点(ADC+LED)v5\”中的Template.uvprojx,点击Build按钮,编译程序;编译成功后,从机基板
上电,点击Load按钮下载程序;(在下载前,需要在程序中对从机地址进行确认)(4)双击打开实验程序文件夹“..\4_实验程序\总线类扩展实验\RS485主节点通信程序_v5\\”中的Template.uvprojx,点击Build按钮,编译程序;编译成功后,主机基
板上电,点击Load按钮下载程序;(在下载前,需要在程序中对主机地址进行确
认)
(5)下载成功后,进入测试;
①主机通过向上键进行模式切换(共三种功能,顺序分别为LED显示功能、ADC
功能、温度功能);可以观察到4位LED数码管提示字符变化。
②进入温度功能,主机通过左、下、右按键选择从节点选择(A(2)、B(3)、C(4)),
返回ADC值或温度值。
③进入ADC测试功能,主机数码管第一个数字显示节点号(A(2)、B(3)、C(4)),
后面显示电压值或温度值。
④进入LED显示功能,主机通过左、下、右按键选择从节点选择(A(2)、B(3)、
C(4)),使LED灯闪烁,数码显示管第一个数字显示节点号(A(2)、B(3)、D
(4)),其他三个数字显示LED;
⑤在上述通讯过程中,使用USB/RS485转换器对实验过程进行记录,对实验数据
进行分析;
(6)扩展实验
①将通讯速率不断提高,看什么速率情况下通讯会失败?
提示:通过修改语句RS485_Init(9600);中的参数实现。
②试讨论协议中哪些字段不是必须的,对协议如何进行优化?
③在通讯速率为9600bps情况下,如果ADC读取周期为10ms能否正常通讯?
④能否设置两个主站,同时获取数据?
2、源代码
(1)RS485 从节点(ADC+LED)
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "rs485.h"
#include "adc.h"
#include "ds18b20.h"
#include "TM1637.h"
#include "application.h"
/******************************************************************************* * 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
*******************************************************************************/ int main()
{
u8 ii=0;
u8 curMode;
u8 oldMode;
u8 loopCount;
float fValue;
for(ii=0;ii<3;ii++) //对初始化函数进行三遍初始化
{
SysTick_Init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组分2组
LED_Init();
ADCx_Init();
//USART1_Init(9600);
RS485_Init(9600);
TM1637_Init();
while(DS18B20_Init())
{
TM1637_DispOneChar(TM1637_POS_1000,'E');
TM1637_DispOneChar(TM1637_POS_1000,'R');
TM1637_DispOneChar(TM1637_POS_1000,'0');
TM1637_DispOneChar(TM1637_POS_1000,'1');
delay_ms(500);
}