吴官禄 2024118504208 基于modbus总线的监测系统的开发.docx
实训成果批阅老师日期良川理/大洋城市学院CITYCO1.1.EGE,KUNMINGUNIVERSITYOFSCIENCEANDTECHNO1.OGY实训报告课程名称基于modbus总线的监测系统的开发专业班级电信1012学号2024118504208学生姓名吴官禄指导老师范玉刚实训地点润泽楼3022024年6月30日书目摘要11、下位机数据采样系统21.1电路组成21.2modbus总线实现21.2.1modbus总线实现原理21.2.2modbus总线实现帧的结构与实现41.3功能实现81. 3.1程序框图81.3. 2程序91. 3.3PROTEUS原理图242、上位机监测系统252. 1串口实现252. 2modbus总线实现252. 3人机监测界面273、结论(系统综述)32现场总线中的modbus技术是当今自动化技术探讨的热点之一,它应用于工业现场可以在微机集控设备之间实现双向串行多节点数字通讯。它把单个分散的被控设备作为网络节点,以现场总线为纽带,把全部被控设备连接成可以相互沟通信息、共同完成自动限制任务的网络系统,具有分散限制、系统结构简洁、节约硬件设备、易于安装维护等优点。为了更大程度全面地提高工业化数据实时监测、迎合将来无人化工作面发展趋势,温度数据实时采集的大型设备远程监测监控功能的实现至关重要。目前对于温度数据的实时采集已有相当程度的发展,但缺乏远程监测监控功能。本文以基于modbus总线的监测系统的开发为探讨对象,依据以DS18B20传感器作为监测监控系统的网络特点,采纳modbus总线技术编制了通讯软件,实现了实时温度数据的采集,达到了对大型设备远程监测监控的目的。关键字:现场总线、modbus、温度数据、实时采集、监测、监控1、下位机数据采样系统1.1电路组成电路组成框图:电路组成文字叙述:通过四个DS18B20温度传感器对空间四个温度点进行温度采集,通过PiCO-Pr3口将采集的数据传送给单片机AT89C51,单片机AT89C51进行相应的数据处理,分别传送至1.CD1602轮询显示采集的数据和通过中断发送至串口,最终传送给上位机(PC机)。1.2modbus总线实现1.2.1modbus总线实现原理Modbus协议定义了限制器能识别和运用的信息结构。当在Modbus网络上进行通讯时,协议能使每一台限制器知道它本身的设备地址,并识别对它寻址的数据,确定应起作用的类型,取出包含在信息中的数据和资料等,限制器也可组织回答信息,并运用MOdbUS协议将此信息传送出去。在其他网络上运用时,数据包和数据帧中也包含着ModbUS协议。如,ModbUs+或MAP网络限制器中有相应的应用程序库和驱动程序,实现嵌入式Modbus协议信息与此网络中用子节点设备间通讯的特别信息帧的数据转换。该转换也可扩展,处理节点地址,路由,和每一个特别网络的错误检查方法。如包含在MOdbUS协议中的设备地址,在信息发送前就转换成节点地址,错误检查区也用于数据包,与每个网络的协议一样,最终一点是需用MOdbUS协议,写入嵌入的信息,定义应处理的动作。Modbus总线上的传输原理:Modicon限制器上的标准Modbus端口是运用一个RS-232兼容的串行接口,定义了连接器,接线电缆,信号等级,传输波特率,和奇偶校验,限制器可干脆或通过调制解调器(以后简称ModelnS)接入总线(网络)。限制器通讯运用主从技术,即主机能起动数据传输,称查询。而其它设备(从机)应返回对查询作出的响应,或处理查询所要求的动作。主机可对各从机寻址,发出广播信息,从机返回信息作为对查询的响应。从机对于主机的广播查询,响应返回MOdbUS协议设备地址,恳求功能代码,发送数据,错误校验码,建立了主机查询格式,从机的响应信息也用ModbUS协议组织,它包括确认动作的代码,返回数据和错误校验码。若在接收信息时出现一个错误或从机不能执行要求的动作时,从机会组织一个错误信息。并向主机发送作为响应。查询响应周期:查询:查询中的功能代码为被寻址的从机设备应执行的动作类型。数据字节中包含从机须执行功能的各附加信息,如功能代码03将查询从机,并读保持寄存器。并用寄存器的内容作响应。该数据区必需含有告之从机读取寄存器的起始地址及数量,错误校验区的一些信息,为从机供应一种校验方法,以保证信息内容的完整性。响应:从机正常响应时,响应功能码是查询功能码的应答,数据字节包含从机采集的数据,如寄存器值或状态。如出现错误,则修改功能码,指明为错误响应。并在数据字节中含有一个代码,来说明错误,错误检查区允许主机确认有效的信息内容。两种串行传输模式:限制器可运用ASCH或RTlJ通讯模式,在标准MOdbUS上通讯。在配置每台限制器时,用户须选择通讯模式以及串行口的通讯参数(如波特率,奇偶校验等),在Modbus总线上的全部设备应具有相同的通讯模式和串行通讯参数。选择ASCII或RTU模式用于标准的Modbus总线。它定义了总线上串行传输信息区的“位”的含义,确定信息打包及解码方法。如在MAP和ModbUs+总线上时,Modbus信息以帧的方式出现,并与串行传输无关,如恳求读保持寄存器,可以在MOdbUs+上的两个限制器之间处理,而与运用的限制器的Modbus端口无关。ASCII模式当限制器以ASCII模式在Modbus总线上进行通讯时,一个信息中的每8位字节作为2个ASCII字符传输的,这种模式的主要优点是允许字符之间的时间间隔长达IS,也不会出现错误。ASCIl码每一个字节的格式:编码系统:16进制,ASCn字符0-9,A-F,1个16进制。数据位:1起始位,7位数据,低位先送,奇/偶校验时1位;无奇偶校验时O位,(1.RC)1位带校验,1停止位;无校验2停止位。错误校验区:纵向冗余校验。RTU模式限制器以RTU模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,该模式的主要优点是在相同波特率下其传输的字符的密度高于ASCII模式,每个信息必需连续传输。RTU模式中每个字节的格式:编码系统:8位二进制,十六进制0-9,A-F数据位:1起始位,8位数据,低位先送,奇/偶校验时1位;无奇偶校验时0位,停止位1位(带校验),停止位2位(无校验)。错误校验区:循环冗余校验(CRC)1.2.2InodbUS总线帧的结构与实现无论是ASCII模式还是RTU模式,Modbus信息以帧的方式传输,每帧有确定的起始点和结束点,使接收设备在信息的起点起先读地址,并确定要寻址的设备(广播时对全部设备),以及信息传输的结束时间。可检测部分信息,错误可作为一种结果设定。对MAP或ModbUs+协议可对信息帧的起始和结束点标记进行处理,也可管理发送至目的地的信息,此时,信息传输中ModbUS数据帧内的目的地址已无关紧要,因为MOdbUs+地址已由发送者或它的网络适配器把它转换成网络节点地址和路由。ASCII帧在ASCn模式中,以(:)号(ASCII3AH)表示信息起先,以回撤一换行键(CR1.F)(ASCIIOD和OAH)表示信息结束。对其它的区,允许发送的字符为16进制字符0-9,A-F0网络中设备连续检测并接收一个冒号(:)时,每台设备对地址区解码,找出要寻址的设备。字符之间的最大间隔为1S,若大于1S,则接收设备认为出现了一个错误。典型的信息帧见下表起先地址功能数据纵向冗余检查结束1字符2字符2字符n字符2字符2字符图3ASCII信息帧例外:对于584和984A/B/X限制器,一个ASCH信息可在1.RC区后正常终止,而不需发送CR1.F字符,此时出现IS的时间间隔,限制器也将认为是正常中断。RTU帧RTU模式中,信息起先至少须要有3.5个字符的静止时间,依据运用的波特率,很简洁计算这个静止的时间,接着第一个区的数据为设备地址。各个区允许发送的字符均为16进制的0-9,A-Fo网络上的设备连续监测网络上的信息,包括静止时间。当接收第一个地址数据时,每台设备马上对它解码,以确定是否是自己的地址。发送完最终一个字符号后,也有一个3.5个字符的静止时间,然后才能发送一个新的信息。整个信息必需连续发送。假如在发送帧信息期间,出现大于3.5个字符的静止时间时,则接收设备刷新不完整的信息,并假设下一个地址数据。同样一个信息后,马上发送的一个新信息,(若无3.5个字符的静止时间)这将会产生一个错误。是因为合并信息的CRC校验码无效而产生的错误。起先地址功能数据校验终止T1-T2-T3-T48B位S8B位SN×8B位S16B位ST1-T2-T3T-4图4RTU信息帧Modbus信息帧地址设置信息地址包括2个字符(ASCH)或8位(RTU),有效的从机设备地址范围0-247(十进制),各从机设备的寻址范围为l-247o主机把从机地址放入信息帧的地址区,并向从机寻址。从机响应时,把自己的地址放入响应信息的地址区,让主机识别已作出响应的从机地址。地址O为广播地址,全部从机均能识别。当ModbUS协议用于高级网络时,则不允许广播或其它方式替代。如MOdbUs+运用令牌循环,自动更新共享的数据库。功能码设置信息帧功能代码包括字符(ASCn)或8位(RTU)。有效码范围1-225(十进制),其中有些代码适用全部型号的Modicon限制器,而有些代码仅适用于某些型号的限制器。还有一些代码留作将来运用。当主机向从机发送信息时,功能代码向从机说明应执行的动作。如读一组离散式线圈或输入信号的ON/OFF状态,读一组寄存器的数据,读从机的诊断状态,写线圈(或寄存器),允许下截、记录、确认从机内的程序等。当从机响应主机时,功能代码可说明从机正常响应或出现错误(即不正常响应),正常响应时,从机简洁返回原始功能代码;不正常响应时,从机返回与原始代码相等效的一个码,并把最高有效位设定为“1”。如,主机要求从机读一组保持寄存器时,则发送信息的功能码为:OOOOOOll(十六进制03)若从机正确接收恳求的动作信息后,则返回相同的代码值作为正常响应。发觉错时,则返回一个不正常响信息:1000OoII(十六进制83)o从机对功能代码作为了修改,此外,还把一个特别码放入响应信息的数据区中,告知主机出现的错误类型和不正常响应的缘由。主机设备的应用程序负责处理不正常响应,典型处理过程是主机把对信息的测试和诊断送给从机,并通知操作者。数据区的内容数据区有2个16进制的数据位,数据范围为OO-FF(16进制),依据网络串行传输的方式,数据区可由一对ASCll字符组成或由一个RTU字符组成。主机向从机设备发送的信息数据中包含了从机执行主机功能代码中规定的恳求动作,如离散量寄存器地址,处理对象的数目,以及实际的数据字节数等。举例说明,若主机恳求从机读一组寄存器(功能代码03),该数据规定了寄存器的起始地址,以及寄存器的数量。又如,主机要在一从机中写一组寄存器,(则功能代码为10H)o该数据区规定了要写入寄存区的起始地址,寄存器的数量,数据的字节数,以及要写入到寄存器的数据。若无错误出现,从机向主机的响应信息中包含了恳求数据,若有错误出现,则数据中有一个不正常代码,使主机能推断并作出下一步的动作。数据区的长度可为“零”以表示某类信息,如,主机要求从机响应它的通讯事务记录(功能代码OBH)。此时,从机不须要其他附加的信息,功能代码只规定了该动作。信息帧:错误校验标准ModbUS总线,有两类错误检查方法,ASCIl方式和RTU方式。ASCII运用ASCII方式时,错误校验码为2个ASCII字符,错误校验字符是1.RC校验结果。校验时,起始符为(:)冒号,结束符为CR1.F字符。RTU运用RTU方式时,错误校验码为一个16位的值,2个8位字节。错误校验值是对信息内容执行CRC校验结果。CRC校验信息帧是最终的一个数据,得到的校验码先送低位字节,后送高位字节,所以CRC码的高位字节是最终被传送的信息。串行传送信息在标准的MOdbUS上传送的信息中,每个字符或字节,按由左向右的次序传送:最低有效位:(1.SB)最高有效位:(MSB)ASCII数据帧位序:带奇偶校验StQrt1234S7RorStop无奇偶1Start12347StopStopRTU数据帧位序:带奇偶校验Start123467RarStop无奇偶校验Stnrt1234G78StopStop错误校验方法标准的ModbUS串行通讯网络采纳两种错误校验方法,奇偶校验(奇或偶)可用于校验每一个字符,信息帧校验(1.RC或CRC)适用整个信息的校验,字符校验和信息帧校验均由主机设备产生,并在传送前加到信息中去。从机设备在接收信息过程中校验每个字符或整个信息。主机可由用户设置的一个预定时间间隔,确定是否放弃传送信息。该间隔应有足够的时间来满意从机的正常响应。若主机检测到传输错误时,则传输的信息无效。从机不再向主机返回响应信息。此时,主机会产生一个超时信息,并允许主机程序处理该错误信号。留意:主机实际并未存在的从机发送信息时也会引起超时出错信号。奇偶校验用户可设置奇偶校验或无校验,以此确定每个字符发送时的奇偶校验位的状态。无论是奇或偶校验,它均会计算每个字符数据中值为“1”的位数,ASCII方式为位数据;RTU方式为8位数据。并依据“1”的位数值(奇数或偶数)来设定为“0”或“1”,如一个RTU数据帧中8位数据位为:11000101,在该帧中,值为“1”的总位数为4,即偶数。如采纳奇校验方式时,则“1”的总位数为奇数,即5。发送信息时,计算奇偶位,并加到数据帧中,接收设备统计位值为“1”的数量,若与该设备要求的不一样时产生一个错误。在ModbUS总线上的全部设备必需采纳相同的奇偶校验方式。留意:奇偶校验只能检测到数据帧在传输过程中丢失奇数“位”时才产生的错误。如采纳奇数校验方式时,一个包含3个“1”位的数据丢失2个“1”位时,其结果仍旧是奇数。若无奇偶校验方式时,传输中不作实际的校验,应附加一个停止位。1.RC校验ASCII方式时,数据中包含错误校验码,采纳1.RC校验方法时,1.RC校验信息以冒号“:”起先,以CR1.F字符作为结束。它忽视了单个字符数据的奇偶校验的方法。1.RC校验码为1个字节,8位二进制值,由发送设备计算1.RC值。接收设备在接收信息时计算1.RC校验码。并与收到的1.RC的实际值进行比较,若二者不一样,亦产生一个错误。错误校验方法CRC校验RTU方式时,采纳CRC方法计算错误校验码,CRC校验传送的全部数据。它忽视信息中单个字符数据的奇偶校验方法。CRC码为2个字节,16位的二进制值。由发送设备计算CRC值,并把它附到信息中去。接收设备在接收信息过程中再次计算CRC值并与CRC的实际值进行比较,若二者不一样,亦产生一个错误,校验起先时,把16位寄存器的各位都置为“1”,然后把信息中的相邻2个8位字节数据放到当前寄存器中处理,只有每个字符的8位数据用于CRC处理。起始位,停止位和校验位不参加CRC计算。CRC校验时,每个8位数据与该寄存器的内容进行异或运算,然后向最低有效位(1.SB)方向移位,用零填入最高有效位(MSB)后,再对1.SB检查,若1.SB=1,则寄存器与预置的固定值异或,若1.SB=O,不作异或运算。重复上述处理过程,直至移位8次,最终一次(第8次)移位后,下一个8位字节数据与寄存器的当前值异或,再重复上述过程。全部处理完信息中的数据字节后,最终得到的寄存器值为CRC值。CRC值附加到信息时,低位在先,高位在后。1.3功能实现1.3.1程序框图1.3.2程序include<REG51.H>ftinclude<intrins.h>include<math.h>#defineuintunsignedint#defineucharunsignedcharcharTimeInterval;charMyAddress;uchartemp_value;温度值ucharTempBuffer7;voidshow_time();液晶显示程序uchartemp_valuel;温度值ucharTempBufferl7;voidshow_timel();液晶显示程序uchartemp_value2;温度值ucharTempBuffer27;voidshow_time2();液晶显示程序uchartemp_value3;温度值ucharTempBuffer37;unsignedcharsjz8;charcharcharcharsbitsbitsbitsbitcharcharcharcharvoidguan=0;guan1=0;guan2=0;guan3=0;led2=P2led3=P2led4=P2led5=P2datadatadatadatashow0123DI6=1,2,3,4,5,6;D06=6,7,8,9,10,11);A06=16,17,18,19,20,21);AI6=11,12,13,14,15,16;,time3();sbit1.cdRs=P25;sbit1.cdRw=P26sbit1.cdEn=P27sfrDBPort=0x80;sbitDQ=Pl0;/*1602液晶显示部分子程序*/Chardone,count,temp,flag,up_flag,down_fIagjPort,Definitions/P0=0x80,Pl=0x90,P2=0xA0,P3=0xB0.数据端口温度传送数据IO口sbitDQ1=P1;sbitDQ2=P2;sbitDQ3=P3;/*内部等待函数*/unsignedchar1.CDJVait(void)1.cdRs=O;1.cdRw=I;1.cdEn=I;1.cdEn=O;nop_();nop_();returnDBPort;/*向1.CD写入吩咐或数据*/Sdefine1.CD_COMMAND0/CommandSdefine1.CD_DATA1/Datadefine1.CD_C1.EAR_SCREENOxOl/清屏define1.CDJOMING0x02/光标返回原点void1.CDJVrite(bitstyle,unsignedcharinput)1.cdEn=O;1.cdRs=Style;1.cdRw=O;_nop_();DBPort=input;_nop_();留意依次1.cdEn=1;_nop_();留意依次1.cdEn=O;_nop_();1.CDJVaitO;#define#definedefinedefinedefinedefine/*设置显示模式*/1.CD_SH0W0x04显示开1.CD_HIDE0x00显示关1.CD,CURSOR0x02显示光标1.CD_NO_CURSOR0x00无光标1.CD_F1.ASH0x01光标闪动1.CD_NO_F1.ASH0x00光标不闪动void1.CD_SetDisplay(unsignedcharDisplayMode)1.CDJVrite(1.CD_COMMAND,0x08DisplayMode);/*设置输入模式*/define1.CD_AC_UP0x02define1.CD_AC_D0WN0x00/defaultdefine1.CDJfOVE0x01/画面可平移define1.CD_NO_MOVE0x00/defaultvoid1.CD_SetInput(unsignedcharInputMode)1.CDJVrite(1.CD_COMMAND,0x04InputMode);/*初始化1.CD*/void1.CD_Initial()1.cdEn=O;1.CDJVrite(1.CD_COMMAND,0x38);/8位数据端口,2行显示,5*7点阵1.CDJVrite(1.CD_COMMAND,0x38);1.CD_SetDisplay(1.CD_SH0W1.CD_N(1.CURSOR);开启显示,无光标1.CDJVrite(1.CD_COMMAND,1.CD_C1.EAR_SCREEN);清屏1.CD_SetInput(1.CD_AC_UP1.CD_N0_M0VE);/AC递增,画面不动voidGotoXY(unsignedcharx,unsignedchary)(if(y=0)1.CDJVrite(1.CD_CONfMAND,0x80x);if(y=l)1.CD_Write(1.CD.COMMAND,0x80(-0x40);/*将字符输出到液晶显示*/voidPrint(unsignedchar*str)(while(*str!=>0,)(1.CDJVrite(1.CD_DATA,*str);str+;)/*ds18b20子程序*/*dsl8b20延迟子函数(晶振12MHZ)*/voiddelay_18B20(unsignedinti)(while(i-);*dsl8b20初始化函数*/voidInit_DS18B20(void)(unsignedcharx=0;DQ=1;/DQ复位delay_18B20(8);稍做延时DQ=0;单片机将DQ拉低delay_18B20(80);精确延时大于480usDQ=1;拉高总线delay_18B20(14);x=DQ;稍做延时后假如x=0则初始化胜利x=l则初始化失败delay_18B20(20);*dsl8b2()读一个字节*/unsignedcharReadOneChar(void)uchari=0;uchardat=0;for(i=8;i>0;i一)DQ=0;/给脉冲信号dat>>=l;DQ=1;/给脉冲信号if(DQ)datI=0x80;delay_18B20(4);return(dat);*dsl8b20写一个字节*/voidWriteOneChar(uchardat)unsignedchari=0;for(i=8;i>0;i-)DQ=0;DQ=dat&OxOl;delay_18B20(5);DQ=1;dat>>=l;)/*读取dsl8b20当前温度*/voidReadTemp(void)(unsignedchara=0;unsignedcharb=0;chart;longtt;InitJS18B20();WriteOneChar(OxCC);/跳过读序号列号的操作WriteOneChar(0x44);/启动温度转换delay_18B20(100);/thismessageisveryimportantInit_DS18B20();WriteOneChar(OxCC);跳过读序号列号的操作WriteoneChar(OxBE);读取温度寄存器等前两个就是温度delay_18B20(100);a=Read0neChar();读取温度值低位b=ReadOneChar();读取温度值高位temp_value=b«4;temp_value+=(a&OxfO)»4;t=a&OxOf;tt=t*625;guan=tt1000;voidtemp_to_str()温度数据转换成液晶字符显示(TempBuffer0=temp-value10÷,0,;十位TempBufferl=temp-value%10÷,0,;个位TempBuffer2=,.';TempBuffer3=guan÷,0'TempBuffer4=Oxdf;TempBuffer5=,C,;TempBufferl6=,0,;)voidDelaylms(unsignedintcount)unsignedinti,j;for(i=0;i<count;i+)for(j=0J<120J+);)voidshow_time()液晶显示程序开启温度采集程序ReadTempO;temp_to_str();GotoXY(0,0);Print("first");GotoXY(0,1);温度数据转换成液晶字符Print("temp:);GotoXY(6,1);Print(TempBuffer);Delaylms(400);if(TempBuffer>=30)液晶字符显示位置显示温度扫描延时)elseled2=l;/*ds18b20子程序*/*dsl8b20延迟子函数(晶振12MHZ)*/*dsl8b20初始化函数*/voidInit_DS18B201(void)unsignedcharx=0;DQl=1;/DQ复位delay_18B20(8);稍做延时DQl=0;单片机将DQ拉低delay_18B20(80);精确延时大于480usDQl=1;拉高总线delay_18B20(14);x=DQl;稍做延时后假如x=0则初始化胜利x=l则初始化失败delay_18B20(20);unsignedcharReadOneCharl(void)uchari=0;uchardat=0;for(i=8;i>0;i一)(DQl=0;/给脉冲信号dat>>=l;DQl=1;/给脉冲信号if(DQl)datI=0x80;delay_18B20(4);)return(dat);*dsl8b201写一个字节*/voidWriteOneCharl(uchardat)(unsignedchari=0;for(i=8;i>0;i-)DQl=0;DQl=dat&OxOl;delay_18B20(5);DQl=1;dat>>=l;)/*读取dsl8b201当前温度*/voidReadTemp1(void)(unsignedchara=0;unsignedcharb=0;unsignedchart=0;longtt;InitJS18B201();WriteOneCharl(OxCC);/跳过读序号列号的操作WriteOneCharl(0x44);/启动温度转换delay_18B20(100);/thismessageisweryimportantInitJS18B201();WriteOneCharl(OxCC);跳过读序号列号的操作WriteOneCharl(OxBE);读取温度寄存器等前两个就是温度delay_18B20(100);a二ReadOneChar1();读取温度值低位b=ReadOneCharl();读取温度值高位temp_valuel=b«4;temp_valuel+=(a&OxfO)»4;t=axf;tt=t*625;guanl=tt1000;voidtemp_to_strl()温度数据转换成液晶字符显示(TempBufferl0=temp_valuel/10+0,;十位TemPBUfferIl=temp_valuel%10+'0'个位TempBufferl2='.'TempBufferl3=guanl÷,0,;TempBufferl4=Oxdf;温度符号TempBufferl5=>C,;TempBufferl6=,0,;)voidshow_timel()液晶显示程序ReadTempl();temp_to_strl();GotoXY(O,O);Print("second");GotoXY(O,1);温度数据转换成液晶字符Print("temp:);GotoXY(6,1);液晶字符显示位置Print(TempBufferl);显示温度Delaylms(400);扫描延时voidInit_DS18B202(void)unsignedcharx=0;DQ2=1;/DQ复位delay_18B20(8);稍做延时DQ2=0;单片机将DQ拉低delay_18B20(80);精确延时大于480usDQ2=1;拉高总线delay_18B20(14);x=DQ2;稍做延时后假如x=0则初始化胜利x=l则初始化失败delay_18B20(20);unsignedcharRead0neChar2(void)uchari=0;uchardat=O;for(i=8;i>0;i一)(DQ2=O;/给脉冲信号dat>>=l;DQ2=1;/给脉冲信号if(DQ2)datI=0x80;delay_18B20(4);)return(dat);*dsl8b201写一个字节*/voidWrite0neChar2(uchardat)(unsignedchari=0;for(i=8;i>0;i-)DQ2=O;DQ2=dat&OxOl;delay_18B20(5);DQ2=1;dat>>=l;)/*读取dsl8b202当前温度*/voidReadTemp2(void)(unsignedchara=0;unsignedcharb=0;unsignedchart=0;longtt;InitJS18B202();Write0neChar2(OxCC);/跳过读序号列号的操作Write0neChar2(0x44);/启动温度转换delay_18B20(100);/thismessageisweryimportantInitJS18B202();WriteOneChar2(OxCC);跳过读序号列号的操作Write0neChar2(OxBE);读取温度寄存器等前两个温度delay_18B20(100);a二ReadOneChar2();读取温度值低位b=ReadOneChar2();读取温度值高位temp_value2=b«4;temp_value2+=(a&OxfO)»4;t=a&0x0f;tt=t*625;guanl=tt1000;voidtemp_to_str2()温度数据转换成液晶字符显示(TempBuffer20=temp-value210÷,0,;十位TemPBUffer21=temp_value2%10+'0'个位TeinPBUffCr22='TempBuffer23=guan2+10,;TempBuffer24=Oxdf;温度符号TCnIPBUffCr25='C'TempBuffer26,0,;)voidshow_time2()液晶显示程序(ReadTemp2();开启温度采集程序temp_to_str2();GotoXY(0,0);Print("third");GotoXY(O,1);温度数据转换成液晶字符Print("temp:);GotoXY(6,1);液晶字符显示位置Print(TempBuffer2);显示温度if(TempBuffer2>=30)Delaylms(400);扫描延时voidInit_DS18B203(void)unsignedcharx=0;DQ3=1;/DQ复位delay_18B20(8);稍做延时DQ3=0;单片机将DQ拉低delay_18B20(80);精确延时大于480usDQ3=1;拉高总线delay_18B20(14);x=DQ3;稍做延时后假如x=0则初始化胜利x=l则初始化失败delay_18B20(20);unsignedcharReadOneCharS(void)uchari=0;uchardat=0;for(i=8;i>0;i一)DQ3=O;/给脉冲信号dat>>=l;DQ3=1;/给脉冲信号if(DQ3