摘 要
基于短距离RF通讯技术的无线数据采集系统由上位机和下位机组成,下位机负责数据的采集,上位机负责远程控制与显示,二者通过NRF905射频模块完成通信,实现数据的上传和保存,同时对下位机进行参数设置。本文主要介绍了基于射频模块NRF905芯片的无线数据采集系统(上位机)的设计思想和实现方法。本系统是通过单片机控制来实现上位机对下位机所采集的数据进行无线传输,并在上位机显示。针对主从机的数据通信,制定详细的通信协议,保证数据传输的可靠性。系统由ATC51单片机控制模块,NRF905无线收发模块,键盘控制模块,存储模块,显示模块和串行通信模块组成,实现温度的采集、无线传输、存储、显示并可以通过RS232上传到PC机中。
本文详细论证了实现数据采集与无线传输方案的设计思路及系统的总体架构,然后详尽地阐述了系统的硬件电路结构和完成各项功能相关的软件设计。
关键词: ATC51,NRF905,无线数据采集,上位机
Based on The Wireless Communication Technology of The Short Ddistance RF Data Acquisition System Design (PC part)
Abstract
Based on the wireless communication technology of the short distance RF data acquisition system consists of PC and a unit under a place machine responsible for data collection, PC responsible for remote control and display, NRF905 RF modules between them through complete communications, realize the data upload and preservation. Meanwhile to lower place machine parameters Settings. This paper mainly introduces the NRF905 chips based on rf modules wireless data acquisition system (PC) the design thought and realization method. The single-chip microcomputer control system is achieved through PC to lower place machine of the data collected by wireless transmission, and in PC display. In order to guarantee the reliability of the data transmission of data transmission, must be formulated simple communication protocol, the user can interact with the system. It is based on ATC51 for control unit, wireless transceiver module NRF905 complete data wireless transmission, use the keyboard module control and use digital tube display, realize temperature monitoring, wireless transmission and display, and the receiving end with serial connected to the motherboard PC.
The article demonstrates in detail the realization of the temperature data collection, wireless transmission program design ideas and overall system architecture, and then it elaborates on the structure of hardware circuit and the related software design of various functions.
KEY WORDS: ATC51,NRF905,Wireless data acquisition,PC
1 引言
1.1课题的背景和意义
在工业控制现场,常常需要采集大量的现场数据,如电压、电流、温度、湿度、气压等,温度是一个非常重要的物理量,因为它直接影响燃烧、化学反应、发酵、烘烤、煅烧、蒸馏、浓度、挤压成形、结晶以及空气流动等物理和化学过程。温度控制失误就可能引起生产安全、产品质量、产品产量等一系列问题,因此对温度的检测的意义就越来越大。温度采集控制系统在工业生产、科学研究和人们的生活领域中,得到了广泛应用,在工业生产过程中,很多时候都需要对温度进行严格的监控,以使得生产能够顺利的进行,产品的质量才能够得到充分的保证。温度作为一项工业常用测量对象,在工业现场和过程控制中具有至关重要的作用。随着科学技术的发展,要求温度测量的范围向深度和广度扩展,不但要求有足够的精度满足工业生产和科学技术的要求,而且还要求有广泛的测温范围。
在许多测控现场,传统数据传输都是通过有线电缆实现的。随着射频、集成电路技术的发展,无线通信功能的实现更容易,数据传输速率更快,抗干扰能力更强,因此,许多应用采用了无线传输技术。无线数据传输与有线数据传输相比,有诸多优点:一是成本低,省去大量布线;二是建网快捷,只需在每个终端连接无线数据传输模块和架设适当高度天线;三是适应性好,可应用于某些特殊环境;四是扩展性好,只需将设备与无线数据传输模块相连接。因此,无线传输是一种有效数据传输方式。所以使用无线传输的高精度测温系统可以对生产环境的温度进行无线传输并且能够进行使操作员可以远距离实时了解被测现场的温度变化情况,保证生产的自动化、智能化能够顺利、安全进行,从而提高企业的生产效率。
1.2无线数据采集系统的发展现状及发展趋势
数据采集技术是信息科学的重要组成部分,已广泛应用于各个领域。在数据传输方式上,目前数据采集系统基本上是通过有线方式进行连接,有线方式的数据传输速度快,可靠性高且运行稳定,能满足大多数情况的需要,但是其应用受现场环境和应用对象的。
近年来,随着射频技术、微电子技术及集成电路技术的进步,无线通信技术取得了飞速的发展,无线通信的实现成本越来越低,传输速度越来越快,可靠性越来越高,并且逐渐达到可以和有线网络相媲美的水平。
短距离无线通信技术是近年来的研究热点,将无线技术引入数据采集领域,可以解决某些无法或不便布线的环境下的数据采集问题,以及解决有线网络带来的布线麻烦、不易维护等缺点。有些数据采集系统应用于智能家居领域的,但也进一步拓展至其它诸如工业控制、仪器仪表等领域对象的状态监测。
目前,已经将传感器技术和新兴的无线通信技术相结合,通过数据传输的无线化来达到对环境指标数据的采集。
1.3 本文研究的主要内容以及实现方法
1.3.1 研究内容
目前大多数无线数据采集系统都会有主机和从机之分,主机发送命令,从机执行命令,在主机外加键盘控制模块和显示模块,以此来命令从机将采集到的数据再发送给主机并通过显示模块显示出数据,这样就实现了主机对从机的控制。
本课题主要是进行基于短距离RF通讯技术的无线数据采集系统设计(上位机部分)的设计,无线数据采集系统(上位机部分)由无线传输收发模块、单片机控制模块、数码管显示模块、键盘控制模块以及RS232串口模块组成。
本课题将新兴的无线通信技术和远程监控技术相结合,通过数据传输的无线化来达到智能家居、工业控制等领域中布线不便时对室内生活环境、工业测控现场指标数据的采集。
本课题提出了一种基于无线射频传输的数据采集系统(上位机部分)。本系统基于无线射频收发模块NRF905跟ATC51单片机为核心,以低功耗和模块化为设计原则。设计出具有体积小,功耗低,数据传输稳定可靠及成本低的无线数据采集系统(上位机部分)。
(1) 针对实际应用需求设计系统总体方案,完成了无线数据传输、数据显示的结构设计。
(2) 以低功耗和模块化为选择元器件的原则,选取了合适的单片机、无线收发模块、显示模块,键盘模块和串口模块。
(3) 设计无线收发方案,并通过软件控制元器件工作模式等方式实现系统的低功耗设计。
(4) 完成无线数据采集的硬件电路设计及相关的开发和调试。主要包括单片机数据处理相关程序设计、无线射频模块的接口设计以及单片机与PC通信的接口设计。
本课题旨在通过软、硬件的有机结合,以硬件为基础,进行各功能模块的编写。对系统硬件的工作原理进行了分析描述,并进行系统硬件设计。具体实现数码管动态显示、ATC51及NRF905等器件外接电路接口的软、硬件调试。
1.3.2 实现方法
本系统是通过单片机控制无线传输来实现对具有对周围环境的相关数据进行测量和传输功能的下位机进行命令操作。本系统是NRF905为无线收发模块,ATC51单片机为控制模块,用上位机对下位机进行数据的实时监控,如可显示实时温度、历史温度,就是一套通过无线方式实现温度的远程监控的完整系统,并且可用串口连接到PC机上。
基于短距离RF通讯技术的无线数据采集系统设计(上位机部分)主要由五个模块构成,无线传输收发模块、单片机控制模块、数码管显示模块、键盘控制模块以及RS232串口模块。
1.4 本论文结构
本论文共有六章,其中软件设计部分是本论文的重点,分别对无线数据采集系统进行详细的介绍。
第一章引言,介绍了课题背景意义和发展现状。
第二章是对无线通信的开发介绍及对无线数据采集系统(上位机部分)主要器件的介绍,首先介绍了各类无线通信技术和本论文所采用的低功率短距离无线通信技术,随后详细介绍了本系统的所使用的单片机ATC51和无线收发芯片NRF905。
第三章是对无线数据采集系统(上位机部分)的方案描述,包括单片机主控模块以及外围模块(显示、键盘、串口)和无线传输收发模块的上位机的总体方案,并给出总体结构框图。
第四章介绍了本系统硬件的设计,各模块的具体硬件电路。
第五章介绍了本系统的软件设计,介绍了无线数据采集系统(上位机部分)的整体软件框图,详细介绍了无线收发流程及程序。
第六章课题总结与展望。
2 无线通信技术的介绍
2.1无线通信技术的选择
无线通信包括长距离无线通信和短距离无线通信。长距离无线通信一般要借助基站达到长距离通信的目的,被称为长距离移动通信,比如手机通信。这种长距离移动通信一般成本都比较高。
随着电子技术的不断进步,短距离无线通信技术在近几年蓬勃发展起来,世界上主要的芯片厂商都推出了无线收发芯片。短距离无线通信系统的大部分功能都集成到一块芯片内部,一般使用单片数字信号射频收发芯片,加上微控制器和少量外围器件构成专用或通用无线通信模块。所有高频元件包括电感、振荡器等己经全部集成在芯片内部,一致性良好,性能稳定且不受外界干扰。射频芯片一般采用FSK调制方式,工作于IsM频段,通信模块一般包含简单透明的数据传输协议或使用简单的加密防议,发射功率、工作频率等所有工作参数全部通过软件设置完成,用户不用对无线通信原理和工作机制有较深的了解,只要依据命令字进行操作即可实现基本的数据传输。
新一代短距离无线数据通信系统具有体积小、功耗低、稳定性好、抗干扰能力强等优点,而且开发简单快速,可以方便地嵌入到各种设备中,实现设备间的无线连接,因此,较适合搭建小型网络,在工业、民用领域得到较为广泛的应用。
对于一个系统来说,无线通信技术的选择主要考虑以下几点:
(1) 可以完成系统的功能要求;
(2) 对于一个无线测温系统来说,需要对传感器收集到的信号进行处理,并要求系统的可靠性高、稳定性好、抗干扰能力强,且对于一个无线系统来说,低功耗也是一项重要的指标;
(3) 开发简单。
收发芯片所需的外围元件数量芯片外围元器件的数量直接关系到系统的复杂程度和成本,因此应该选择外围元件少的收发芯片。通信协议的复杂程度也完全影响了整个系统的开发的复杂性。
(4) 成本低
下面是对现在比较常用的几种短距离无线通信技术进行对比,并得到本系统的短距离解决方案。
2.2无线通信技术的发展与现状
随着移动通信需求和远程数据采集量的增加,加之有线传输的费用日益增长,人们正逐渐认识到在许多检测领域采用无线传输的必要性。在过去的几年中,无线通讯领域取得了很大的进展,这其中包括数字电路和射频电路制作工艺的进步、低功耗电路、高能电池以及微电子技术的采用。
短距离无线通信方案目前有红外通信技术IrDA(InfraredDataAssociation)、IEEE802.ll、蓝牙技术(Bluetooth)、Zigbee、超宽带技术和低功率短距离无线通信技术。
1. 红外通信技术(IrDA)
IrDA(Infrared Data Association)是由红外数据协会提出并推行的一种无线通信协议,这种通信方式通过数据电脉冲和红外光脉冲之间的相互转换实现无线数据的收发。IrDA设备使用发光二极管发送信号,波长范围875 nm主30nm.新制定的超高红外(VFm)标准传输速率达到16Mpbs,相比传统版本的4Mbps快了4倍,接收角度也由原来的30度扩展到120度。
IrDA设备的使用不需要申请特定频率的使用执照,并且还具有体积小,功耗低,技术成熟的优点.IrDA数据传输速率比较高,同时由于是点对点的通信, 受到的干扰也较小,目前在成熟度和普及度上,IrDA是新兴的无线通信技术无法比拟的。
但是,IxDA的缺点也很明显.首先IrDA是一种视距传输技术,通信设备中间不能有任何阻挡物,通信设备的位置也需要相对固定,不适宜用于移动数据传输;其次,IrDA只能实现点对点的无线通信,不能完成点对多点的无线通信; 最后,IrDA设备的核心器件一红外LED容易损坏,因而设备寿命有限。
2. IEEE802.11
IEEE802.11M 802.1l是个系列标准,由5个现行有效的标准—{02.11,802.1la,802.1lb, 802.1lb-Corl,802.1lc和5个正在发展制定中的标准—802.1ie,802.1lf,802.1lg, 802.1lh,802.1li组成.IEEE802.1lb技术标准是无线局域网的国际标准,自发 布之日起就得到了广泛的应用,迄今为止仍是应用热点。该标准工作在2.4GHz 的频段上,采用了补码键控(cCK)调制技术和直接序列调频(DSSS)技术,最大传输速率可达11Mbit/s,并且可以根据情况的变化,在11 Mbit/s,5.5 Mbit/s,2 Mbi体,1 Mbit/s的不同速率之间自动切换,且在2 Mbiffs,1 Mbit/s的速率时与 802.11兼容,它从根本上改变了WLAN的设计和应用现状,扩大了WLAN的应用领域.现在,大多数厂商生产的WLAN产品都基于802.II标准。 802.1la标准与802.1lb同年制定,它工作在5GHz频段上,使用 OFDM(Orthogonal Frequency Division Multiplexing)调制技术,支持6,9,12,18, 24,36,48和54Mbit/s的传输速率.802.1lb与802.11a两个标准都存在着各自的优缺点。802.1ib的优势在于价格低廉,但速率较低(最高11Mbit/s);而802.1la优势在于传输速率快(最高54Mbit/s)且受干扰少,但价格相对较高。另外,802.1lb 与802.1la工作在不同的频段上,不能工作在同一接入点(AP)的网络里,因此 802.1lb与802.1la互不兼容。为了解决上述问题,IEEE802.11工作组开始定义新的物理层标准802.1lg. 802.1lg标准与以前的802.11协议标准相比有以下两个特点:在2.4GHz频段使用正交频分复用(OFDM)调制技术,使数据传输速率提高到20Mbiffs以上;能够与802.1lb的Wi.Fi系统互相连通,共存于同一AP的网络里,保障了后向兼容性, 延长了802.11b产品的使用寿命,降低了用户的投资。
3. 蓝牙技术(Bluetooth)
蓝牙技术作为一种近距离无线连接的全球性开放规范,己经得到了全球众多大企业的支持。蓝牙技术同时支持语音和数据传输,使用跳频扩频技术,本身包括纠错机制,可靠性高,蓝牙规范的核心部分协议允许多个设备进行相互定位、连接和交换数据,并能实现互操作和交互式应用。但是蓝牙设备价格昂贵,通信协议复杂,通讯距离近,蓝牙RF定义了三种功率等级(100mw,25mw和lmw),当蓝牙设备功率为lmw时,其发射范围一般为10m。在蓝牙技术的使用过程中,人们发现蓝牙技术尽管有许多优点,但仍存在许多缺陷。对工业,家庭自动化控制和遥测遥控领域而言,蓝牙技术显得太复杂,功耗大,距离近,组网规模太小等,而工业自动化对无线通信的需求越来越强烈。正因此,经过人们长期努力,Zigbee协议在2003年中通过后,于2004正式问世了。
4. Zigbee技术
Zigbee技术是随着工业自动化对于无线通信和数据传输的需求而产生的,它是一个由可多到65000个无线数传模块组成的一个无线数传网络平台,十分类似现有的移动通信的CDMA网或GSM网,每一个Zigbee网络数传模块类似移动网络的一个基站,在整个网络范围内,它们之间可以进行相互通信;每个网络节点间的距离可以从标准的75米,到扩展后的几百米,甚至几公里;另外整个Zigbee网络还可以与现有的其它的各种网络连接。Zigbee技术的目标就是针对工业,家庭自动化,遥测遥控,汽车自动化、农业自动化和医疗护理等,例如灯光自动化控制,传感器的无线数据采集和监控,油田,电力,矿山和物流管理等应用领域。另外它还可以对局部区域内移动目标例如城市中的车辆进行定位。Zigbee网络省电、可靠、成本低、容量大、安全,可广泛应用于各种自动控制领域。
Zigbee技术和RFID技术在2004年就被列为当今世界发展最快,市场前景最广阔的十大最新技术中的两个。尽管国内不少人已经开始关注Zigbee这项新技术,然而,由于Zigbee本身是一种新的系统集成技术,应用软件的开发必须和网络传输,射频技术和底层软硬件控制技术结合在一起。因而深入理解这个来自国外的新技术,再组织一个在这几个方面都有丰富经验的配套的队伍,是一件不容易的事情。
5. 超宽带技术
超宽带(uwB)技术陋14J 超宽带UWB(Ultra Wide Band)无线技术出现在60年代,其应用仅限于军事. 2002年这项无线技术开始应用于民用通信领域,因而获得了广泛的关注.与传 统技术不同,UWB是一种无载波通信技术,它不采用正弦载波,而是利用纳秒至微微秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽,它能够实 现无线局域网中无线接口的互联和接入,并具有低功耗,高带宽,低复杂度的优点. 目前,英特尔公司正在进行研究和开发,以便将UWB集成到个人电脑芯片 组中,将其作为10m以内的近距离高速无线传输接口使用.英特尔将UWB定位 于"无线USB2.0",当前UWB的传输速率己达到100Mbit/s,其下一个目标是 500Mbit/s.然而,UWB作为民用还是一项新技术,还有一些实际问题,如安全问题,干扰问题等有待解决.
6. 低功率短距离无线通信技术
该技术一般采用单片数字信号收发芯片,加上微控制器和少量外围器件构成专用或通用无线通信模块.一般射频芯片采用FSK调制方式,工作于ISM频段,一些必要的外围模块都已经集成在芯片内部,并且提供了简单透明的数据传输协议或使用简单的加密协议,用户不用对无线通信原理和工作机制有较深的了解,只要依据芯片提供的操作接口进行操作即可实现基本的数据无线传输功能.由于其功率小,价格低廉,开发简单快速因而在工业,民用领域得到了广泛的应用. 但数据传输速度,流量都较小,因此比较适合搭建对数据传输速度要求不高的小 型网络.目前,很多公司推出了这种类型的单片无线收发芯片,其中比较典型的 是Nordic公司推出的nRF系列芯片.
通过以上几种无线技术的介绍,从系统的经济性、传输速率,确定该系统部分电路设计使用无线收发芯片。无线收发芯片的可靠性高、稳定性好、抗干扰能力强,通讯防议简单透明,技术成熟。使用该种方案无线通信接口与数据采集系统接口电路设计简单。无线收发芯片的种类和数量比较多,在设计中选择合适芯片可以提高产品开发周期、节约成本。
2.3 器件的选择及介绍
2.3.1 无线收发芯片的选择
无线收发芯片的种类和数量比较多,在设计中选择合适芯片可以提高产品开发周期、节约成本。在选择时,应主要参考以下几点:
(1) 收发芯片的数据传输是否需要进行曼彻斯特编码:采用曼彻斯特编码的芯片,在编程上会需要较高的技巧和经验,需要更多的内存和程序容量,并且曼彻斯特编码大大降低数据传输的效率,一般仅能达到标称速率的1/3,而采用串口传输的芯片,应用及编程非常简单,传送的效率很高,标称速率就是实际速率,编程方便。
(2) 收发芯片所需的外围元件数量:芯片外围元器件的数量直接关系到系统的复杂程度和成本,因此应该选择外围元件少的收发芯片。
(3) 功耗:大多数无线收发芯片是应用在便携式产品上的,因此功耗也非常重要,应该根据需要选择综合功耗较小的产品。
(4) 发射功率:在同等条件下,为了保证有效和可靠的通信,应该选用发射功率较高的产品。
(5) 收发芯片的封装和管脚数:较少的管脚以及较小的封装,有利于减少PCB面积降低成本,适合便携式产品的设计,也有利于开发和生产。
常用的无线收发芯片主要有:
(1) CC1000是根据ChiPcon公司的SmartRF技术,在 0.350umCMOS工艺下制造的一种理想的超高频单片收发通信芯片。它的工作频带在315、868及915MHZ,但CC1000很容易通过编程使其工作在300~1000MHz范围内。它具有低电压(2.3~3.6V),极低的功耗,可编程输出功率(-20~10dBm),灵敏度(一般-109dBm),小尺寸(TSSOP-28封装),集成了位同步器等特点。其FSK数传速率可达72.8Kbps,具有250HZ步长可编程频率能力,适用于跳频协议:主要工作参数能通过串行总线接口编程改变,使用非常灵活。
(2) nRF401是挪威Nordic VLSI公司推出的单芯片即收发机,专为在433MHz IsM(工业、科研和医疗)频段工作而设计。该芯片集成了高频发射、高频接收、PLL合成、FSK调制、FSK解调、双频道切换等功能,具有性能优异、功耗低、使用方便等特点。nRF401的外围元件很少,仅10个左右。只包括一个4MHZ基准晶振(可与MCU共享)、一个PLL环路滤波器和一个VCO电感,收发天线合一,没有调试部件,这给研制及生产带来了极大的方便。
(3) nRF903单片射频收发器芯片工作在 915MHZ国际通用的ISM频段;GMSK/GFSK调制和解调,抗干扰能力强;采用DDS+PLL频率合成技术,频率稳定性好;灵敏度高达-100dBm,最大发射功率达+10dBm;数据速率可达76.8Kbits;170个频道,适合需要多信道工作的特殊场合;可方便地嵌入各种测量和控制系统中进行无线数据双向传输,在仪器仪表数据采集系统、无线数据通信系统、计算机遥测遥控系统等中应用。
(4) TH72011是Melexis公司的单片射频发射芯片,频率范围380MHz~ 450MHz,采用VCO+PLL频率合成技术,频率稳定性好;FSK调制方式,抗干扰能力强;FSK频偏和中心频率可调节;宽电压范围 1.9~ 5.5V,静态电流小,工作电流可在3.5mA~10.7mA调节;发射功率可在-12dBm~ +10dBm调节,数据速率可达40Kbit/s。可嵌入各种测量和控制系统中进行无线数据传输,在保安系统、微功耗遥测遥控系统等中应用。
(5) nRF24EI是挪威Nordic VLSI ASA公司最近开发的一种嵌入了高性能单片机内核的高速单片无线收发芯片。采用先进的0.18us CMOS工艺,以nRF2401芯片结构为基础,将射频、8051MCU、9输入12位ADC、125频道、UART、SPI、PWM、RTC、WDT全部集成到单芯片中;内部有电压调节器(工作电压1.9~ 3.6V)和VDD电压监视,通常开关时间小于 200us,数据速率1Mbps,输出功率0dBm;不需要外接SAW滤波器,极少的外围电路,发射功率、工作频率等所有工作参数全部通过软件设置完成,所有高频元件包括电感、振荡器等已经全部集成在芯片内部,一致性良好,性能稳定且不受外界影响;工作在全球开放的2.4GHz频段、勿需申请通信许可证。
(6) nRF905芯片可以工作于ShockBurst(自动处理前缀、地址和CRC方式)。内置电压调整模块,最大限度地抑制噪音,为系统提供1.9~3.6V的工作电压,载波检测。
由于nRF905功耗低,工作可靠nRF905没有复杂的通信协议,完全对用户透明,同种产品之间可以自由通信,因此很适用于无线数据传输系统的设计。它可应用在:无线数据通讯、报警和安全系统、自动测试系统、家庭自动化控制、遥控装置、监测、车辆安全系统、工业控制、远程遥控及其它短距离无线高速应用,故本系统将nRF905做为无线收发芯片的首选。
2.3.2 主要器件的介绍
(1)单片机ATC51
ATC51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash只读程序存储器和128 bytes的随机存取数据存储器(RAM),兼容标准MCS-51指令系统。
具有如下特性:
1)面向控制的8位CPU;
2)一个片内振荡器和时钟产生电路,震荡频率为0~24MHz;
3)片内4KB Flash ROM程序存储器;
4)128B的片内数据存储器;
5)可寻址KB的片外程序存储器和片外数据存储器控制电路;
6)2个16位定时/计数器;
7)4个并行I/O口,共32条可单独编程的I/O线;
8)5个中断源,2个中断优先级;
9)一个全双工的异步串行口;
10)21个特殊功能寄存器;
11)具有节电工作方式,即休闲方式和掉电保护方式。
主要管脚有:
RESET(9 脚)为复位输入端口,外接电阻电容组成的复位电路,XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义。
图 2-1 ATC51管脚图
(2)无线收发模块nRF905
nRF905是挪威Nordic公司推出的单射频发射器芯片,工作电压为1.9 V -3.6V,32引脚封装(5×5),工作于433/868/915MHz3个频道。nRF905可以自动完成处理字头和CRC(循环冗余校验)的工作,可由内部硬件自动完成曼彻斯特编/解,使用SPI接口与微控制器通信,配置非常方便,其功耗非常低,以-10dBm的输出功率发射时电流只有11mA,在接收模式时电流为12.5mA。nRF905单无线收发器工作由一个完全集成的频率调制器,一个带解调器的接收器,一个功率放大器,一个晶体震荡器和一个调节器组成。ShockBurst工作模式的特点是自动产生前导和CRC,可以很容易通过SPI接口进行编程配置。传输前的载波检测协议,当正确的数据包被接收或发送时有数据准备就绪信号输出,侦测接收的数据包当地址正确输出地址匹配信号。
(2) nRF905工作模式
nRF905采用Nordic公司的VLSI ShockBurst技术。ShockBurst技术使nRF905能够提供高速的数据传输,而不需要昂贵的高速MCU来进行数据处理/时钟覆盖。通过将与RF协议有关的高速信号处理放到芯内,nRF905提供给应用的微控制器一个SPI接口,速率由微控制器己设定的接口速度决定。nRF905通过ShockBurst工作模式在RF以最大速率进行连接时降低数字应用部分的速度来降低在应用中的平均电流消耗。在ShockBurst RX模式中,地址匹配AM和数据准备就绪DR信号通知MCU一个有效的地址和数据包已经各接收完成。在ShockBurst TX模式中,nRF905动产生前导和CRC校验,数据准备就绪DR信号通知MCU数据传输已经完成。总之,这意味着降低MCU的存储器需求也就是说降低MCU成本,又同时缩短软件开发时间。
表2-1 nRF905的管脚说明表
| 管脚 | 名称 | 管脚功能 | 说明 | |
| 1 | TRX_CE | 数字输入 | 使能芯片发射或接收 | |
| 2 | PWR_UP | 数字输入 | 芯片上电 | |
| 3 | uPCLK | 时钟输出 | 由晶振分频的输出时钟 | |
| 4 | VDD | 电源 | 电源(+3V DC) | |
| 5 | VSS | 电源 | 地(0V) | |
| 6 | CD | 数字输出 | 载波检测 | |
| 7 | AM | 数字输出 | 地址匹配 | |
| 8 | DR | 数字输出 | 接受或发射数据完成 | |
| 9 | VSS | 电源 | 地(0V) | |
| 10 | MISO | SPI接口 | SPI输出 | |
| 11 | MOSI | SPI接口 | SPI输入 | |
| 12 | SCK | SPI时钟 | SPI时钟 | |
| 13 | CSN | SPI使能 | SPI使能 | |
| 14 | XC1 | 模拟输入 | 晶振1脚/外部时钟输入脚 | |
| 15 | XC2 | 模拟输出 | 晶振2脚 | |
| 16 | VSS | 电源 | 地(0V) | |
| 17 | VDD | 电源 | 电源(+3V DC) | |
| 18 | VSS | 电源 | 地(0V) | |
| 19 | VDD_PA | 电源输出 | 给NRF905功放提供+1.8V电源 | |
| 20 | ANT1 | 射频输出 | 天线接口1 | |
| 21 | ANT2 | 射频输出 | 天线接口2 | |
| 22 | VSS | 电源 | 地(0V) | |
| 23 | IREF | 模拟输入 | 参考电流 | |
| 24 | VSS | 电源 | 地(0V) | |
| 25 | VDD | 电源 | 地(0V) | |
| 26 | VSS | 电源 | 地(0V) | |
| 27 | VSS | 电源 | 地(0V) | |
| 28 | VSS | 电源 | 地(0V) | |
| 29 | VSS | 电源 | 地(0V) | |
| 30 | VSS | 电源 | 地(0V) | |
| 31 | DVSS_1V2 | 电源 | 耦合的低压正数字电源输出 | |
| 32 | TX_EN | 数字输入 | TX_EN= “1”TX模式 | |
表2-2 nRF905的工作模式设置表
| PWR_UP | TRX_CE | TX_EN | 工作模式 |
| 0 | X | X | 掉电和SPI编程 |
| 1 | 0 | X | Standby和SPI编程 |
| 1 | 1 | 0 | ShockBurst RX |
| 1 | 1 | 1 | ShockBurst TX |
a) 当应用MCU有遥控数据节点时,接收节点的地址TX-address和有效数据TX-payload通过SPI接口传送给nRF905应用协议或MCU设置接口速度;
b) MCU设置TRX_CE、TX_EN为高来使nRF905 ShockBurst传输;
c) nRF905 ShockBurst:无线系统自动上电、数据包完成(加前导和CRC校验)、数据包发送(100kbps,GFSK,曼切斯特编)
d) 如果AUTO_RETRAN被设置为高nRF905将连续地发送数据包直到TRX_CE被设置为低;
e) 当TRX_CE被设置为低时,nRF905结束数据传输并动进入standby模式。
2) 典型ShockBurst RX模式
a) 通过设置TRX_CE高,TX_EN低来选择ShockBurst模式;
b) 650us以后,nRF905测空中的信息;
c) 当nRF905发现和接收频率相同的载波时,载波检测CD被置高;
d) 当nRF905接收到有效的地址时,地址匹配AM被置高;
e) 当nRF905接收到有效的数据包(CRC校验正确)时,nRF905去掉前导、地址和CRC位,数据准备就绪(DR)被置高;
f) MCU设置TRX_CE低,进入standby模式低电流模式;
g) MCU可以以合适的速率通过SPI接口读出有效数据;
h) 当所有的有效数据被读出后,nRF905将AM和DR置低;
i) nRF905将准备进入ShockBurst RX、ShockBurst TX或Powerdown模式。
3) 掉电模式
在掉电模式中,nRF905被止,电流消耗最小,典型值低于2.5uA。当进入这种模式时,nRF905是不活动的状态。这时候平均电流消耗最小,电池使用寿命最长。在掉电模式中,配置字的内容保持不变。
4) STANDBY模式
Standby模式在保持电流消耗最小的同时保证最短的ShockBurstRX、ShockBurstTX的启动时间。当进入这种模式时,一部分晶体振荡器是活动的。电流消耗取决于晶体振荡器频率,如:当频率为4MHZ时,IDD=12uA;当频率为20MHZ 时,IDD=46uA。如果uPCLK(Pin3)被使能,电流消耗将增加。并且取决于负载电容和频率。在此模式中,配置字的内容保持不变。
5) 器件配置
nRF905的所有配置都通过SPI接口进行。SPI接口由5个寄存器组成,一条SPI指令用来决定进行什么操作。SPI接口只有在掉电模式和Standby模式是激活的。
a) 状态寄存器(Status-Register):寄存器包含数据就绪DR和地址匹配AM状态。
b) RF配置寄存器(RF-Configuration Register):寄存器包含收发器的频率、输出功率等配置信息。
c) 发送地址(TX-Address):寄存器包含目标器件地址,字节长度由配置寄存器设置。
d) 发送有效数据(TX-Payload):寄存器包含发送的有效ShockBurst数据包数据,字节长度由配置寄存器设置。
e) 接收有效数据(TX-Payload):寄存器包含接收到的有效ShockBurst数据包数据,字节长度由配置寄存器设置。在寄存器中的有效数据由数据准备就绪DR指示。
6) SPI指令设置
用于SPI接口的有用命令指令见下表,当CSN为低时,SPI接口开始等待一条指令,任何一条新指令均由CSN的又高到低的转换开始。
表2-3 SPI串行接口指令设置
| 指令名称 | 指令格式 | 操作 |
| W_CONFIG (WC) | 0000AAAA | 写配置寄存器AAAA指出写操作的开始字节字节数量取决于AAAA指出的开始地址 |
| R_CONFIG (RC) | 0001AAAA | 读配置寄存器AAAA指出读操作的开始字节字节数量取决于AAAA指出的开始地址 |
| W_TX_PAYLOA D(WTP) | 00100000 | 写TX有效数据1-23字节写操作全部从字节0开始 |
| R_TX_PAYLOA D(RTP) | 00100001 | 读TX有效数据1-23字节读操作全部从字节0开始 |
| W_TX_ADDRES S(WTA) | 00100010 | 写TX有效数据1-4字节写操作全部从字节0开始 |
| R_TX_ADDRES S(RTA) | 00100011 | 读TX有效数据1-4字节读操作全部从字节0开始 |
| R_RX_PAYLOA D(RRP) | 00100100 | 读RX有效数据1-23字节读操作全部从字节0开始 |
| CHANNEL_CONFIG (CC) | 1000pphccccccccc | 快速设置配置寄存器中CH_NO HFREQ_PLL和PA_PWR的专用命令CH_NO=ccccccccc HFREQ_PLL=h PA_PWR=pp |
| 参数 | 位宽 | 说明 |
| CH_NO | 9 | 同HFREQ_PLL一起设置中心频率(默认值=180d) FRF=(422.4+CH-Nod/10)*(1+HFREQ-PLLd)MHZ |
| HFREQ_PLL | 1 | “0”_器件工作在433MHZ频段 “1”_器件工作在868/915MHZ频段 |
| PA_PWR | 2 | 输出功率(默认=00) “00” -10dBm “01” -2dBm “10” +6dBm “11” +10dBm |
| RX_RED_PWR | 1 | “0” _正常模式 “1” _低功耗模式 |
| AUTO_RETRAN | 1 | 重发数据 “0” _不重发数据 “1” _重发数据包 |
| RX_AWF | 3 | RX地址宽度(默认值=100) 001_1字节RX地址宽度 100_4字节RX地址宽度 |
| TX_AWF | 3 | TX地址宽度(默认值=100) 001_1字节TX地址宽度 100_4字节TX地址宽度 |
| RX_PW | 6 | RX接收有效数据宽度(默认值=100000) “000001”-1字节RX有效数据宽度 “000010”-2字节RX有效数据宽度 “100000”-32字节RX有效数据宽度 |
| TX_PW | 6 | TX接收有效数据宽度(默认值=100000) “000001”-1字节TX有效数据宽度 “000010”-2字节TX有效数据宽度 “100000”-32字节TX有效数据宽度 |
| RX_ADDRESS | 32 | RX地址 |
| UP_CLK_FREQ | 2 | “00” -4MHZ “01” -2MHZ “10” -1MHZ “11” 500KHZ |
| XOF | 3 | 晶体振荡频率 “000” _4MHZ “001” _8MHZ “010” _12MHZ “011” _16MHZ “100” _20MHZ |
| CRC_EN | 1 | “0” _不允许 “1” _允许 |
| CRC_MODE | 1 | “0” _8位CRC校验位 “1” _16位CRC校验位 |
| UP_CLK_EN | 1 | “0” _没有外部时钟 “1” _外部时钟信号使能 |
a) 模式控制接口:
该接口由 PWR 、TRX_CE、TX_EN组成控制由nRF905组成的高频头的四种工作模式:掉电和 SPI 编程模式;待机和SPI编程模式 ;发射模式;接收模式。
b) SPI接口:
SPI 接口由 CSN、SCK、MOSI以及MISO组成。在配置模式下单片机通过SPI接口配置高频率的工作参数;在发射/接收模式下单片机SPI接口发送和接收数据。
c) 状态输出接口:
提供载波检测输出CD,地址匹配输出AM,数据就绪输出DR。
8) NRF905的特点
a) 载波检测
当NRF905工作在接受模式时,如果有与器件被编程通道相同的载波出现,载波引脚(CD)被置高,这一特征对于避免工作在相同频率的不同发射机的数据碰撞非常有效,任何时候当器件准备发射送数据时,应先进入接收模式,判断是否希望的通道可以输出数据,这就是发射前先监听的协议。
b) 地址匹配
当NRF905工作在接受模式时,引入的数据包的地址与器件自身地址相同时,地址匹配引脚(AM)被置高,使用这个引脚控制被指示在数据准备就绪(DR)信号置高前,器件正在接收数据,如果数据准备就绪(DR)信号没有置高,例如CRC校验错误,地址匹配引脚(AM)在数据包接收结束时复位置低,这一特征对MCU特别有用。如果地址匹配引脚(AM)被置高,MCU可以决定等待,观察如果数据准备就绪(DR)信号被没有置高,说明一个有效地数据包已经接收,或者放弃一个可能已经接收受的有效数据包并改变工作模式。
c) 数据准备就绪
数据准备就绪(DR)信号使最大限度地降低软件编程的复杂性成为可能。
在发送模式时,一个完整的数据包发送结束时DR置高,告诉MCU NRF905已经准备好新动作,DR信号在数据包传输开始时或转换为其他模式,如接收模式或Standby模式时复位置低。
在自动重发模式时,DR信号在前导码的开始时置高,在前导码的结束开始时置低,数据准备就绪(DR)信号在每次数据包传输的开始时产生脉冲。
在接收模式时,DR信号在接收有效数据包,如:有效地址,有效地数据长度和CRC时置高,然后MCU可以通过SPI接口读取数据,当数据缓冲区中的数据被读空时或者器件转换到发送模式时,DR信号置低。
2.4 本章小结
本章主要对无线通信技术作了介绍,对比了几种通信技术的,最终选择了低功率短距离无线通信, 介绍了对于无线数据采集系统应该考虑的几方面,以及无线传输模块nRF905的选择。同时对无线收发模块进行了介绍,着重介绍了NRF905的工作模式。
3无线数据采集系统(上位机部分)的总体描述
3.1 单片机ATC51主控单元和外围模块
ATC51单片机为主控单元,通过键盘控制模块发送命令使下位机进行温度采集,由下位机的NRF905发送数据,上位机的NRF905接受数据,完成数据的无线发送。接收模块将接收的温度数据再经SPI口送给单片机,进行数码管显示。
3.2 无线传输收发模块
通过 NRF905 模块接收发送端发出的温度信息,当数据接收完成后产生接收完成中断信号,单片机确认有中断信息后读取NRF905接收缓冲区中的数据,根据数据包协议将接收到的信息通过数码管动态扫描方式显示当前温度,同时也将温度信息通过 RS232串口上传给PC机。
3.3 系统方案论证
对于基于短距离RF通讯技术的无线数据采集系统而言,主要由温度信号采集模块、无线传输模块、单片机主控制模块及其外围模块四部分组成,如图3-1所示。
图 3-1 系统结构总框图
对于基于短距离RF通讯技术的无线数据采集系统设计(上位机部分)而言,主要由单片机主控制单元、无线传输模块、数码显示模块、键盘模块和RS232串口模块五大部分组成。系统上位机通过键盘控制模块发送命令给下位机,下位机执行温度采集后将数据再发送给上位机,收发模块NRF905接收温度数据,通过SPI接口将数据传给单片机,进行数码显示,同时将数据上传给PC机。
图 3-2 上位机系统结构框图
3.4 本章小结
本章主要对无线数据采集系统(上位机部分)进行了总体描述,包括无线传输收发模块、主控单片机以及相关外围模块的上位机的具体功能。并对整个系统的结构进行了介绍,包括单片机主控单元、无线收发模块、数码管显示模块、键盘控制模块、存储模块的上位机结构。
4系统硬件设计
4.1单片机硬件电路设计
图 4-1 ATC51电路图
单片机ATC51为主控单元,P1口直接和无线模块NRF905相连,P3.3和P3.2分别和NRF905的DR及TRX_CE相连,实现单片机与NRF905的数据通信,P2口的低四位控制数码管的位选,P0口为段选。
4.2复位电路
1图4 -2 复位电路图
图中RST接单片机的复位引脚RST,形成复位电路。平时RST端口是高电平,当按键按下后,RST端口为低电平,实现低电平复位。
4.3 无线收发模块
图 4-3 无线收发模块电路图
无线收发模块的各引脚直接和单片机相连,在单片机的控制下,通过SPI接口完成温度数据的读入读出,发送模块和接收模块的NRF905完成数据的无线传输。
4.4 电源模块
图 4-4 电源模块电路图
因为NRF905的工作电源电压范围是1.9—3.6V,超出这个工作电压范围无线模块就可能被烧坏,所以为了让NRF905正常工作,采用1117电压转换芯片将电源电压转换为3.3V。
4.5 数码管显示模块
图 4-5 数码管显示模块电路图
显示电路采用动态显示方法,可以节约硬件资源,降低系统的设计成本。使用P2口低4位作为位选码控制端,P0作为段选码控制端。
4.6键盘控制模块
图 4-6 键盘控制模块电路图
键盘是单片机应用系统中是一个很关键的部件,它能实现向单片机输入数据,传送命令等功能,是人工干预单片机的主要手段。
本次设计采用非编码式键盘中的式键盘,式键盘中,每个键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其它I/O口线上的状态。式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,适合在按键数量较少的情况。
4.7存储模块
图 4-7 外接存储模块电路图
AT93C46是Atmel公司生产的低功耗、低电压、电可擦除、可编程只读存储器,采用CMOS工艺技术制造并带有3线串行接口,其容量为1kB,可重复写100万次,数据可保存100年以上。
CS:片选信号。高电平有效,低电平时进入等待模式。在连续的指令之间,CS信号必须持续至少250ns的低电平,才能保证芯片正常工作。
SCK:串行时钟信号。在SCK的上升沿,操作码、地址和数据位进入器件或从器件输出。在发送序列时,SCK最好不停止,以防止读/写数据的错误。
DI:串行数据输入。可在SCK的同步下输入开始位、操作码、地址位和数据位。
DO:串行数据输出。在SCK同步下读周期时,用于输出数据;而在地址擦/写周期或芯片擦/写周期时,该端用于提供忙/闲信息。
VSS:接地。
VCC:接+5V电源。
ORG:存贮器构造配置端。该端接VCC或悬空时,输出为16位;接GND时,输出为8位。
DC:空脚,不连接。
表4-1 AT93C46/56/66系统指令
| 指令 | 起始位 | 操作码 | 地址位 | 数据位 | 备注 |
| READ | 1 | 10 | AnAo AnAo | 空 | 从指定的单元读物 |
| EWEN | 1 | 00 | 11xxxxx 11xxxxx | 空 | 允许写指令 |
| ERASE | 1 | 11 | An~Ao An-1~Ao | 空 | 擦除指定单元 |
| WRITE | 1 | 01 | An~Ao An-1~Ao | D7~D0 D15~D0 | 写入存储单元 |
| ERAL | 1 | 00 | 10xxxxx 10xxxx | 空 | 擦除存储器所有单元 |
| WRAL | 1 | 00 | 01xxxx 01xxxx | D7~D0 D15~D0 | 写入存储器所有单元 |
| EWDS | 1 | 00 | 00xxxxx 00xxxx | 空 | 禁止写指令 |
图 4-8 串口模块电路图
该串口我选用了标准的RS-232接口,它是电平与TTL电平转换驱动电路。常用的芯片是MAX232,MAX232的优点是:
(1)一片芯片可以完成发送转换和接受转换的双重功能;
(2)单一电源+5V供电。
4.9 系统总体电路图
以上分别介绍了系统的各个模块电路组成,整体电路图见附图。
4.10 本章小结
本章主要讲述了系统的硬件设计,给出了系统设计的结构图,从系统各组成部分分别进行了设计。本系统主要由单片机主控单元、无线收发模块、电源转换模块、数码管显示模块、键盘控制模块、外接存储模块和串口模块构成。
5 系统软件设计
编程时采用模块化的设计思想,系统中各主要的模块均编写成的函数,在主函数中加以调用,程序主要由以下几个功能模块构成:上电初始化程序、数据发送接受程序、数码显示程序。
5.1系统所使用的通信协议
通信协议是通信双方为实现信息交换而制定的规则。由于主接收器与数据终端之间的通信可能会受到其它数据终端或外界环境的干扰而发生错误,因此,需要通信协议来保证数据传输的可靠性。
本系统中,为了保证数据传输的可靠性,无线通信协议还要考虑通信双方的检错、纠错问题。数据发送端在打包发送数据时,在无线数据包中添加校验字节,本文采用CRC校验。接收端在接收到数据包后检验校验字节,若校验不正确,请求发送端重发;若重发达到规定的次数或出现通信超时,放弃当前采集请求。
nRF905只有一种协议格式,其中的前缀也就是数据头,设备地址包括本机的地址和主接收器的地址,CRC校验可进行选8位或16位。
采集端和接收端在上电后首先调用初始化程序,完成无线收发频率、工作模式、发射速率、内部寄存器的初始化配置;无线收发程序负责接收和发送经过打包后的数据;数据打包程序将采集数据根据通信协议加上帧头、地址、CRC校验字节,形成完整的数据包;数据拆包程序根据通信协议将接收到的数据包去掉帧头、地址信息、取出其中的有用数据,并检验数据包中的CRC字节以检验接收到的数据的正确性;数据处理程序对接收到的有效数据进行简单的计算处理后将其通过串口发送到计算机,进一步的分析和处理。在实际应用时,当上电后该系统处于等待状态,当接到上位机的启动命令后,进行数据采集,并把数据发送给上位机;在测量任务完成后,上位机向数据采集系统发送结束指令;当系统接收到上位机的结束指令后,系统进入休眠状态停止采集数据。
5.2点对点无线通信的实现
5.2.1 SPI接口
nRF905利用SPI口实现与MCU的双向通讯。nRF905的SPI总线包括4个引脚:CSN (SPI使能)、SCK(SPI时钟)、MISO (主入从出)和MOSI(主出从入)。其中CSN可以接到一个GPIO端口控制芯片工作,而其他三个脚则连接到主控MCU的SPI接口上。主控MCU可以使用GPIO端口控制nRF905的3根控制线,控制低功耗的PWR_UP、正常工作的TX_EN、选择发送还是接收方式的TRX_CE。nRF905有两种节能模式和两种工作模式, 分别为掉电模式、待机模式、ShockBurst接收模式和Shock Burst发送模式。这几种模式由主控MCU通过控制nRF905的3个引脚PWR_UP、TRX_CE和TX_ EN的高低电平来决定。nRF905有3个引脚用于状态输出,分别是:CD(载波检测)、AM(地址匹配)和DR(数据就绪),均为高电平有效。nRF905在处于接收模式时,若检测到接收频率段的载波,就置CD为高。接着检测载波数据中的地址字节,若与本身已配置的接收地址相同,则置AM为高;若检测到接收数据中的CRC校验正确,则存储有效数据字节,置DR为高。
MCU通过SPI总线配置nRF905的内部寄存器和收发数据。这里nRF905为从机,其SPI的时钟范围很宽,可为1Hz~10MHz,因此MCU在写控制程序时不必苛求时间的准确度。SPI总线的每次操作都必须在使能引脚CSN的下降沿开始,CSN低电平有效,总线上的数据在时钟的上升沿有效。MCU对SPI总线进行读操作时,先把CSN置低,然后在MOSI数据线上输出一个表示读命令的字节,与此同时,nRF905会在MISO数据线上输出一个字节表示状态信息的数据,随后输出一个地址字节,后面跟随有效数据。在进行写操作时比较简单,MCU先把CSN拉低,然后在MOSI线上输出写命令字节和数据字节即可。
/*************************************************************************************
SPI读函数*************************************************************************************/
unsigned char SpiRead(void)
{
unsigned char j;
for (j=0;j<8;j++)
{
DATA_BUF=DATA_BUF<<1;
SCK=1;
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
SCK=0;
}
return DATA_BUF;
}
/*************************************************************************************
SPI写函数*************************************************************************************/
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA7) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF=DATA_BUF<<1;
SCK=0;
}
}
5.2.2 数据收发过程
在nRF905正常工作前,必须由MCU根据需要写好配置寄存器。发送数据时,先通过MCU把nRF905置于待机模式(PWR_UP置为高、TRX_CE置为低),然后通过SPI总线把发送地址和待发送的数据都写入相应的寄存器中,之后把nRF905置于发送模式(PWR_UP、TRX_CE和TX_EN全部置高),配置成功后数据就会自动发送出去。若射频配置寄存器中的自动重发位(AUTO_RETRAN)设为有效,数据包就会被重复发出,直到MCU拉低TRX_CE退出发送模式为止。接收数据时,MCU先在nRF905的待机状态中写好射频配置寄存器中的接收地址,然后将nRF905置于接收模式(PWR_UP和TRX_CE置高、TX_EN置低),nRF905就会自动接收空中的载波。当收到有效数据(地址匹配且校验正确)时,DR引脚会自动置高,MCU在检测到这个信号后,可以将nRF905置为待机模式,然后通过SPI总线从接收数据寄存器中读出有效数据。
5.3通信协议格式
(1) 代码系统
消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII 方式传送更多的数据。
(2)从机地址可由拨码开关来进行设定,范围:0~255,最多可连接256个从系统。
(3)协议中的功能域代码:
| 功能代码 | 含义 | 功能 |
| 0xEA | 读数据寄存器 | 读采集的数据 |
| 0xEB | 回路测试 | 测试回路 |
数据信息以固定的格式传输,包含一字节地址域,一字节功能码域,接着是N字节数据,本规定N=8,一次传送字节信息,包含4字节的温度信息,4字节的时间信息。不满8字节时,后面补零。
一帧信息的标准结构如下:
| 地址域 | 功能码域 | 数据域 |
| 8位 | 8位 | N*8位 |
(5)回路测试,功能码0xEB。如果从机应答,则说明通信建立成功,可以正常接收数据。
| 状态 | 发送 | 接收 | ||
| 主机 | 0xEB | 从机忙 | 无 | |
| 从机闲 | 0xEB | |||
| 从机 | 忙 | 不响应 | 0xEB | |
| 闲 | 0xEB | 0xEB | ||
| 发送 | 接收 | |
| 主机 | 0xEA | 温度数据 |
| 从机 | 温度数据 | 0xEA |
无线接收端由单片ATC51、射频nRF905、数码管温度显示、控制键盘、这几个主要模块组成。其工作的基本流程为:通过nRF905模块接收发送端发出的温度信息,当数据接收完成后产生接收完成中断信号,单片机确认有中断信号后读取nRF905接收缓冲区中的数据,根据数据包协议将接收到的信息通过数码管动态扫描方式显示当前温度。如下图6-1为接收端的程序流程图。
图5-1 数据采集系统上位机主程序流程图
5.5无线接收端NRF905工作流程
典型ShockBurst RX模式
(1) 通过设置TRX_CE高,TX_EN低来选择ShockBurst模式;
(2) 650us以后,nRF905测空中的信息;
(3) 当nRF905发现和接收频率相同的载波时,载波检测CD被置高;
(4) 当nRF905接收到有效的地址时,地址匹配AM被置高;
(5) 当nRF905接收到有效的数据包(CRC校验正确)时,nRF905去掉前导、地址和CRC位,数据准备就绪(DR)被置高;
(6) MCU设置TRX_CE低,进入standby模式低电流模式;
(7) MCU可以以合适的速率通过SPI接口读出有效数据;
(8) 当所有的有效数据被读出后,nRF905将AM和DR置低;
(9) nRF905将准备进入ShockBurst RX、ShockBurst TX或Powerdown模式。
无线接收程序流程图5-2如下所示:
图 5-2 无线接收流程图
/*************************************************************************************
Nrf905接收数据函数*************************************************************************************/
void RX(void)
{
SetRxMode(); // Set nRF905 in Rx mode
while (CheckDR()==0);
Delay(10);
RxPacket();
if(TxRxBuf[0]==0x29)
{
P0= seg[3];
led0=0;
led1=0;
led2=0;
led3=0;
}
if(TxRxBuf[0]==0x30)
{
P0= seg[4];
led0=0;
led1=0;
led2=0;
led3=0;
}
}
5.6 LED驱动子程序的设计
在无线测温系统中,采用了4位数码管动态扫描,它将4个数码管的段线相应地并接到一起,并接到ATC51的P0口,由P0口控制段选的输出,而各位数码管的共阳极由ATC51得P2口的低四位控制位选,这样对于一组数码管动态扫描显示需要两组信号控制:一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是由位选输出口输出的控制信号,用来选择第几位数码管工作,称为位选。
数码管不同位显示的时间间隔,决定了显示效果。若显示的时间间隔太长,则显示的亮度会亮一些,若显示的时间间隔太短,则显示的亮度会暗一些。当若时间间隔太,数码管会出现闪烁现象。所以在进行程序设计的时候应该同时考虑到数码管的亮度又应该让数码管不闪烁。
理论上每一位显示后都应该有一段延时,但在实时操作系统中这种做法是不可取的,因为这样太浪费CPU的时间,为了节省机时,必须优化程序,因为主程序中含有多个子程序,所以在调用MNLED的显示子程序,每次都显示一位,然后继续调用其他子程序,用执行其他子程序的时间来代替数码管的延时,这样节省了机时。
在程序的编写中是这样实现的,给扫描程序置一个扫描标志位ScanBitCnt,每次进入MNLED的显示子程序,都要对扫描标志位ScanBitCnt进行判断,不同的值进入不同的扫描位程序,再此将段选码送给P0口,将位选码送给位选,从而完成一位数码管的显示,然后跳出子程序,进而执行其他子程序,执行其他子程序的时间就取代了数码管的延时时间,节省了机时。
/*************************************************************************************
显示子函数*************************************************************************************/
void Display(void)
{
if(DisplayFlag)
{
P0=ledcode[temp_1];
P2^0=1;
P2^1=0;
P2^2=0;
P2^3=0;
delay();
P0=ledcode[temp_2];
P2^0=0;
P2^1=1;
P2^2=0;
P2^3=0;
delay();
P0=ledcode[temp_3];
P2^0=0;
P2^1=0;
P2^2=1;
P2^3=0;
delay();
P0=ledcode[temp_4];
P2^0=0;
P2^1=0;
P2^2=0;
P2^3=1;
}
}
5.7存储模块程序的设计
存储模块采用at93c46,主要实现温度数据的保存,以下为存储相关子程序。
/*************************************************************************************
at93c46写子程序
*************************************************************************************/
void AT93C_write(uchar Address,uchar Data)
{ uchar i,k=0x05; //写入起始位和操作码应该是101的,在这里进行反写并且在高位补0为0000 0101
AT93C_xin=0; Address<<=1; //因为AT93C46地址是从高位开始发送的,而且只是发送7位地址
CS=0;CS1=0;CS2=0; SCL=0; //方便在写入时使用DI=BIT(K&0X01)
switch (num0_2)
{ case 0:CS=1;break; case 1:CS1=1;break; case 2:CS2=1;break; }
for(i=0;i<3;i++)
{ _nop_();
DI=(bit)(k&0x01);_nop_();
SCL=1;_nop_();_nop_();
SCL=0;k>>=1;_nop_();
}
for (i=0;i<7;i++)
{ _nop_();
if( (Address&0x80)==0x00)
DI=0;
else DI=1;
_nop_();
SCL=1;_nop_();_nop_();
SCL=0;Address<<=1; _nop_();
}
for (i=0;i<8;i++)
{ _nop_();
if( (Data&0x80)==0x00)
DI=0;
else DI=1;
_nop_();
SCL=1;_nop_();_nop_();SCL=0;
Data<<=1;_nop_();
}
CS=0;CS1=0;CS2=0; //可以在这里在CS为电平时,添加几个时钟信号,避免最后面的时钟信号丢失了
DelayMs(1); //CS要保持至少250NS的低电平 可能晶震会提高 所以多延时一些时间
}
/*************************************************************************************
at93c46读子程序
*************************************************************************************/
AT93C_read(uchar Address)
{ uchar i,temp=0x00,k=0x03; //写入起始位和操作码应该是101的,在这里进行反写并且在高位补0为0000 0101
Address<<=1;
CS=0;CS1=0;CS2=0; SCL=0;
switch (num0_2)
{ case 0:CS=1;break; case 1:CS1=1;break; case 2:CS2=1;break; }
for(i=0;i<3;i++)
{ _nop_();
DI=(bit)(k&0x01);
_nop_();
SCL=1;_nop_();_nop_();
SCL=0;k>>=1;_nop_();
}
for (i=0;i<7;i++)
{ _nop_();
if( (Address&0x80)==0x00)
DI=0;
else DI=1;
_nop_();
SCL=1;_nop_();_nop_();
SCL=0;Address<<=1; _nop_();
}
_nop_(); //在这里之前会产生一个虚拟的低电平 需要延时避开
for (i=0;i<8;i++)
{ temp<<=1;
SCL=1;_nop_();_nop_();SCL=0;_nop_();
if (DO==0)
temp=temp&0xfe;
else temp=temp|0x01;
_nop_();
}
CS=0;CS1=0;CS2=0; //可以在这里在CS为电平时,添加几个时钟信号,避免最后面的时钟信号丢失了
DelayMs(1); //CS要保持至少250NS的低电平 可能晶震会提高 所以多延时一些时间
return(temp);
}
5.8本章小结
本章主要阐述了对系统软件总体架构的设计,包括通信协议、无线接收端系统程序、LED驱动子程序等等的设计。
6总结与展望
6.1 课题总结
经过一个学期时间的分析、研究、设计,本次毕业设计课题最终实现了一套比较完整的通过无线方式实现数据采集系统(上位机部分)。在明确了系统所要实现数据采集与无线传输方案的功能后,设计了系统的总体架构,然后详尽地阐述了系统的硬件电路结构和完成各项功能相关的软件设计。本系统是通过单片机控制无线传输来实现对周围环境的数据传输到上位机上来显示数据依次实现远程监测。它是以ATC51单片机为控制单元,以无线收发模块NRF905完成数据的无线传输,用数码管进行显示,实现数据的无线传输、显示,并将上位机用串口连接到PC机上。
6.2 展望
任何方案都有一个不断改进和完善的过程,本课题没有涉及到PC机的界面设计,所以以后会在这方面进行改进,从而使本系统成为一套具有PC机界面控制无线数据采集的完整系统。
致 谢
本论文设计是在张玉杰老师的悉心指导和严格要求下完成的,他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,张老师都始终给予我细心的指导和不懈的支持。在此谨向张老师致以诚挚的谢意和崇高的敬意。
在临近毕业之际,我还要借此机会向在这四年中给予我诸多教诲和帮助的各位老师表示由衷的谢意,感谢他们四年来的辛勤栽培。各位任课老师认真负责,在他们的悉心帮助和支持下,我能够很好的掌握和运用专业知识,并在设计中得以体现,顺利完成毕业论文。同时,在论文写作过程中,我还参考了有关的书籍和论文,在这里一并向有关的作者表示谢意。
感谢所有和我在一起做毕业设计的同学,感谢他们的指点与帮助。在毕业设计的这段时间里,他们给了我很多的启发,提出了很多宝贵的意见,对于他们帮助和支持,在此我表示深深地感谢!
参 考 文 献
[1] 张玉杰.单片机原理与应用技术[M].北京:北京航空航天大学出版社,2007
[2] 梅丽凤.单片机原理及接口技术(第三版)[M].北京:清华大学出版社,2009
[3] 蔡型,张思全.短距离无线通信技术综述[J].现代电子技术,2004,(3):65-67.
[4] 赏星辉.射频芯片nRF905在无线测温中的应用[J].机电工程,2005,22(10):10-22
[5] 王浩鸣.常用无线数据通讯技术比较[J].计算机与现代化.2005. 9
[6] 张海滨,郑维智.短距离无线通信在控制中的应用[J].计算机信息,2004, 11:129-130
[7] 李武华,汪飞.无线收发模块在智能家庭网络中的应用[J].今日电子,6,2002:7-8
[8] 黄智伟.无线数字收发电路设计—电路应用实例[M].北京:电子工业出版社,2003.5
[9] 李春杰,刘瑞霞.基于一种新型嵌入式系统级芯片的无线数据采集系统的设计[J].现代电子技术,2006,(3):36-35.
[10] 赖宜章,刘冰茹.实验室温度湿度测量控制系统[J].广东:广东自动化与信息工程,1999,2:31~33
[11] 杨朝晖,张联超,杨长业.温度、湿度自动控制系统是设计方案[J].气象水文海洋仪器,2005,2: 51~55
[12] 胡汉才编著.单片机原理及接口技术(第二版)[M].北京:清华大学出版社
[13] 高鹏 安涛等编著,Protel入门与提高[M].人民邮电出版社,2001年6月
[14] 史贺勇.图书保管的温湿度控制系统[J].仪器仪表用户,2004,6:55~56
[15] 高芳,陆原.温度、湿度实时监测与报警系统的设计与实现[J].河北:河北大学信息学院.
附录Ⅰ 硬件电路图
附录Ⅱ 相关程序
#include #include #include #include //---------------------------------------------------------------------------------------------------------------- #define uint unsigned int #define uchar unsigned char //---------------------------------------------------------------------------------------------------------------- #define BYTE_BIT0 0x01 #define BYTE_BIT1 0x02 #define BYTE_BIT2 0x04 #define BYTE_BIT3 0x08 #define BYTE_BIT4 0x10 #define BYTE_BIT5 0x20 #define BYTE_BIT6 0x40 #define BYTE_BIT7 0x80 //---------------------------------------------------------------------------------------------------------------- bdata unsigned char DATA_BUF; #define DATA7 ((DATA_BUF&BYTE_BIT7) != 0) #define DATA0 ((DATA_BUF&BYTE_BIT0) != 0) sbit flag =DATA_BUF^7; sbit flag1 =DATA_BUF^0; //---------------------------------------------------发送数据缓冲区------------------------------------------------- #define TxRxBuf_Len 4 unsigned char TxRxBuf[TxRxBuf_Len]= { 0x29,0x30,0x31,0x32, }; //----------------------------------------------NRF905控制IO------------------------------------------------------ sbit TXEN=P1^0; sbit TRX_CE=P3^2; sbit PWR=P1^1; //----------------------------------------------NRF905 SPI接口--------------------------------------------------- sbit MISO=P1^6; sbit MOSI=P1^5; sbit SCK=P1^7; sbit CSN=P1^3; //----------------------------------------nrf905状态标志--------------------------------------------------------- sbit AM=P1^4; sbit DR=P3^3; sbit CD=P1^2; //--------------------------------------------------------------------------------------------------------------- sbit led3=P2^0; sbit led2=P2^1; sbit led1=P2^2; sbit led0=P2^3; //-------------------------------------------------------------------------------------------------------------- sbit KEY0=P3^6; sbit KEY1=P3^7; //-------------------------------------------------------------------------------- sbit BELL=P3^4; //----------------------------------------------------------------------------------------------------------------- uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码 //-------------------------------------------------------nrf905控制指令------------------------------------------- #define WC 0x00 #define RC 0x10 #define WTP 0x20 #define RTP 0x21 #define WTA 0x22 #define RTA 0x23 #define RRP 0x24 //------------------------------------------------NRF905寄存器配置------------------------------------------------ unsigned char idata RFConf[11]= { 0x00, //配置命令// 0x4c, //CH_NO,配置频段在430MHZ 0x0c, //输出功率为10db,不重发,节电为正常模式 0x44, //地址宽度设置,为4字节 0x04,0x04, //接收发送有效数据长度为32字节 0xCC,0xCC,0xCC,0xCC, //接收地址 0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振 }; unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc};//发送地址 char tf; //------------------------------------------------延时------------------------------------------------------------ static void Delay(uchar n) { uint i; while(n--) //for(i=0;i<80;i++); for(i=0;i<80;i++); } //---------------------------------------------------SPI读函数----------------------------------------------------- unsigned char SpiRead(void) { unsigned char j; for (j=0;j<8;j++) { DATA_BUF=DATA_BUF<<1; SCK=1; if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节 { DATA_BUF|=BYTE_BIT0; } else { DATA_BUF&=~BYTE_BIT0; } SCK=0; } return DATA_BUF; } //-------------------------------------------------SPI写函数---------------------------------------------------------- void SpiWrite(unsigned char send) { unsigned char i; DATA_BUF=send; for (i=0;i<8;i++) { if (DATA7) //总是发送最高位 { MOSI=1; } else { MOSI=0; } SCK=1; DATA_BUF=DATA_BUF<<1; SCK=0; } } //------------------------------------------------------初始化nRF905--------------------------------------------- void nRF905Init(void) { CSN=1; // Spi disable SCK=0; // Spi clock line init low DR=0; // Init DR for input AM=0; // Init AM for input CD=0; // Init CD for input PWR=1; // nRF905 power on TRX_CE=0; // Set nRF905 in standby mode TXEN=0; // set radio in Rx mode } //-----------------------------------------------------初始化寄存器----------------------------------------------- void Config905(void) { uchar i; CSN=0; // Spi enable for write a spi command //SpiWrite(WC); // Write config command写放配置命令 for (i=0;i<11;i++) // Write configration words 写放配置字 { SpiWrite(RFConf[i]); } CSN=1; // Disable Spi } //-----------------------------------------------------发送数据打包--------------------------------------------------- void TxPacket(uchar *TxRxBuf) { uchar i; //Config905(); CSN=0; SpiWrite(WTP); // Write payload command for (i=0;i<4;i++) { SpiWrite(TxRxBuf[i]); // Write 32 bytes Tx data }// Spi enable for write a spi command CSN=1; Delay(1); // Spi disable CSN=0; // Spi enable for write a spi command SpiWrite(WTA); // Write address command for (i=0;i<4;i++) // Write 4 bytes address { SpiWrite(TxAddress[i]); } CSN=1; // Spi disable TRX_CE=1; // Set TRX_CE high,start Tx data transmission Delay(1); // while (DR!=1); TRX_CE=0; // Set TRX_CE low } //----------------------------------------------------------设置发送状态--------------------------------------------- void SetTxMode(void) { TRX_CE=0; TXEN=1; Delay(1); // delay for mode change(>=650us) } //-----------------------------------------------设置发送状态--------------------------------------------------- void SetRxMode(void) { TXEN=0; TRX_CE=1; Delay(1); // delay for mode change(>=650us) } //-------------------------------------------------判断数据接收状态----------------------------------------------------- unsigned char CheckDR(void) //检查是否有新数据传入 Data Ready { if (DR=1&&TRX_CE==1 && TXEN==0) { // Delay(50) ; return 1; } else { return 0; } } //----------------------------------------------读NRF905接收数据---------------------------------------------------- void RxPacket(void) { uchar i; Delay(1); // TRX_CE=0; // Set nRF905 in standby mode Delay(100); TRX_CE=0; CSN=0; // Spi enable for write a spi command Delay(1); SpiWrite(RRP); for (i = 0 ;i < 4 ;i++) { TxRxBuf[i]=SpiRead(); // Read data and save to buffer } CSN=1; Delay(10); TRX_CE=1; } //--------------------------------------------------------数据接收------------------------------------------------ void RX(void) { SetRxMode(); // Set nRF905 in Rx mode while (CheckDR()==0); Delay(10); RxPacket(); if(TxRxBuf[0]==0x29) { P0= seg[3]; led0=0; led1=0; led2=0; led3=0; } if(TxRxBuf[0]==0x30) { P0= seg[4]; led0=0; led1=0; led2=0; led3=0; } } //----------------------------------------------------------------------------------------------------------------- void main(void) { nRF905Init(); Config905(); P0= seg[0]; led0=0; led1=0; led2=0; led3=0; while(1) { RX(); if(KEY0 ==0 ) { tf = 1 ; TxRxBuf[0]=0x29; //TxRxBuf[1]=0x30; //TxRxBuf[2]=0x31; //TxRxBuf[3]=0x32; P0= seg[1]; led0=0; led1=0; led2=0; led3=0; } if(KEY1 ==0 ) { tf = 1 ; TxRxBuf[0]=0x30; //TxRxBuf[1]=0x31; //TxRxBuf[2]=0x32; //TxRxBuf[3]=0x29; P0= seg[2]; led0=0; led1=0; led2=0; led3=0; } if (tf==1) { SetTxMode();// Set nRF905 in Tx mode TxAddress[0]=0x00; TxAddress[1]=0x00; TxAddress[2]=0x00; TxAddress[3]=0x01; TxPacket(TxRxBuf);// Send data by nRF905 TxAddress[0]=0xCC; TxAddress[1]=0xCC; TxAddress[2]=0xCC; TxAddress[3]=0xCC; tf = 0; } } }下载本文