基于ZigBee的无线数据采集系统_第1页
基于ZigBee的无线数据采集系统_第2页
基于ZigBee的无线数据采集系统_第3页
基于ZigBee的无线数据采集系统_第4页
基于ZigBee的无线数据采集系统_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

无线数据采集控制系统的设计课 程 名 称 专业综合课程设计 课程设计总评成绩 学生姓名、学 号 学 生 专 业 班级 指 导 教 师 姓名 课程设计起止日期 2016.11.7-2016.12.1 1无线数据采集控制系统的设计第 1 章 需求分析1.1 课程设计题目无线电子开关1.2 课程设计任务及要求无线电子开关的设计PC 端用 java 编写程序通过串口给 CC2530 模块 A 发送开关等指令,CC2530 模块 A 通过射频模块将指令以无线方式发送给 CC2530 模块 B,CC2530 模块 B 根据指令开灯或关灯。针对给定的任务,结合专业课程和专业知识完成系统的硬件或软件设计,对硬件设计:要求完成系统和接口设计,并能动手制作和调试,对测量结果进行分析处理。设计须提供实物成果。对软件设计:要求能够熟悉 软件工具,设计其算法或者是系统结构,实现该算法和软件,能够对其计算过程进行推导或者是说明软件系统结构,并能调试成功,对实验结果进行分析处理。通过专业综合的课程设计,使学生能够综合掌握无线传感网技术、java 语言程序设计、数据库等课程的专业知识, 要求学生经过课程设计的教学环节进一步理解无线传感器网络的结构和组成原理,掌握数据采集节点,无线传输,串口通信等模块的基本设计方法,完成系统应用程序的设计。通过专业综合课程设计,提高学生电子信息系统综合设计能力。掌握电子信息系统的基本开发过程及应用方法。要求学生经过课程设计的教学环节进一步理解电子信息系统的设计方法,根据所选择的对象进行应用系统的硬件和软件设计,提高学生专业的综合素质及专业能力。1.3 软硬件运行环境及开发工具软件开发环境为 eclipse+ IAR Embedded Workbench硬件开发环境为 CC25301.4 主要芯片说明CC2530 是 ZigBee 无线数据传输其中的一个核心芯片,它能够以非常低的总材料成本建立强的网络节点。CC2530 芯片有四种不同的闪存版本:分别具 32/64/128/256KB 的闪存。CC2530 芯片工作实具有不同的运行模式,使得它尤其适应超低功耗要求的系统。运行模式之间的转换时间短进一步确保了低能源消耗。在业界内,CC2530 结合了德州仪器的业界领先的黄金单元 ZigBee 协议栈,提供了一个强大和完整的 ZigBee 解决方案。 CC2530 芯片共包含了 40 个引脚,引脚的排布如图 1 所示: 图 1:cc2530 引脚图2CC2530 芯片模块大致可以分为三类:CPU 和内存相关的模块;外设、时钟和电源管理相关的模块以及无线电相关的模块。 (1)CPU 和内存:CC253x 芯片系列中使用的 8051CPU 内核是一个单周期的 8051 兼容内核。(2)调试接口:执行一个专有的两线串行接口,用于内电路调试。 (3)I/O 控制器:负责所有通用 I/O 引脚。 (4)五通道 DMA 控制器:系统可以使用一个多功能的五通道 DMA 控制器,使用 XDATA 存储空间访问存储器,因此能够访问所有物理存储器。 (5)定时器 1:是一个 16 位定时器,具有定时器 PWM 功能。 。 (6)内置 MAC 定时器:是专门为支持 IEEE 802.15.4,MAC 或软件中其他时槽的协议设计。(7)定时器 3 和定时器 4:是 8 位定时器,具有定时器/计数器/PWM 功能。 (8)睡眠定时器:是一个超低功耗的定时器,计算 32kHz 晶振或 32 kHz RC 振荡器的周期。 (9)看门狗:一个内置的看门狗,允许 CC2530 在固件挂起的情况下复位自身。第 2 章 系统总体设计2.1 系统组成方案由 eclipse 编写上位机程序,TAR 编写下位机程序,通过无线方式发送命令。如图 2串口ACBl i g h t 1 : 1 1 0 1l i g h t 2 : 1 0 1 1图 2 :设计方案2.2 系统工作原理上位机程序以轮询方式通过 PC 串口向 ZigBee 节点 A 发送命令 light:1011,节点 A 通过无线方式向节点 B 转发命令 light:1011,节点 B 接收到命令后点亮蓝灯,黄灯和绿灯( 1 点亮,0 熄灭) 。上位机程序以轮询方式通过 PC 串口向 ZigBee 节点 A 发送命令 light:1011,节点 A 通过无线方式向节点 C 转发命令 light:1011,节点 C 接收到命令后点亮蓝灯,红灯和绿灯(1 点亮,0 熄灭) 。2.3 系统构建PC 端用 java 编写程序通过串口给 CC2530 模块 A 发送开关等指令,CC2530 模块 A 通过射频模块将指令以无线方式发送给 CC2530 模块 B 和模块 C,CC2530 模块 B 和模块 C 根据指令开3灯或关灯。根据指令(light1 或 light2)第 5 位判断后缀为 1 或者为 2,节点 B 和节点 C 分别依据指令开灯或者关灯第 3 章 系统硬件设计3.1 主模块电路设计本系统采用 TI 公司生产的 CC2530 为核心器件。CC2530 是一个真正的片上系统(SoC)解决方案,它能够以非常低的材料成本建立强大的网络节点,它结合了领先的 RF 收发器的优良性能、业界标准的增强型 8051CPU、系统内可编程闪存、8KBRAM、A/D 转换器以及许多其他强大的功能,并且其具有不同的运行模式,使得它尤其适应超低功耗要求的系统。围绕着CC2530 芯片,系统大致可分为三大模块:CPU 和内存相关的模块,外设、时钟和电源管理相关的模块以及无线电相关的模块。3.2 显示模块电路设计设计通过 A 发送的指令来控制 4 个 LED 灯的亮灭,LED 模块电路及灯的引脚图,如图 3、图 4 所示。图 3:LED 模块电路图 4:LED 灯对应引脚若要点亮 LED 灯,CC2530 的通用 IO 口需要配置三个寄存器:P1SEL,P1DIR,P1INP,P2INP功能选择寄存器 PxSEL,其中 x 为端口标号 02,用来设置端口的每个引脚为通用 I/O 或外部设备 I/O。默认为通用 I/O。方向寄存器 PxDIR,其中 x 为端口标号 02,用来设置端口的每个引脚为输入或输出。默认为输入。输入模式寄存器 P1INP,用来设置 P1 端口用作输入时为上拉、下拉模式或三态模式。默认4为上、下拉模式。具体是上拉还是下拉,由 P2INP 来设置。输入模式寄存器 P2INP,用来设置 P0、P1、P2 端口用作输入时为上拉、下拉模式。默认为上拉模式。完整配置: P1SEL/P1_0、P1_1 通用 IO P1DIR|=0x03;/ P1_0、P1_1 输出 P1INP/ P1_0、P1_1 上下拉 P2INP/ P1 上拉简化配置: P1DIR|=0x03;/ P1_0、P1_1 输出3.3 通信模块电路设计CC2530 是符合 802.15.4 标准的无线收发芯片,但是本设计并没有遵守 802.15.4 协议规则,在发送过程中忽略了网络 ID、源地址和目标地址等参数,在接收的过程中禁止了帧过滤。通过发送和接收过程的处理使得 CC2530 无线部分的使用尽可能的简单清晰,通过最少的代码说明问题。无线芯片的调试具有一定的难度,一般存在发送设备和接收设备。为了通过最简单的代码说明无线芯片的使用,只编写一个设备的代码同时实现发送和接收功能。设备代码的功能也相对简单,CC2530 从串口接收数据并把数据通过 RF 部分原分不动地发送出去,于此同时 CC2530 把从 RF 部分接收的数据原分不动的通过串口发送出去,通过这样的方式实现无线串口。发送的数据编号以及控制指令,来控制灯的亮度和开关。串口数据属于“流”型数据包,RF 部分属于“帧”型数据包。在串口数据处理与分析中,一般采用特定的串口头和长度的方式解析数据,但是本文采用通过串口时间间隔的方式解析数据,这种方法等同于 modbus-RTU 串口数据处理的方法。通过这种检测字节数据时间间隔的方法使得 CC2530 的串口部分可以接收无特殊格式要求的数据,真正实现无线串口功能。第 4 章 系统软件设计4.1 上位机程序设计上位机程序通过两个类来实现,第一个 SerialPort 类用来实现控制程序面板,第二个DSerialPort 类来实现串口通信。图 5 所示为 Java 的两个类:图 5:Java 的两个类SerialPort 类中,通过网格布局管理器来实现面板的布局,设置各个标签以及文本框,复选框,组合框,窗口的大小位置以及标题等。4 个灯的设置大致相同,通过 jcheckbox 来表示灯选中以及未选中时的设置。jlabel1=new JLabel(“全 关 1:“);jcheckbox1=new JCheckBox(“绿“);jcheckbox2=new JCheckBox(“红“);jcheckbox3=new JCheckBox(“黄“);jcheckbox4=new JCheckBox(“蓝“);jlabel2=new JLabel(“全 关 2:“);jcheckbox5=new JCheckBox(“绿“);jcheckbox6=new JCheckBox(“红“);jcheckbox7=new JCheckBox(“黄“);jcheckbox8=new JCheckBox(“蓝“);5/灯一的设置jcheckpanel1=new JPanel();gridbagconstraints.anchor=GridBagConstraints.EAST;gridbagconstraints.gridwidth=1;gridbaglayout.setConstraints(jlabel1,gridbagconstraints);add(jlabel1);gridbagconstraints.anchor=GridBagConstraints.WEST;gridbagconstraints.gridwidth=GridBagConstraints.REMAINDER;gridbaglayout.setConstraints(jcheckpanel1, gridbagconstraints);add(jcheckpanel1);jcheckpanel1.add(jcheckbox4);jcheckpanel1.add(jcheckbox3);jcheckpanel1.add(jcheckbox2);jcheckpanel1.add(jcheckbox1);/灯一开关的设置jcheckbox1.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)if(getLightState1().equals(“0000“)jlabel1.setText(“全 关 1:“);else if(getLightState1().equals(“1111“)jlabel1.setText(“全 开 1:“);elsejlabel1.setText(“开 灯 1:“););通过 switch 语句,串口打开后轮流发送 Data 的参数以及设置参数异常时的命令:void startRun()Timer timer = new Timer();TimerTask task =new TimerTask()int i=0;public void run()if(com_open)/串口打开则发送try switch(i)case 0:sp.write(lightcommand1+getLightState1();break;case 1:sp.write(lightcommand2+getLightState2();break;if(i=2)i=0;elsei+;catch(Exception e)System.out.println(“发送异常“);timer.schedule(task,1000,200);/在 200 毫秒后执行此任务,每次间隔 2 秒执行一次, 如果传递一个 Data 参数 ,就可以在某个固定的时间执行这个任务.6串口通信 DSerialport 类中,通过 listport 方法,列出了所有可用的串口,并设置返回值类型为 void:public void listPort(JComboBox jcombox1)CommPortIdentifier cpid;Enumeration en = CommPortIdentifier.getPortIdentifiers();System.out.println(“now to list all Port of this PC:“ +en);while(en.hasMoreElements()cpid = (CommPortIdentifier)en.nextElement();if(cpid.getPortType() = CommPortIdentifier.PORT_SERIAL)jcombox1.addItem(cpid.getName();System.out.println(cpid.getName() + “, “ + cpid.getCurrentOwner();通过 selectport 方法,选择一个端口,设置返回值类型 void:public void selectPort(String portName,int rate)mPort = null;CommPortIdentifier cpid;Enumeration en = CommPortIdentifier.getPortIdentifiers();while(en.hasMoreElements()cpid = (CommPortIdentifier)en.nextElement();if(cpid.getPortType() = CommPortIdentifier.PORT_SERIALbreak;openPort(rate);通过 openPort 方法,打开 SerialPort,设置返回值类型 void:private void openPort(int rate)if(commPort = null)System.out.println(String.format(“无法找到名字为%1$s的串口!“, commPort.getName();elseSystem.out.println(“端口选择成功,当前端口: “+commPort.getName()+“,现在实例化 SerialPort:“);tryserialPort = (SerialPort)commPort.open(appName, timeout);System.out.println(“实例 SerialPort 成功!“);catch(PortInUseException e)throw new RuntimeException(String.format(“端口%1$s正在使用中!“, commPort.getName();try serialPort.setSerialPortParams(rate,8,1,0);/设置波特率等参数7catch (UnsupportedCommOperationException e) / TODO Auto-generated catch blocke.printStackTrace();通过 checkport 方法检查端口是否正确连接:private void checkPort()if(commPort = null)throw new RuntimeException(“没有选择端口,请使用 “ +“selectPort(String portName) 方法选择端口“);if(serialPort = null)throw new RuntimeException(“SerialPort 对象无效!“);通过 write 方法向端口发送数据,在调用此方法前需要先选择端口并确定 serialport 正常打开。public void write(String message) checkPort();tryoutputStream = serialPort.getOutputStream();catch(IOException e)throw new RuntimeException(“获取端口的 OutputStream 出错:“+e.getMessage();tryoutputStream.write(message.getBytes();System.out.println(“信息发送成功!“);catch(IOException e)throw new RuntimeException(“向端口发送信息时出错:“+e.getMessage();finallytryoutputStream.close();catch(Exception e)通过 startread 开始监听从端口中接受的数据:public void startRead(int time)checkPort();tryinputStream = serialPort.getInputStream();catch(IOException e)throw new RuntimeException(“获取端口的 InputStream 出错:“+e.getMessage();tryserialPort.addEventListener(this);catch(TooManyListenersException e)throw new RuntimeException(e.getMessage();8serialPort.notifyOnDataAvailable(true);System.out.println(String.format(“开始监 听来自%1$s 的数据-“, commPort.getName();if(time 0)this.threadTime = time*1000;Thread t = new Thread(this);t.start();System.out.println(String.format(“监 听程序将在%1$d 秒后关闭。 。 。 。“, threadTime);使用 close 方法关闭 serialport:public void close()serialPort.close();serialPort = null;commPort = null;/* 数据接收的监听处理函数*/public void serialEvent(SerialPortEvent arg0) byte readBuffer = new byte20;int numBytes=0;String readStr=“;s2 = “; try while(inputStream.available()0) try Thread.sleep(100);/休眠 100ms catch (InterruptedException e) e.printStackTrace();numBytes = inputStream.read(readBuffer); /从串口上读取数据上的流for(int i=0;inumBytes;i+)readStr=readStr +(char)readBufferi;s2=readStr;System.out.println(“接收的数据:“+readStr); catch (IOException e) e.printStackTrace(); /* 读取接收的数据*/public String readData()return s2;9public void run() tryThread.sleep(threadTime);serialPort.close();System.out.println(String.format(“端口 监听关闭了!“, co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论