收藏 分享(赏)

基于ZigBee的无线数据采集系统.doc

上传人:精品资料 文档编号:10774617 上传时间:2020-01-08 格式:DOC 页数:16 大小:4.06MB
下载 相关 举报
基于ZigBee的无线数据采集系统.doc_第1页
第1页 / 共16页
基于ZigBee的无线数据采集系统.doc_第2页
第2页 / 共16页
基于ZigBee的无线数据采集系统.doc_第3页
第3页 / 共16页
基于ZigBee的无线数据采集系统.doc_第4页
第4页 / 共16页
基于ZigBee的无线数据采集系统.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、无线数据采集控制系统的设计课 程 名 称 专业综合课程设计 课程设计总评成绩 学生姓名、学 号 学 生 专 业 班级 指 导 教 师 姓名 课程设计起止日期 2016.11.7-2016.12.1 1无线数据采集控制系统的设计第 1 章 需求分析1.1 课程设计题目无线电子开关1.2 课程设计任务及要求无线电子开关的设计PC 端用 java 编写程序通过串口给 CC2530 模块 A 发送开关等指令,CC2530 模块 A 通过射频模块将指令以无线方式发送给 CC2530 模块 B,CC2530 模块 B 根据指令开灯或关灯。针对给定的任务,结合专业课程和专业知识完成系统的硬件或软件设计,对硬

2、件设计:要求完成系统和接口设计,并能动手制作和调试,对测量结果进行分析处理。设计须提供实物成果。对软件设计:要求能够熟悉 软件工具,设计其算法或者是系统结构,实现该算法和软件,能够对其计算过程进行推导或者是说明软件系统结构,并能调试成功,对实验结果进行分析处理。通过专业综合的课程设计,使学生能够综合掌握无线传感网技术、java 语言程序设计、数据库等课程的专业知识, 要求学生经过课程设计的教学环节进一步理解无线传感器网络的结构和组成原理,掌握数据采集节点,无线传输,串口通信等模块的基本设计方法,完成系统应用程序的设计。通过专业综合课程设计,提高学生电子信息系统综合设计能力。掌握电子信息系统的基

3、本开发过程及应用方法。要求学生经过课程设计的教学环节进一步理解电子信息系统的设计方法,根据所选择的对象进行应用系统的硬件和软件设计,提高学生专业的综合素质及专业能力。1.3 软硬件运行环境及开发工具软件开发环境为 eclipse+ IAR Embedded Workbench硬件开发环境为 CC25301.4 主要芯片说明CC2530 是 ZigBee 无线数据传输其中的一个核心芯片,它能够以非常低的总材料成本建立强的网络节点。CC2530 芯片有四种不同的闪存版本:分别具 32/64/128/256KB 的闪存。CC2530 芯片工作实具有不同的运行模式,使得它尤其适应超低功耗要求的系统。运

4、行模式之间的转换时间短进一步确保了低能源消耗。在业界内,CC2530 结合了德州仪器的业界领先的黄金单元 ZigBee 协议栈,提供了一个强大和完整的 ZigBee 解决方案。 CC2530 芯片共包含了 40 个引脚,引脚的排布如图 1 所示: 图 1:cc2530 引脚图2CC2530 芯片模块大致可以分为三类:CPU 和内存相关的模块;外设、时钟和电源管理相关的模块以及无线电相关的模块。 (1)CPU 和内存:CC253x 芯片系列中使用的 8051CPU 内核是一个单周期的 8051 兼容内核。(2)调试接口:执行一个专有的两线串行接口,用于内电路调试。 (3)I/O 控制器:负责所有

5、通用 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 在固件挂起

6、的情况下复位自身。第 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

7、: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 公司生产的

8、CC2530 为核心器件。CC2530 是一个真正的片上系统(SoC)解决方案,它能够以非常低的材料成本建立强大的网络节点,它结合了领先的 RF 收发器的优良性能、业界标准的增强型 8051CPU、系统内可编程闪存、8KBRAM、A/D 转换器以及许多其他强大的功能,并且其具有不同的运行模式,使得它尤其适应超低功耗要求的系统。围绕着CC2530 芯片,系统大致可分为三大模块:CPU 和内存相关的模块,外设、时钟和电源管理相关的模块以及无线电相关的模块。3.2 显示模块电路设计设计通过 A 发送的指令来控制 4 个 LED 灯的亮灭,LED 模块电路及灯的引脚图,如图 3、图 4 所示。图 3:

9、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

10、 端口用作输入时为上拉、下拉模式。默认为上拉模式。完整配置: 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 无线部分的使用尽可能的简单清晰,通过最少的代码说明

11、问题。无线芯片的调试具有一定的难度,一般存在发送设备和接收设备。为了通过最简单的代码说明无线芯片的使用,只编写一个设备的代码同时实现发送和接收功能。设备代码的功能也相对简单,CC2530 从串口接收数据并把数据通过 RF 部分原分不动地发送出去,于此同时 CC2530 把从 RF 部分接收的数据原分不动的通过串口发送出去,通过这样的方式实现无线串口。发送的数据编号以及控制指令,来控制灯的亮度和开关。串口数据属于“流”型数据包,RF 部分属于“帧”型数据包。在串口数据处理与分析中,一般采用特定的串口头和长度的方式解析数据,但是本文采用通过串口时间间隔的方式解析数据,这种方法等同于 modbus-

12、RTU 串口数据处理的方法。通过这种检测字节数据时间间隔的方法使得 CC2530 的串口部分可以接收无特殊格式要求的数据,真正实现无线串口功能。第 4 章 系统软件设计4.1 上位机程序设计上位机程序通过两个类来实现,第一个 SerialPort 类用来实现控制程序面板,第二个DSerialPort 类来实现串口通信。图 5 所示为 Java 的两个类:图 5:Java 的两个类SerialPort 类中,通过网格布局管理器来实现面板的布局,设置各个标签以及文本框,复选框,组合框,窗口的大小位置以及标题等。4 个灯的设置大致相同,通过 jcheckbox 来表示灯选中以及未选中时的设置。jla

13、bel1=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/灯一的

14、设置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

15、.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

16、().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)/串口打开则发

17、送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 类中,通过

18、 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.get

19、PortType() = 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.

20、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(“无法找到名字为%

21、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正在使用中!“, commPor

22、t.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 port

23、Name) 方法选择端口“);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 出错:“

24、+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 = s

25、erialPort.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(“

26、开始监 听来自%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;/* 数据接收的监听处理函数*/p

27、ublic 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;in

28、umBytes;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(“端口 监听关闭了!“, comm

29、Port.getName();catch(Exception e)e.printStackTrace();4.2 下位机程序设计发送过程大致可分为侦听 SFD 清除信道,关闭接收中断,填充缓冲区,启动发送并等待发送完成,最后恢复接收中断。在这几个过程中唯一需要说明的便是填充缓冲区过程,在初始化过程中提到 FRMCTRL0 寄存器,该寄存器中 AUTO_CRC 标志位默认为使能状态,CC2530 的物理层负载部分第一个字节为长度域,填充实际负载之前需要先填充长度域,而物理层负载在原长度的基础上增加 2。长度域数值增加 2 的原因是由于自动 CRC 的存在,CRC 部分占两个字节 CC2530 会

30、把这两个字节填充至发送缓冲区。void rf_send( char *pbuf , int len)RFST = 0xE3; / RF 接收使能 ISRXON/ 等待发送状态不活跃 并且 没有接收到 SFDwhile( FSMSTAT1 RFIRQM0 / 禁止接收数据包中断IEN2 / 清除 RF 全局中断RFST = 0xEE; / 清除发送缓冲区 ISFLUSHTXRFIRQF1 = (11); / 清除发送完成标志/ 填充缓冲区 填充过程需要增加 2 字节,CRC 校验自动填充RFD = len + 2;for (int i = 0; i len; i+)RFD = *pbuf+;RF

31、ST = 0xE9; / 发送数据包 ISTXONwhile (!(RFIRQF1 / 等待发送完成RFIRQF1 = (11); / 清除发送完成标志位RFIRQM0 |= (16); / RX 接收中断IEN2 |= (10);和发送部分略有不同,接收部分可以分为接收中断部分和接收数据帧处理部分。无线接收部分可以分为两块内容,一块是无线接收中断处理,一块是无线数据帧处理。在前者中仅需查询标志位即可,RFIRQF0 的第 6 位为完整数据包接收中断标志,若 CC2530 接收到一个完整的无线数据包,该标志位便会置位。由于 CC2530 存在多种 RF 中断类型,例如接收到一个完整的帧,帧通过

32、过滤等,那么在进入中断服务函数之后可以通过查询标志位的方法进入相10应的处理任务,接收过程中便是采用的这种方式。进入数据包处理函数之后,首先读取接收缓冲区的第一个字节,第一个字为数据包长度,在这里需要减去 2。长度域减去 2 的原理和发送过程相似,最后两个字节原位 CRC 校验,但是在 CC2530 处理过程中填充了更有用的信息,例如 RSSI 结果,而 CRC 校验只返回结果而不返回数值,CRC 校验的结果只占用一位。如果 CRC 校验成功,那么就依次读取接收缓冲区字节数据,通过串口发送这些字节数据,并附加一个 RSSI 结果且 RSSI 被中括号包围。如果 CRC 校验失败则通过串口打印

33、CRC Error。在程序刚开始调试的过程中,原先认为 CRC 校验结果是个“花架子” ,但是实际中却发现当 CC2530 处于接收状态时,会不时的收到数据。这些数据杂乱无章,唯一的特征便是 CRC 校验结果错误。通过 CRC 校验结果可以有效的剔除数据,保证系统的可靠性。void rf_receive_isr()int rf_rx_len = 0;int rssi = 0;char crc_ok = 0;rf_rx_len = RFD - 2; / 长度去除两字节附加结果rf_rx_len for (int i = 0; i rf_rx_len; i+)rf_rx_bufi = RFD; /

34、 连续读取接收缓冲区内容rssi = RFD - 73; / 读取 RSSI 结果crc_ok = RFD; / 读取 CRC 校验结果 BIT7RFST = 0xED; / 清除接收缓冲区if( crc_ok / 串口发送/printf(“%d“,rssi); /发送强度数据elseprintf(“rnCRC Errorrn“);串口部分的内容和 RF 部分无关,串口部分的代码包括定时器 T1 和 UART 两部分,UART 中断中往接收缓冲区中填充数据并重新启动定时器,在定时器中断中指示串口数据接收完毕,改变一个软件标志位 is_serial_receive。void uart0_send

35、buf(char *pbuf , int len)for( int i = 0 ; i len ; i+)while(!UTX0IF);UTX0IF = 0;U0DBUF = *pbuf;pbuf+;11#pragma vector=URX0_VECTOR_interrupt void UART0_ISR(void)URX0IF = 0; / 清除接收中断标志serial_rxbufserial_rxpos = U0DBUF; / 填充缓冲区serial_rxpos+;serial_rxlen+;timer1_enable(); / 定时器重新开始计数#pragma vector=T1_VEC

36、TOR_interrupt void Timer1_ISR(void)T1STAT / 清除定时器 T1 通道 0 中断标志is_serial_receive = 1; / 串口数据到达timer1_disbale();模块 B 和模块 C 的程序,只需要在串口透传的程序中添加 if 语句判断接收的指令后缀为 1还是为 2 即可。因为 Java 中设置的判断为”xllighjt1:,xllight2:” ,所以只要判断第 0位 为x和第 7 位为 1 还是为 2 就可以分别点亮不同模块的灯。if(rf_rx_buf0 = x)elseLED1=0;if(rf_rx_buf11 = 1)LED2

37、=1;elseLED2=0;if(rf_rx_buf10 = 1)LED3=1;elseLED3=0;if(rf_rx_buf9 = 1)LED4=1;12elseLED4=0;第 5 章 实验结果及分析将程序分别下到 3 块 CC2530 实验板上,在上位机中点击并发送命令,下位机对应的节点接收到命令后点亮相应的灯。实验结果如图 6,7,8 所示。图 6:点亮黄灯图13图 7:点亮红,蓝灯图图 8:点亮模块 1 图第 6 章 总结与展望上文详细介绍了基于 Zigbee 的无线电子开关的设计过程,设计中将系统分为上位机和下位机两部分。通过 CC2530 芯片搭建无线传感器网络,将命令发送到节点

38、处。控制部分通过eclipse 编写。本设计是以当下较为流行的 Zigbee 无线通信技术为基础的,Zigbee 技术具有近距离,低复杂度,低功耗,低速率,低成本等优点,因而成本和功耗方面较好,可以广泛用来远程控制灯,具有实际用途,应用前景十分广泛。当然,这个设计仍然存在一些不足,需要改进和提高,这些在以后的学习生活中都会进一步的探究和实现。然而,ZigBee 技术的应用前景是十分明朗的,成本和功耗方面的优势使其在市场中十分具有14竞争力。尤其在物联网技术已成为当下热点命题之一的时候,ZigBee 技术的应用价值就更为重要了,可以想见,伴随着物联网技术的成长,ZigBee 技术也将日趋成熟。15课程设计评分表评 分 项 目 评分成绩1选题合理、目的明确(10 分)2设计方案正确,具有可行性、创新性(30 分)3项目工艺水平及测试性能达到技术要求(25 分)4参考文摘不少于 5 篇(10 分)5答辩(25 分)总 分(100 分)答辩记录:指导教师综合评语:指导教师(签名) 日 期: 年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报