基于ZigBee和LabVIEW的无线温度采集系统.doc_第1页
基于ZigBee和LabVIEW的无线温度采集系统.doc_第2页
基于ZigBee和LabVIEW的无线温度采集系统.doc_第3页
基于ZigBee和LabVIEW的无线温度采集系统.doc_第4页
基于ZigBee和LabVIEW的无线温度采集系统.doc_第5页
免费预览已结束,剩余29页可下载查看

下载本文档

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

文档简介

山东科技大学电子技术综合实践报告基于ZigBee和LabVIEW的无线温度采集系统 专 业: 电子信息科学与技术 班级学号: 10级1班1001050934 学生姓名: 周文凯 指导教师: 设计时间: 2013- 6 基于ZigBee和LabVIEW的无线温度采集系统一、 设计任务与要求1、完成双机通信;2、从机采集信息发送主机接收并且显示;3、(发挥)上传PC显示控制;4、(发挥)PC建立服务器网络发布;5、(发挥)客户端通过网络访问、控制。二、方案设计与论证 2.总体方案设计温度检测系统有许多共同的特点环境复杂、测量点多、布线分散、现场离监控地点很远等等。如果使用一般温度传感器采集温度数据就必须设计信号A/D 转换电路、调理电路以及对应的接口电路,才能将传感器输出的模拟信号转换成数字信号。再将数字信号送到单片机去处理。这样,由于外围电路过多会使整个检测系统稳定性不高,系统收集最终数据偏差较大,又由于检测环境的复杂、测量点又多、信号传输距离较远及各种其他干扰的影响,随着时间的推移,检测系统的稳定性和可靠性逐日下降 。所以温度采集系统的设计的关键在于下面三部分:主控单元的设计和温度传感器的选择以及无线模块的选择。2.1系统方案比较与选择 为了更好的实现系统的可靠性与高性价比,我针对以上这些模块分别提出几种方案以供选择。 2.1.1控制器模块比较与论证 单片机是本系统的控制核心,其性能的优劣将从根本上影响整个系统的性能。针对本系统特提出以下二种方案以供选择 。方案一采用STC89C52八位单片机。STC89C52单片机的软件编程自由度比较大,可通过编程实现各种算法以及逻辑控制。并且体积较小、引脚不多、方便安装使用。可以单独对数字温度传感器DS18B20进行控制,另外STC89C52在工农业控制上也有着比较广泛的应用,编程技术和外围电路的配合使用都相当成熟。但是使用51或者52单片机该系统的外围电路较多,实际操作比较麻烦,一次只能处理八位数据,计算比较繁琐。方案二 采用TI公司cc2430单片机。CC2430是一颗真正的系统芯片(SoC)CMOS解决方案。这种解决方案能够提高性能并满足以ZigBee为基础的2.4GHz ISM波段应用,及对低成本,低功耗的要求。它结合一个高性能2.4GHz DSSS(直接序列扩频)射频收发器核心和一颗工业级小巧高效的8051控制器。 CC2430的设计结合了8Kbyte的RAM及强大的外围模块,并且有3种不同的版本,他们是根据不同的闪存空间32,64和128kByte来优化复杂度与成本的组合。CC2430包含一个DMA控制器。8k字节静态RAM,其中的4k字节是超低功耗SRAM。32k,64k或128k字节的片内Flash块提供在电路可编程非易失性存储器。CC2430集成了4个振荡器用于系统时钟和定时操作:一个32MHz晶体振荡器,一个16MHz RC-振荡器,一个可选的32.768kHz晶体振荡器和一个可选的32.768kHz RC 振荡器。综合对比之后选择方案二。2.1.2温度传感器模块比较与论证 温度传感器用来进行温度采集,我们把采集到的数据送到单片机上,单片机处理后把数据通过一个无线模块发送到另一个无线模块。所以在这个系统中温度传感器的作用是至关重要的。我们需要做到数据采集的准确,并且能够保持系统的稳定。有以下几个方案可以供选择。方案一采用热敏电阻,可满足40摄氏度至90摄氏度测量范围。但热敏电阻精度、重复性、可靠性较差。对于检测1摄氏度的信号是不适用的。 方案二采用单片模拟量的温度传感器,比如AD590,LM35等。但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给单片机,这样就使得测温装置的结构较复杂。另外,这种测温装置的一根线上只能挂一个传感器,不能进行多点测量。即使能实现,也要用到复杂的算法,一定程度上也增加了软件实现的难度。 方案三采用DS18B20来测量待测电的温度,数字温度传感器DS18B20输出的信号全数字化。方便单片机处理及控制,省去传统的测温系统的很多外围电路。且该芯片的物理化学性都很稳定,它能作为工业测温元件。此元件线性度好,在0到100时,最大线形偏差小于1。DS18B20的最大特点是单总线的数据传输,由数字温度计DS18B20和微控制器构成的温度采集系统,它可以直接输出温度的数字信号。因此该温度采集系统的结构就比较简单,体积也较小。综合对比之后选择方案三。2.1.3 无线模块的比较与论证无线传输模块主要是用于主机和从机之间的数据传输,从机给主机发送温度数据。 方案一采用红外收发芯片NB9148、NB9149。NB9148是通用红外遥控发射器集成芯片,该器件与NB9149配合使用可完成10个功能控制。NB9148采用CMOS工艺制造,功耗极低,工作电压可在2.5-5.5V之间变化。NB9148的集成度高工作时所需外围元件少,其振荡电路只需外接LC或陶瓷震荡器即可起振,并支持多键组合。方案二采用nRF2401无线模块。无线芯片nRF2401是单片射频收发芯片工作于2.4GHz、ISM频段,芯片内嵌晶体振荡器、地址解码器、时钟处理器、调制器、低噪声放大器、GFSK滤波器、功率放大器和频率合成器等功能模块,通信频道和输出功率可通过程序进行调配。芯片能耗相当低,以-5dBm的功率发射的时侯,工作的电流只有10.5mA,接收的时侯工作电流只有18mA。该无线模块有多种低功率工作模式,设计节能而且使用更为方便。方案三 采用ZigBee无线自组织网模块。Zigbee是基于IEEE802.15.4标准的低功耗个域网协议。根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。其特点是近距离、低复杂度、自组织、低功耗、低数据速率、低成本。主要适合用于自动控制和远程控制领域,可以嵌入各种设备。简而言之,ZigBee就是一种便宜的,低功耗的近距离无线组网通讯技术。ZigBee模块是已经包含了所有外围电路和完整协议栈的能够立即投入使用的产品,已经经过了厂家的优化设计,和老化测试,有一定的质量保证。优秀可靠的zigBee应用“模块”具有在硬件上设计紧凑,体积小,贴片式焊盘设计,可以内置Chip或外置SMA天线,通讯距离从100米到1200米不等,还包含了ADC,DAC,比较器,多个IO,I2C等接口和用户的产品相对接。软件上包含了完整的ZigBee协议栈,并有自己的PC上的配置工具,采用串口和用户产品进行通讯,并可以对模块进行发射功率,信道等网络拓扑参数的配置,使用起来简单快捷。Zigbee自身的技术优势:功耗:在低耗电待机模式下,2 节5 号干电池可支持1个节点工作624个月,甚至更长。这是Zigbee的突出优势。相比较,蓝牙能工作数周、WiFi可工作数小时。.低成本:通过大幅简化协议(不到蓝牙的1/10) ,降低了对通信控制器的要求,按预测分析,以8051的8位微控制器测算,全功能的主节点需要32KB代码,子功能节点少至4KB代码,而且Zigbee免协议专利费。每块芯片的价格大约为2 美元。.低速率:Zigbee工作在20250 kbps的较低速率,分别提供250 kbps(2.4GHz)、40kbps (915 MHz)和20kbps(868 MHz) 的原始数据吞吐率,满足低速率传输数据的应用需求。.近距离:传输范围一般介于10100 m 之间,在增加RF 发射功率后,亦可增加到13 km。这指的是相邻节点间的距离。如果通过路由和节点间通信的接力,传输距离将可以更远。.短时延: Zigbee 的响应速度较快,一般从睡眠转入工作状态只需15 ms ,节点连接进入网络只需30 ms ,进一步节省了电能。相比较,蓝牙需要310 s、WiFi 需要3 s。高容量:Zigbee 可采用星状、片状和网状网络结构,由一个主节点管理若干子节点,最多一个主节点可管理254 个子节点;同时主节点还可由上一层网络节点管理,最多可组成65000 个节点的大网。.高安全:Zigbee 提供了三级安全模式,包括无安全设定、使用接入控制清单(ACL) 防止非法获取数据以及采用高级加密标准(AES 128) 的对称密码,以灵活确定其安全属性。.免执照频段:采用直接序列扩频在工业科学医疗( ISM) 频段,2. 4 GHz (全球) 、915 MHz(美国) 和868 MHz(欧洲)。Zigbee性能分析:. 数据速率比较低:在2.4GHZ的频段只有250KB/S,而且只是链路上的速率,除掉帧头开销,信道竞争应答和重传,真正能被应用所利用的速率可能不足100KB/S,并且余下的速率可能要被邻近多个节点和同一个节点的多个应用所瓜分.因此不适合做视频之类事情。.可靠性:在可靠性方面,zigbee有很多方面进行保证.物理层采用了扩频技术,能够在一定程度上抵抗干扰MAC曾,应用层(APS部分)有应答重传功能。 MAC层的CSMA机制使节点发送前先监听信道,可以起到避开干扰的作用。当zigbee网络受到外界干扰,无法正常工作时,整个网络可以动态的切换到另一个工作信道上。. 时延:由于zigbee采用随机接入MAC层,且不支持时分复用的信道接入方式,因此不能很好的支持一些实时的业务。. 能耗特性:能耗特性是zigbee的一个技术优势,通常zigbee节点所承载的应用数据速率都比较低,在不需要通信是,节点可以进入很低功耗的休眠状态,此时能耗可能只有正常工作状态下的千分之一。由于一般情况下,休眠时间占总运行时间的大部分,有时正常工作的时间还不到百分之一,因此达到很高的节能效果。. 网络层特性:zigbee大规模的组网能力强,因为zigbee底层采用了直扩技术,如果采用非信标模式,网络可以扩展得很大,为不需同步而且节点加入网络和重新加入网络的过程很快,一般可以做到1秒以内,甚至更快。bluetooth通常需要3秒,在路由方面,zigbee支持可靠性很高的网状网的路由,所以可以布置范围很广的网络,并支持多播和广播特性,能够给丰富的应用带来有力的支持。图4.2为zigbee的一个简单的网络架构,其中红色的为协调器,黄色节点为路由器,绿色节点为专用端设备综合考虑后选择方案三。2.1.4控制显示比较与论证方案一 采用LCD12864显示。 LCD12864为一块128X64 点阵的LCD 显示模块,模块上的 LCM 采用COG 技术将控制(包括显存)、驱动器集成在LCM 的玻璃上,接口简单、操作方便。方案二 采用LabVIEW显示控制。LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。LabVIEW(Laboratory Virtual instrument Engineering Workbench)是一种图形化的编程语言的开发环境,它广泛地被工业界、学术界和研究实验室所接受,视为一个标准的数据采集和仪器控制软件。LabVIEW集成了与满足 GPIB、VXI、RS-232和 RS-485 协议的硬件及数据采集卡通讯的全部功能。它还内置了便于应用TCP/IP、ActivX等软件标准的库函数。这是一个功能强大且灵活的软件。利用它可以方便地建立自己的虚拟仪器,其图形化的界面使得编程及使用过程都生动有趣。图形化的程序语言,又称为 “G” 语言。使用这种语言编程时,基本上不写程序代码,取而代之的是流程图或框图。它尽可能利用了技术人员、科学家、工程师所熟悉的术语、图标和概念,因此,LabVIEW是一个面向最终用户的工具。它可以增强你构建自己的科学和工程系统的能力,提供了实现仪器编程和数据采集系统的便捷途径。使用它进行原理研究、设计、测试并实现仪器系统时,可以大大提高工作效率。利用 LabVIEW,可产生独立运行的可执行文件,它是一个真正的32位/64位编译器。像许多重要的软件一样,LabVIEW提供了Windows、UNIX、Linux、Macintosh的多种版本。它主要的方便就是,一个硬件的情况下,可以通过改变软件,就可以实现不同的仪器仪表的功能,非常方便,是相当于软件即硬件!2.2系统设计1EndDevice通过DS18B20采集集温度信息;2EndDevice将采集的集温度信息经过ZigBee网络上传给coordinator;3Coordinator通过串口将温度信息上传PC;4LabVIEW通过串口接收温度信息处理后显示在控制界面。三、电路设计原理3.1 ZigBee 模块设计原理图ZigBee 模块设计原理图1ZigBee 模块设计原理图23.2LabVIEW模块设计原理图LabVIEW模块设计原理图前面板LabVIEW模块前面板用来显示以及控制平台,可以控制程序开始、停止,改变温度的低限制、高限制,图形显示的更新周期。配置串口部分可以调整串口号、波特率、数据位、校验位、停止位、流控制。当温度高于设置温度高限制或低于温度低限制则在报警区产生相应的报警。LabVIEW模块设计原理图后面板LabVIEW模块设计后面板,LabVIEW设计的核心部分,也是代码编写部分。学习LabVIEW也是主要学习该部分的程序编写,根据上传温度数据的不同格式及位数要编写不同的温度转换程序。四、软件编程本章节首先介绍工程流程图,然后分模块介绍功能及编程。因ZigBee EndDevice Coordinator建立网络程序复杂,仅给出主要控制DS18B20部分。4.1 程序流程图4.1.1 ZigBee部分程序流程图4.1.2 LabVIEW部分程序流程图4.2 DS18B20芯片分析4.2.1单线数字温度计DSl820介绍 DSl820数字温度计提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DSl820或从DSl820送出,因此从主机CPU到DSl820仅需一条线(和地线)DSl820的电源可以由数据线本身提供而不需要外部电源。因为每一个DSl820在出厂时已经给定了唯一的序号,因此任意多个DSl820可以存放在同一条单线总线上这允许在许多不同的地方放置温度敏感器件。DSl820的测量范围从-55到+125增量值为0.5可在l s(典型值)内把温度变换成数字。DS18B20 的存储方式.18B20 采用12 位存贮温度值,最高位为符号位,负温度S=1,正温度S=0。如:0550H = +85 度, 0191H = +25.0625 度, FC90H = -55 度.4.2.2 DSl820工作过程及时序DSl820工作过程中的协议如下初始化RoM操作命令存储器操作命令处理数据1初始化单总线上的所有处理均从初始化开始 2ROM操作品令总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如3存储器操作命令4时序主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位 初始化初始化时序单片机t0时刻发送一复位脉冲(最短为480us的低电平信号),接着在tl时刻释放总线并进入接收状态,DS18B20 在检测到总线的上升沿之后,等待15-60us,接着DS18B20在t2时刻发出存在脉冲(低电平持续60-240us),如图中虚线所示。换句话说如果t2t3之间信号电平如果为低,则说明DS18B20复位成功;否则失败。写0时序 写1时序当单片机将总线t0时刻从高拉至低电平时,就产生写时间隙。见上图,从t0时刻开始 15us之内应将所需写的位送到总线上。DS18B20在t0后15-60us间对总线采样,若低电平写入的位是0;若高电平,写入的位是1。连续写2位间的间隙应大于1us。5. 读时序.读时序当单片机将总线t0时刻从高拉至低电平时,总线只须保持低电平4us之后,在t1时刻将总线拉高,产生读时间隙,读时间在t1时刻后t2时刻前有效,t2距t0为15us,也就是说,t2时刻前主机必须完成读位 并在t0后的60us120us内释放总线。6.启动温度转换三个步骤:1、复位DS18B202、发出Skip ROM命令(CCH)3、发出Convert T命令(44H)7.读取温度五个步骤:1、复位DS18B202、发出Skip ROM命令(CCH)3、发出Read命令(BEH)4、读两字节的温度5、温度格式转换4.3 .1 Z-stack协议栈介绍ZigBee联盟于2005年公布了第一份ZigBee规范“ZigBee Specification V1.0”。ZigBee协议规范使用了IEEE 802.15.4定义的物理层(PHY)和媒体介质访问层(MAC),并在此基础上定义了网络层(NWK)和应用层(APL)架构。4.2.1 ZigBee协议的体系结构 ZigBee的体系结构由称为层的各模块组成。每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。每个服务实体通过相应的服务接入点(SAP)为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。ZigBee协议的体系结构如下图所示:物理层(PHY) 物理层定义了物理无线信道和MAC子层之间的接口,提供物理层数据服务和物理层管理服务。 物理层内容: 1)ZigBee的激活;2)当前信道的能量检测;3)接收链路服务质量信息;4)ZigBee信道接入方式;5)信道频率选择;6)数据传输和接收。 介质接入控制子层(MAC) MAC层负责处理所有的物理无线信道访问,并产生网络信号、同步信号;支持PAN连接和分离,提供两个对等MAC实体之间可靠的链路。 MAC层功能: 1) 网络协调器产生信标;2) 与信标同步; 3) 支持PAN(个域网)链路的建立和断开; 4) 为设备的安全性提供支持; 5) 信道接入方式采用免冲突载波检测多址接入(CSMA-CA)机制; 6) 处理和维护保护时隙(GTS)机制; 7) 在两个对等的MAC实体之间提供一个可靠的通信链路。网络层(NWK) ZigBee协议栈的核心部分在网络层。网络层主要实现节点加入或离开网络、接收或抛弃其他节点、路由查找及传送数据等功能。 网络层功能:1)网络发现;2)网络形成;3)允许设备连接;4)路由器初始化;5)设备同网络连接;6)直接将设备同网络连接;7)断开网络连接;8)重新复位设备;9)接收机同步;10)信息库维护。应用层(APL) ZigBee应用层框架包括应用支持层(APS)、ZigBee设备对象(ZDO)和制造商所定义的应用对象。 应用支持层的功能包括:维持绑定表、在绑定的设备之间传送消息。 ZigBee设备对象的功能包括:定义设备在网络中的角色(如ZigBee协调器和终端设备),发起和响应绑定请求,在网络设备之间建立安全机制。ZigBee设备对象还负责发现网络中的设备,并且决定向他们提供何种应用服务。 ZigBee应用层除了提供一些必要函数以及为网络层提供合适的服务接口外,一个重要的功能是应用者可在这层定义自己的应用对象。应用程序框架(AF): 运行在ZigBee协议栈上的应用程序实际上就是厂商自定义的应用对象,并且遵循规范(profile)运行在端点1 240上。在ZigBee应用中,提供2种标准服务类型:键值对(KVP)或报文(MSG)ZigBee设备对象(ZDO): 远程设备通过ZDO请求描述符信息,接收到这些请求时,ZDO会调用配置 对象获取相应描述符值。另外,ZDO提供绑定服务。 协议栈体系分层架构与协议栈代码文件夹对应表如下:栈体系分层架构协议栈代码件物理层(PHY) 硬件层目录(HAL)介质接入控制子层(MAC)链路层目录(MAC和Zmac)网络层(NWK) 网络层目录(NWK)应用支持层(APS) 网络层目录(NWK)应用程序框架(AF) 配置文件目录(Profile)和应用程序(sapi) ZigBee设备对象(ZDO)设备对象目录(ZDO)4.3.2 Z-Stack 体系架构(采用Z-stack1.4.3 1.2.1)1 Z-Stack 软件架构 Z-Stack 由main()函数开始执行,main()函数共做了2 件事: 一是系统初始化, 另外一件是开始执行轮转查询式操作系统, 如下图所示:ZstackZMain.cZSEG int main( void ) osal_int_disable( INTS_ALL ); / 关闭所有中断 HAL_BOARD_INIT(); / 初始化系统时钟 zmain_vdd_check(); / 检查芯片电压是否正常 zmain_ram_init(); / 初始化堆栈 InitBoard( OB_COLD ); / 初始化I/O,LED、Timer 等 HalDriverInit(); / 初始化芯片各硬件模块 osal_nv_init( NULL ); / 初始化Flash 存储器 zmain_ext_addr(); / 确定IEEE 地址zgInit(); / 初始化非易失变量 ZMacInit(); / 初始化MAC 层osal_init_system(); / 初始化操作系统 osal_int_enable( INTS_ALL ); / 使能全部中断 InitBoard( OB_READY ); / 初始化按键 zmain_dev_info(); / 显示设备信息 osal_start_system(); / 执行操作系统 Z-Stack操作系统初始化 OSAL.c byte osal_init_system( void ) osal_mem_init(); / Initialize the Memory Allocation System osal_qHead = NULL; / Initialize the message queue osalTimerInit(); / Initiaize the timers osal_pwrmgr_init(); / Initialize the Power Management System osalInitTasks(); /初始化系统的任务 osal_mem_kick(); / Setup efficient search for the first free block of heap. return ( ZSUCCESS ); sapi.c void osalInitTasks( void ) uint8 taskID = 0; /分配内存,返回指向缓冲区的指针 tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); /设置所分配的内存空间单元值为0 osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt); /任务优先级由高向低依次排列,高优先级对应taskID的值反而小 macTaskInit( taskID+ ); /macTaskInit(0),用户不需考虑 nwk_init( taskID+ ); /nwk_init(1),用户不需考虑 Hal_Init( taskID+ ); /Hal_Init(2),用户需考虑APS_Init( taskID+ ); /APS_Init(3),用户不需考虑 ZDApp_Init( taskID+ ); /ZDApp_Init(4),用户需考虑 SAPI_Init( taskID ); /SAPI_Init(5),用户需考虑 操作系统执行过程 Z-Stack中操作系统是基于优先级的轮转查询式操作系统,执行流程图如下图所示:操作系统执行过程详细执行过程如下: FS_ZstackOSAL.cvoid osal_start_system( void ) for(;) / 死循环 do if (tasksEventsidx) break; / 得到待处理的最高优先级任务索引号idx while (+idx tasksCnt); if (idx tasksCnt) HAL_ENTER_CRITICAL_SECTION(intState); /进入临界区 events = tasksEventsidx; /提取需要处理的任务中的事件 tasksEventsidx = 0; / 清除本次任务的事件 HAL_EXIT_CRITICAL_SECTION(intState); /退出临界区 events = (tasksArridx)( idx, events ); /通过指针调用任务处理函数HAL_ENTER_CRITICAL_SECTION(intState); /进入临界区 tasksEventsidx |= events; / 保存未处理的事件 HAL_EXIT_CRITICAL_SECTION(intState); /退出临界区 sapi.c const pTaskEventHandlerFn tasksArr = macEventLoop, /用户不需要考虑 nwk_event_loop, /用户不需要考虑 Hal_ProcessEvent, /用户可以考虑 APS_event_loop, /用户不需要考虑 ZDApp_event_loop, /用户可以考虑 SAPI_ProcessEvent /用户可以考虑 ;4.4 DS18B20程序4.4.1 DS18B20.h程序#ifndef DS18B20_H#define DS18B20_H#include ioCC2430.h#include hal.h#define CL_DQ P0_0=0#define SET_DQ P0_0=1 #define SET_OUT P0DIR|=0x01#define SET_IN P0DIR&=0x01#define IN_DQ P0_0extern unsigned char id8;extern unsigned char sensor_data_value2;extern UINT8 flag;/void Delay_1us(void); void Delay_nus(UINT16 n) ;void write_1820(unsigned char x) ; unsigned char read_1820(void); void init_1820(void) ; void read_data(void);void get_id(void);void ds18b20_main(void);#endif4.4.2 DS18B20.c程序#include DS18B20.hUINT8 id8;UINT8 sensor_data_value2;UINT8 flag; void Delay_nus(UINT16 s) while (s-) asm(NOP); asm(NOP); asm(NOP); void init_1820(void) SET_OUT; SET_DQ;/输出1 CL_DQ; Delay_nus(550);/拉低一段时间 SET_DQ;/释放 SET_IN;/输入 Delay_nus(40); /释放总线后等待15-60us while(IN_DQ) ;/等待回复 Delay_nus(240);/回复的低电平在60到240us SET_OUT; SET_DQ;/回到初始DQ=1;void write_1820(UINT8 x) UINT8 m; SET_OUT; for(m=0;m8;m+) CL_DQ; if(x&(1m) /写数据,从低位开始 SET_DQ; else CL_DQ; Delay_nus(40); /1560us SET_DQ; SET_DQ; UINT8 read_1820(void) UINT8 temp,k,n; temp=0; for(n=0;n8;n+) CL_DQ; SET_DQ; SET_IN; k=IN_DQ; /读数据,从低位开始 if(k) temp|=(1n); else temp&=(1n); Delay_nus(70); /60120us SET_OUT; return (temp); /搜索IDvoid get_id() init_1820(); /resert write_1820(0x33); for(unsigned char ii=0;ii8;ii+) idii=read_1820(); void read_data(void) UINT8 temh,teml; UINT8 a,b,c; init_1820(); /复位18b20 write_1820(0xcc); / 发出转换命令 搜索器件 write_1820(0x44); /启动 Delay_nus(50000); init_1820(); write_1820(0xcc); write_1820(0xbe); teml=read_1820(); /读数据 temh=read_1820(); if(temh&0x80)/判断正负 flag=1; c=0; c=c|temh; c=c&0x00ff; c=c4; else flag=0; /为正 a=temh4; /得到高位的值 b=teml&0x0f; temh=a; teml=b&0x00ff; sensor_data_value0=teml; sensor_data_value1=temh;4.5.1 EndDevice 主要部分程序Simplesensor.c/* * INCLUDES*/#include ZComDef.h#include OSAL.h#include sapi.h#include hal_key.h#include hal_led.h#include hal_adc.h#include hal_mcu.h#include SimpleApp.h#include hal.h#include DS18B20.h/加温度传感器头文件/* * CONSTANTS */ Application States#define APP_INIT 0 / Initial state#define APP_START 1 / Sensor has joined network#define APP_BOUND 2 / Sensor is bound to collector/ Application osal event identifiers/ Bit mask of events ( from 0x0000 to 0x00FF )#define MY_START_EVT 0x0001#define MY_REPORT_TEMP_EVT 0x0002#define MY_REPORT_BATT_EVT 0x0004#define MY_FIND_COLLECTOR_EVT 0x0008#define MY_REPORT_EXTEMP_EVT 0x0080/读取真实温度的数据/* * TYPEDEFS */* * LOCAL VARIABLES */static uint8 myAppState = APP_INIT;static uint16 myStartRetryDelay = 10000; / millisecondsstatic uint16 myBindRetryDelay = 10000; / millisecondsstatic uint16 myExTempReportPeriod = 1000; / milliseconds/ 每1秒采集一次温度信息/* * GLOBAL VARIABLES */static UINT8 ch7;/存放温度的数组/ Inputs and Outputs for Switch device#define NUM_OUT_CMD_SENSOR 1#define NUM_IN_CMD_SENSOR 0/ List of output and input commands for Switch deviceconst cId_t zb_OutCmdListNUM_OUT_CMD_SENSOR = SENSOR_REPORT_CMD_ID;#define EXTEMP_REPORT 0x05/真实温度数据报告/ Define SimpleDescriptor for Switch deviceconst SimpleDescriptionFormat_t zb_SimpleDesc = MY_ENDPOINT_ID, / Endpoint MY_PROFILE_ID, / Profile ID DEV_ID_SENSOR, / Device ID DEVICE_VERSION_SENSOR, / Device Version 0, / Reserved NUM_IN_CMD_SENSOR, / Number of Input Commands (cId_t *) NULL, / Input Command List NUM_OUT_CMD_SENSOR, / Number of Output Commands (cId_t *) zb_OutCmdList / Output Command List;/*/ LOCAL FUNCTIONS*/static void myApp_StartReporting( void );static void myApp_StopReporting( void );static void myApp_ReadExTemperature( void );/读取实际温度信息函数/* * fn zb_HandleOsalEvent * * brief The zb_HandleOsalEvent function is called by the operating * system when a task event is set * * param event - Bitmask containing the events that have been set * * return none */void zb_HandleOsalEvent( uint16 event ) uint8 pExTemp10; if ( event & MY_START_EVT ) zb_StartRequest(); /读取真实温度事件处理 if ( event & MY_REPORT_EXTEMP_EVT ) / Read battery value / If battery level low, report battery value pExTemp0 = EXTEMP_REPORT; myApp_ReadExTemperature(); osal_memcpy( pExTemp+1, ch, 7 ); zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, 9, pExTemp, 0, AF_ACK_REQUEST

温馨提示

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

评论

0/150

提交评论