基于单片机的二氧化碳浓度器设计_毕业设计.doc_第1页
基于单片机的二氧化碳浓度器设计_毕业设计.doc_第2页
基于单片机的二氧化碳浓度器设计_毕业设计.doc_第3页
基于单片机的二氧化碳浓度器设计_毕业设计.doc_第4页
基于单片机的二氧化碳浓度器设计_毕业设计.doc_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

本设计使用stc89c52单片机作为主控制模块,利用简单的外围电路来驱动1-wire总线,利用1-wire总线协议,实现了多点温度和湿度的精确测量。利用stc89c52单片机本身强大的功能和内部ram资源,可以很方便的实现单片机与pc机间的数据传输,并能利用软件方便的逻辑判断实现了1-wire总线的rom搜索,实现了测温器件18b20的枚举,实现了无人干预的测温点的动态裁剪,所以本设计具有很强的现实应用性。另外,本系统的湿度检测没有完成。本文从1-wire总线的原理入手,详细阐述了1-wire总线的rom搜索过程,以及硬件电路的设计、计算和软件的算法。关键词:ds18b20;单片机mcu;串行传输serial data transfer;单总线1-wire interface 第1章 绪 论1.1选题背景防潮、防霉、防腐、防爆是粮库日常工作的重要内容,是衡量粮库管理质量的重要指标。它直接影响到储备物资的寿命和工作可靠性。为保证日常工作的顺利进行,首要问题是加强仓库内温度的监测工作,因为温度的升高,就意味着粮库内的有氧呼吸的加强,就意味着马上就要发生腐烂霉变。因此我们需要一种造价低廉、使用方便且测量准确的温度测量仪。在我们的印象中,温度的测量不外乎由传感器、放大器、数码显示、报警器等单元组成。但是通过实际的考察,现实的系统根本不是这个样子:由于粮食要定期的通过熏蒸来除虫、防鼠,熏蒸药剂具有高毒性,高腐蚀性,人员根本不能随意接触到仓内设备,更不要说通过数码管的显示和报警器来及时发现温度的异常变化,同时出于防爆的要求,在仓库内部的系统,是完全密封的,并被充入低氧高氮的气体,平时人员根本不能及时进入。因此现在的监控系统都是由计算机监控,采用专用组态软件、单片机及数字传感器组成的,具有500-1000个测温点的,网络化的数字式温度检测的系统。下图展示了一种可能的结构图1.1现场采集站通过一线牵采集模块,对粮仓的温度进行测量采集,每个粮仓约有200点模拟量输入(温度)并根据粮食的情况对现场进行湿度检测。现场控制站现场控制站可用西门子plc控制现场输送机、提升机、电动闸门、通风机的启动运行,以及报警等功能的反馈信号,实现自动化控制。上位机上位机运行组态通用工业过程监控软件,对现场的设备进行监控、并对仓库温湿度进行巡回检测。并生成动态画面、报表、报警、曲线等数据管理功能。 这就要求我们必须设计一种高可靠,高一致性,基本免维护,可自由增减测温点,并具有和计算机联网交换数据的能力的测温组件。1.2设计过程及工艺要求根据实际的需求,我们提出了测温组件的基本功能,需要说明的是,在这里你看不到传统的温度显示功能,因为实际上工作人员根本不可能到现场去记录温度的显示。同时增加了组件的测温点免维护自由增减功能,以适应系统的规模的自由裁剪。1.2.1基本功能检测温度测温点免维护自由增减过限指示与计算机通讯1.2.2主要技术参数 温度检测范围 : -40-+60测量精度: 0.5报警方式:闪动的led指示灯通讯方式:rs232 9600,n,8,1第2章 系统总体设计本设计是以stc89c52为基本系统核心的一套检测系统,其中包括、单片机、复位电路、温度检测、过限指示、通讯接口、系统软件等部分的设计。图2.1 系统总体框图2.1温度传感器的选择方案一:采用热电阻温度传感器。热电阻是利用导体的电阻随温度变化的特性制成的测温元件。现应用较多的有铂、铜、镍等热电阻。其主要的特点为精度高、测量范围大、便于远距离测量。铂的物理、化学性能极稳定,耐氧化能力强,易提纯,复制性好,工业性好,电阻率较高,因此,铂电阻用于工业检测中高精密测温和温度标准。缺点是价格贵,温度系数小,受到磁场影响大,在还原介质中易被玷污变脆。按iec标准测温范围-200650,百度电阻比w(100)=1.3850时,r0为100和10,其允许的测量误差a级为(0.15+0.002 |t|),b级为(0.3+0.005 |t|)。铜电阻的温度系数比铂电阻大,价格低,也易于提纯和加工;但其电阻率小,在腐蚀性介质中使用稳定性差。在工业中用于-50180测温。方案二:采用ad590。采用ad590,它的测温范围在-55+150之间,而且精度高。m档在测温范围内非线形误差为0.3。ad590可以承受44v正向电压和20v反向电压,因而器件反接也不会损坏。使用可靠。它只需直流电源就能工作,而且,无需进行线性校正,所以使用也非常方便,接口也很简单。作为电流输出型传感器的一个特点是,和电压输出型相比,它有很强的抗外界干扰能力。ad590的测量信号可远传百余米。综合比较方案一与方案二,方案二更为适合于本设计系统对于温度传感器的选择。方案三:采用ds18b20。ds18b20 数字温度传感器,测温范围 55125,固有测温分辨率0.5。具有独特的单线接口方式,ds18b20在与微处理器连接时仅需要一条口线即可实现微处理器与ds18b20的双向通讯。支持多点组网功能,多个ds18b20可以并联在唯一的三线上,实现多点测温。工作电源: 35v/dc。在使用中不需要任何外围元件;测量结果以912位数字量方式串行传送。综合比较方案二与方案三,方案三更为适合于本设计系统对于温度传感器的选择。2.2信号采集2.2.1 ds18b20基本知识 ds18b20数字温度计是dallas公司生产的1wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线上可以挂很多这样的数字温度计,十分方便。 2.2.2 ds18b20产品的特点 (1)、只要求一个端口即可实现通信。 (2)、在ds18b20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任何元器件即可实现测温。 (4)、测量温度范围在55。c到125。c之间。 (5)、数字温度计的分辨率用户可以从9位到12位选择。 (6)、内部有温度上、下限告警设置。 2.2.3 ds18b20的引脚介绍 to92封装的ds18b20引脚排列见图2.2,其引脚功能描述见表2.1。 图2.2 ds18b20引脚(底视图)表2.1ds18b20详细引脚功能描述序号名称引脚功能描述1gnd地信号2dq数据输入/输出引脚。开漏单总线接口引脚。既可以用在寄生电源下,也可以向器件提供电源。3vdd可选择的vdd引脚。当工作于寄生电源时,此引脚必须接地。2.3信号分析与处理由于ds18b20采用的是1wire总线协议方式,即在一根数据线实现数据的双向传输,而对stc89c52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对ds18b20芯片的访问。 由于ds18b20是在一根i/o线上读写数据,因此,对读写的数据位有着严格的时序要求。ds18b20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。2.3.1单总线的实现(1)ds18b20的复位时序 图2.3 ds18b20的复位时序 ds18b20的读时序对于ds18b20的读时序分为读0时序和读1时序两个过程。 ds18b20的读时序是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让ds18b20把数据传输到单总线上。ds18b20在完成一个读时序过程,至少需要60us才能完成。 图2.4 ds18b20的读时序(2)ds18b20的写时序 对于ds18b20的写时序仍然分为写0时序和写1时序两个过程。 对于ds18b20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证ds18b20能够在15us到45us之间能够正确采样io总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。 图2.5 ds18b20的写时序2.3.2 ds18b20的使用 ds18b20内部结构图2.6 ds18b20内部结构ds18b20测温原理如图2.7所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在55所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2.7中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。图2.7 ds18b20的测温原理ds18b20有4个主要的数据部件:(1)光刻rom中的64位序列号是出厂前被光刻好的,它可以看作是该ds18b20的地址序列码。64位光刻rom的排列是:开始8位(28h)是产品类型标号,接着的48位是该ds18b20自身的序列号,最后8位是前面56位的循环冗余校验码(crc=x8+x5+x4+1)。光刻rom的作用是使每一个ds18b20都各不相同,这样就可以实现一根总线上挂接多个ds18b20的目的。(2)ds18b20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625/lsb形式表达,其中s为符号位。图2.8 ds18b20温度值格式这是12位转化后得到的12位数据,存储在18b20的两个8比特的ram中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+125的数字输出为07d0h,+25.0625的数字输出为0191h,-25.0625的数字输出为ff6fh,-55的数字输出为fc90h。(3)ds18b20温度传感器的存储器ds18b20温度传感器的内部存储器包括一个高速暂存ram和一个非易失性的可电擦除的eepram,后者存放高温度和低温度触发器th、tl和结构寄存器。(4)配置寄存器该字节各位的意义如下:图2.9 配置寄存器 低五位一直都是1,tm是测试模式位,用于设置ds18b20在工作模式还是在测试模式。在ds18b20出厂时该位被设置为0,用户不要去改动。r1和r0用来设置分辨率,如下表所示:(ds18b20出厂时被设置为12位)图2.10 温度分辨率设置表(5)高速暂存存储器高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如图2.9所示。对应的温度计算:当符号位s=0时,直接将二进制位转换为十进制;当s=1时,先将补码变为原码,再计算十进制值。图2.10是对应的一部分温度值。图2.11 ds18b20暂存存储器分布根据ds18b20的通讯协议,主机(单片机)控制ds18b20完成温度转换必须经过三个步骤:每一次读写之前都要对ds18b20进行复位操作,复位成功后发送一条rom指令,最后发送ram指令,这样才能对ds18b20进行预定的操作。复位要求主cpu将数据线下拉500微秒,然后释放,当ds18b20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主cpu收到此信号表示复位成功。rom、ram指令如下图所示:图2.12 rom、ram指令表2.3.3 ds18b20的应用电路 ds18b20测温系统具有测温系统简单、测温精度高、连接方便、占用口线少等优点。下面就是ds18b20几个不同应用方式下的测温电路图:(1)ds18b20寄生电源供电方式电路图如下面图9所示,在寄生电源供电方式下,ds18b20从单线信号线上汲取能量:在信号线dq处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。独特的寄生电源方式有三个好处:1)进行远距离测温时,无需本地电源。2)可以在没有常规电源的条件下读取rom。3)电路更加简洁,仅用一根i/o口实现测温。 要想使ds18b20进行精确的温度转换,i/o线必须保证在温度转换期间提供足够的能量,由于每个ds18b20在温度转换期间工作电流达到1ma,当几个温度传感器挂在同一根i/o线上进行多点测温时,只靠4.7k上拉电阻就无法提供足够的能量,会造成无法转换温度或温度误差极大。因此,图9电路只适应于单一温度传感器测温情况下使用,不适宜采用电池供电系统中。并且工作电源vcc必须保证在5v,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。在制作中曾经就此电路做过实验,在实验中,降低电源电压vcc,当低于4.5v时,测出的温度值比实际的温度高,误差较大。当电源电压降为4v时,温度误差有3之多,这就应该是因为寄生电源汲取能量不够造成的吧,因此,在开发实际测温系统时不使用此电路。图2.13 ds18b20寄生电源供电方式电路图(2)ds18b20寄生电源强上拉供电方式电路图改进的寄生电源供电方式如下面图10所示,为了使ds18b20在动态转换周期中获得足够的电流供应,当进行温度转换或拷贝到e2存储器操作时,用mosfet把i/o线直接拉到vcc就可提供足够的电流,在发出任何涉及到拷贝到e2存储器或启动温度转换的指令后,必须在最多10s内把i/o线转换到强上拉状态。在强上拉方式下可以解决电流供应不走的问题,因此也适合于多点测温应用,缺点就是要多占用一根i/o口线进行强上拉切换。图2.14 ds18b20寄生电源强上拉供电方式电路图注意:在图2.13和图2.14寄生电源供电方式中,ds18b20的vdd引脚必须接地(3)ds18b20的外部电源供电方式 在外部电源供电方式下,ds18b20工作电源由vdd引脚接入,此时i/o线不需要强上拉,不存在电源电流不足的问题,可以保证转换精度,同时在总线上理论可以挂接任意多个ds18b20传感器,组成多点测温系统。注意:在外部供电的方式下,ds18b20的gnd引脚不能悬空,否则不能转换温度,读取的温度总是85。图2.15 外部电源供电方式图2.16 外部供电方式的多点测温电路图外部电源供电方式是ds18b20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。因此,在实际的设计开发中,我们使用外部电源供电方式。在外接电源方式下,可以充分发挥ds18b20宽电源电压范围的优点,即使电源电压vcc降到3v时,依然能够保证温度量精度。2.3.4单片机89c52 单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(princeton)结构。intel的mcs-51系列单片机采用的是哈佛结构的形式,而后续产品16位的mcs-96系列单片机则采用普林斯顿结构。为了设计此系统,采用了mcs-51兼容单片机stc89c52单片机作为控制芯片1. stc89c52的片内结构下图是stc89c52的内部结构示意图。图2.16 stc89c52的内部结构示意图stc89c52单片机包含中央处理器、程序存储器(rom)、数据存储器(ram)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:(1)中央处理器:中央处理器(cpu)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,cpu负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。(2)数据存储器(ram)stc89c52内部有256个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的ram只有256个,可存放读写的数据,运算的中间结果或用户定义的字型表。(3)程序存储器(rom):stc89c52共有8192个8位flash rom,用于存放用户程序,原始数据或表格。(4)定时/计数器:stc89c52有两个16位的可编程定时/计数器,以实现定时或计数,其中中断用于控制程序转向。(5)并行输入输出(i/o)口:stc89c52共有4组8位i/o口(p0、 p1、p2或p3),用于对外部数据的传输。(6)全双工串行口:stc89c52内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。(7)中断系统:stc89c52具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。(8)时钟电路:stc89c52内置最高频率达90mhz的时钟电路,用于产生整个单片机运行的脉冲时序,但stc89c52单片机需外置振荡电容。图2.17 stc89c52的时钟电路2. stc89c52的引脚stc89c52采用40pin封装的双列直接dip结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个i/o口,中断口线与p3口线复用。现在我们对这些引脚的功能加以说明:如图2.18图2.18 stc89c52 的引脚pin9:reset/vpd复位信号复用脚,当stc89c52通电,时钟电路开始工作,在reset引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器pc指向0000h,p0-p3输出口全部为高电平,堆栈指针写入07h,其它专用寄存器被清“0”。reset由高电平下降为低电平后,系统即从0000h地址开始执行程序。然而,初始复位不改变ram(包括工作寄存器r0-r7)的状态。stc89c52的复位方式可以是自动复位,也可以是手动复位,见下图2.19。此外,reset/vpd还是一复用脚,vcc掉电其间,此脚可接上备用电源,以保证单片机内部ram的数据不丢失。图2.19 复位pin30:ale/当访问外部程序器时,ale(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ale端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ale会跳过一个脉冲。如果单片机是eprom,在编程其间,将用于输入编程脉冲。pin29:当访问外部程序存储器时,此脚输出负脉冲选通信号,pc的16位地址数据将出现在p0和p2口上,外部程序存储器则把指令数据放到p0口上,由cpu读入并执行。pin31:ea/vpp程序存储器的内外部选通线,stc89c52单片机,内置有8kb的程序存储器,当ea为高电平并且程序地址小于8kb时,读取内部程序存储器指令数据,而超过8kb地址则读取外部指令数据。如ea为低电平,则不管地址大小,一律读取外部程序存储器指令。3. 通讯接口本设计采用rs-232c串行通信方式。rs-232c是由美国电子工业协会(eia)正式公布的,在异步串行通信中应用最广泛的标准总线。现在,计算机上的串行通信端口(rs-232c)是标准配置端口,已经得到广泛应用,计算机上一般都有12个标准rs-232c串口,即通道com1和com2。rs-232c规定最大的负载电容为2500pf,这个电容限制了传输距离和传输速率,由于rs-232c的发送器和接收器之间具有公共信号地(gnd),属于非平衡电压型传输电路,不使用差分信号传输,因此不具备抗共模干扰的能力,共模噪声会耦合到信号中。在不使用调制解调器(modem)时,rs-232c能够可靠进行数据传输的最大通信距离为15米。因此不适合做远距离通信,但是对于条屏,通信15米的通信距离已经足够。rs-232c规定的逻辑电平与一般微处理器、单片机的逻辑电平是不同的,逻辑1(mark) -3v-15v,逻辑0(space) 315v。因此,单片机系统要和电脑的rs-232c接口进行通信,就必须把单片机的信号电平(ttl电平)转换成计算机的rs-232c电平,或者把计算机的rs-232c电平转换成单片机的ttl电平,通信时候必须对两种电平进行转换。实现这种转换的方法可以使用分立元件,也可以使用专用rs-232c电平转换芯片。目前较为广泛地使用专用电平转换芯片,如max232、mc1488、mc1489等。2.3.5 max232电平转换芯片特点本设计就是利用maxim公司的单电源芯片max232来完成单片机ttl到rs-232c电平的转换。max232是单电源双rs-232c发送/接收芯片。它符合所有的rs-232c技术规范,只要单一 +5v电源供电;片载电荷泵,具有升压、电压极性反转能力,能够产生 +10v 和 -10v电压v+、v- ;低功耗,典型供电电流5ma;内部集成2个rs-232c驱动器,内部集成2个rs-232c接收器。采用单一 +5v电源供电,外接只需4个电容,便可以构成标准的rs-232c通信接口,硬件接口简单,所以被广泛运用。max232的引脚排列及功能描述见表2.2(摘录自max232官方数据手册)表2.2 max232的引脚功能脚号引脚名称引脚功能描述脚号引脚名称引脚功能描述1c1+泵电容1正极9r2out第二组ttl/cmos电平输出2v+正电源滤波10t2in第二组ttl/cmos电平输入3c1-泵电容1负极11t1in第一组ttl/cmos电平输入4c2+泵电容2正极12r1out第一组ttl/cmos电平输出5c2-泵电容2负极13r1in第一组rs-232电平输入6v-负电源滤波14t1out第一组rs-232电平输出7t2out第二组rs-232电平输出15gnd地8r2in第二组rs-232电平输入16vcc电源+5v图2.20 max232引脚排列2.3.6单片机与pc间通信接口电路设计根据设计的需要,设计单片机与pc间通信接口电路如图17示。图2.21 max232通信接口电路2.3.7过限指示由于在本设计中, 过限指示不是关键设计,故采用led加限流电阻的方式简单实现。led指示灯如下图所示。图2.22 led 指示灯第3章 软件设计整个软件包括温度采集和数据传输两个主要部分组成。其中温度采集又是由单总线协议和注册码组成的,因此,软件设计主要任务是实现1-wire总线协议。3.1 1-wire总线协议处理经过单线接口访问ds1820 的协议protocol 如下初始化-rom 操作命令-存贮器操作命令-处理数据 初始化单线总线上的所有处理均从初始化序列开始初始化序列包括总线主机发出一复位脉冲接着由从属器件送出存在脉冲。完成这个功能的代码如下:/*function:18b20初始化*parameter:*return:*modify:*/void init18b20 (void) dq=1; _nop_(); dq=0; tempdelay(86); /delay 530 us 主机发出复位脉冲 _nop_(); dq=1; tempdelay(14); /delay 100 us _nop_(); _nop_(); _nop_();if(dq=0) /检测从属器件送出存在脉冲 flag = 1; /detect 1820 success! else flag = 0; /detect 1820 fail! tempdelay(20); /20 _nop_(); _nop_(); dq = 1;rom 操作命令一旦总线主机检测到从属器件的存在它便可以发出器件rom 操作命令之一所有rom 操作命令均为8 位长,rom操作命令由1-wire的单字节读写命令完成。/*function:向18b20写入一个字节*parameter:*return:*modify:*/void writebyte (uchar wr) /*单字节写入*/ uchar i; for (i=0;i= 1; /*function:读18b20的一个字节*parameter:*return:*modify:*/uchar readbyte (void) /*读取单字节*/ uchar i,u=0; for(i=0;i= 1; dq = 1; if(dq=1) u |= 0x80; tempdelay (4); _nop_(); return(u);有了上面的基本函数,我们可以完成具体的rom操作了举例总线主机产生温度变换命令然后读出温度,如下表所示:表 3.1 读温度主机方式数据lsb 在先注 释txreset(复位)复位脉冲480_960usrxpresence(存在)存在脉冲tx 55h 符合rom 命令tx 64位rom代码发出ds1820 地址tx44h 温度变换命令txi/o 线高电平总线主机使i/o 线至少保持2 秒钟的高电平以便完成变换txreset 复位复位脉冲rxpresence 存在存在脉冲tx55h 符合rom 命令tx64 位rom 代码发出ds1820 地址txbeh读暂存存贮器命令rx9 个数据字节读整个暂存存储器以及crc 主机现在重新计算机从暂存存储器接收来的8 位数据字节的crc 并把计算得到的crc 与读出的crc 比较如果二者相符主机继续操作如果不符重复此读操作txreset复位复位脉冲rxpresence存在存在脉冲操作完成完成这部分功能的代码如下/*function:crc校验*parameter:*return:*modify:*/uchar crc (uchar j) uchar i,crc_data=0; for(i=0;ij;i+) crc_data = crctablecrc_datatemp_buffi; return (crc_data);/*function:读取温度*parameter:*return:*modify:*/void gemtemp (void) read_bytes (9); if (crc(9)=0) /*校验正确*/ temperature = temp_buff1*0x100 + temp_buff0;/ temperature *= 0.0625; temperature *= 10; temperature /= 16; tempdelay(1); /*function:读18b20id*parameter:*return:*modify:*/void readid (void)/*读取器件 id*/ init18b20(); writebyte(0x33); /read rom read_bytes(8);/*function:18b20id全处理*parameter:*return:*modify:*/void temperatuerresult(void) p = id_buff; readid(); init18b20 (); writebyte(0xcc); /skip rom writebyte(0x44); /temperature convert init18b20 (); writebyte(0xcc); /skip rom writebyte(0xbe); /read temperature p = temp_buff; gemtemp();这里要说明的是: 1-wire协议提供了一种检测数据是否存在着传输错误的手段,就是crc校验。3.2 1-wire crc 校验处理ds1820有一包括64位rom 的最高有效字节内的8位crc,总线上的主机可以根据64位rom的前56位计算crc的值并把它与存贮在ds1820内的值进行比较以决定rom的数据是否已被主机正确地接收,crc的等效多项式函数为 crc=x8+x5+x4+1。ds1820在传递数据时也利用与上述相同的多项式函数产生一个8位crc值,并把此值提供给主机以确认数据字节的传送,在使用crc来确认数据传送的每一种情况中,总线主机必须使用上面给出的多项式函数计算crc的值,并把计算所得的值或者与存贮在ds1820 的64 位rom 部分中的8 位crc 值,或者与ds1820 中计算得到的8 位crc值(在读暂存存贮器中时它作为第九个字节被读出)进行比较。总线crc可以使用如图3.1 所示由一个移位寄存器和异或xor 门组成的多项式产生器来产生。图3.1 移位寄存器和异或xor门移位寄存器的所有位被初始化为零然,后从产品系列编码的最低有效位开始,每次移入一位。当产品系列编码的8 位移入以后,接着移入序列号,在序列号的第48 位进入之后,移位寄存器便包含了crc 值,移入crc 的8 位应该使移位寄存器返回至全零。完成crc校验的代码如下:uchar crc_data;uchar code crctable 256=0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53;uchar crc (uchar j) uchar i,crc_data=0; for(i=0;ij;i+) crc_data = crctablecrc_datatemp_buffi; return (crc_data);3.3 1-wire 器件的rom搜索从上面的读出温度的过程我们看到,ds18b20是依靠64位注册码来作为地址,来区分每个器件的,我们要完成在一条1-wire总线上的多点测量必须知道每一个器件的注册码,当线路上只有一个器件的时候,这个问题处理起来很简单,只要发出0x33命令就行,但是实际上我们看到,现场使用的测温电缆已经把多个18b20密封在一条电缆中了,我们不可能单独来测量每一个18b20的注册码了,这样问题就复杂了,各种参考文献和网络上的例程都没有对这种情况的介绍,不解决这个问题,温度检测系统就没有使用价值!通过对参考文献ds1820 programmable resolution 1-wire digital thermometer 的仔细研究,发现1-wire 器件支持一种叫rom搜索的操作,通过rom搜索可以枚举1-wire总线上的所有器件,通过rom搜索完美的实现了测温点的自由增减。rom搜索是针对对器件的64位注册码进行的,每个1-wire器件的注册码都是唯一的。图3.2 64位rom注册码搜索算法搜索算法采用的是二叉树型结构,搜索过程沿各分节点进行,直到找到器件的rom 码即叶子为止;后续的搜索操作沿着节点上的其它路径进行,按照同样的方式直到找到总线上的所有器件代码。搜索算法首先通过复位(reset)和在线应答脉冲(presence pulse)时隙将1-wire 总线上的所有器件复位;成功地执行该操作后发送1 个字节的搜索命令,搜索命令使1-wire 器件准备就绪、开始进行搜索操作。搜索命令分为两类:标准搜索命令(0fh)用来搜索连接到网络中所有器件;报警或有条件搜索命令(ech)只用来搜索那些处于报警状态下的器件,这种方式缩小了搜索范围可以快速查找到所需要注意的器件。搜索命令发出之后,开始实际的搜索过程。首先总线上的所有从机器件同时发送rom 码(也叫注册码)中的第一位最低有效位。与所有的1-wire 通信一样,无论是读取数据还是向从机器件写数据,都由1-wire 主机启动每一位操作。按照1-wire 的特性,当所有从机器件同时应答主机时,结果相当于全部发送数据位的逻辑and;从机发送其rom 码的第一位后,主机启动下一位操作,接着从机发送第一位数据的补码;从两次读到的数据位可以对rom 码的第一位做出几种判断:图3.3 第一位的情况判断按照搜索算法的要求,1-wire 主机必须向总线上的从机发回一个指定位;如果从机器件中rom码的当前位的值与该数据位匹配,则继续参与搜索过程;若从机器件的当前位与之不匹配,则该器件转换到等待状态,并保持等待状态直到下一个1-wire 复位信号到来。其余63 位rom 码的搜索依然按照这种“读两位”、“写一位”的模式进行重复操作。按照这种搜索算法进行下去,最终除了一个从机器件外所有从机将进入等待状态,经过最后一轮检测就可得到最后保留(未进入等待状态)器件的rom 码。在后续搜索过程中,选用不同的路径(或分支)来查找其它器件的rom 码。需要注意的是本文rom 码的数据位用第1位(最低有效位)到第64位(最高有效位)表示而不是我们常用的那种第0位到第63位的模式;这样设置允许将差异位置记数器初始值置为0,为以后的比较提供了方便。图3.4 判断过程从图3.4可以看出:如果所有总线上的器件在当前位具有相同值,那么只有一条分支路径可选;总线上没有器件响应的情况是一种异常状态,可能是要查找的器件在搜寻过程中与1-wire 总线脱。离如果当前位既有0 也有1,这种情况称为位值差异,它对在后续搜索过程中查找器件起关键作用。搜索算法指定在第一轮查询中若出现差异(数据位/补码 = 0/0),则选用0路径。注意:这一点是由本文档中介绍的特定算法决定的,其它算法中或许首先选用1路径。记录最后一次值差异的位置以供下一次搜索使用,图3.5列出了出现值差异时路径的选取情况。图3.5 分支选取图3.6列出了对一个从器件进行搜索的流程图;右侧注释栏对在流程图中出现的符号进行了说明;在本文档的源代码附录中也将用到这些专用符号。图3.6 搜索流程图图3.7 搜索流程图图3.8 搜索流程图对应以上流程

温馨提示

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

评论

0/150

提交评论