版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于单总线的温度实时监控系统3(完整资料)(可以直接使用,可编辑优秀版资料,欢迎下载)
基于单总线的温度实时监控系统3(完整资料)(可以直接使用,可编辑优秀版资料,欢迎下载)课程设计报告书课程名称:专业综合课程设计题目:基于单总线的温度实时监控系统系(院):电子工程学院学期:11-12专业班级:电子姓名:学号:评语:成绩:签名:日期:选题意义随着社会的发展,科技的进步,电子技术和微型计算机的迅速发展,以及测温仪器在各个领域的应用,智能化已是现代温度监控系统发展的主流方向。单片机在电子产品中的应用已经越来越广泛。利用单片机对温度进行控制的技术也随之而生,并日益发展和完善,且越来越显示出它的优越性。单总线技术是美国Dallas半导体公司近年推出的新技术.它将地址线、数据线、控制线合为1根信号线,允许在这根信号线上挂接数百个单总线器件芯片。温度是一个重要的物理量,它反映了物体冷热的程度,与自然界中的各种物理和化学过程相联系。在工、农业生产和日常生活中,各个环节都与温度紧密相联,温度的准确监测及控制占据着极其重要地位.比如,发电厂锅炉的温度必须控制在一定的范围之内;许多化学反应的工艺过程必须在适当的温度下才能正常进行等。没有合适的温度环境,许多电子设备就不能正常工作,粮仓的储粮就会变质霉烂,酒类的品质就没有保障。可见,温度的监控是非常重要的.单总线技术是美国Dallas半导体公司近年推出的新技术。它将地址线、数据线、控制线合为1根信号线,允许在这根信号线上挂接数百个单总线器件芯片。单总线技术应用于某些低速(约100kbps以下的速率)测控系统中,可以大大简化线路结构和减少硬件开销,可以通过PC机串行口、并行口、USB总线或单片机直接进行测控,PC机的软件开发也直观、容易。本设计为基于单总线的温度实时监控系统。设计目的、要求及步骤概述2.1设计目的(1)对单总线设备的结构特点和以单总线技术构建起来的微型局域网的拓朴结构、网络结构优化以及设备与单总线的连接进行阐述和研究。(2)设计基于单总线的温度采集电路,单总线和PC机串行口的接口电路,在电路设计时重点考虑单总线设备的供电问题和数据的可靠采集。(3)用自己熟悉的计算机语言编写温度实时监控系统软件,软件的界面要友好、简明、直观。在软件编写时重点考虑温度采集数据存储、单总线设备中的CRC循环冗余码的实现方法、从设备的“即时插即用”的算法研究。2.2设计内容及要求温度测量范围-50℃~+100℃。测温分辨率不低于0.0625℃。数据传输距离不低于60米。温度测量点不少于3.温度采集间隔不底于10分钟.能显示一天实时温度变化曲线.2。3设计步骤概述实习制作大概步骤如图1准备好要用的器件准备好要用的器件进行焊接设计电路Delphi程序设计检测完善电路完整调试完善研究课题的要求程序检测完善图1电路的设计3.1硬件电路设计在硬件电路设计时,应着重考虑电子器件的供电方式,以及对器件的限压和限流保护。因为本次设计要求利用单总线技术,所以可以考虑使用寄生供电方式。设计的电路图如下.图2基于单总线的温度实时监控系统硬件电路总图图3基于单总线的温度实时监控系统硬件电路原理图3。2软件设计3。2.1设计窗体本次设计要求软件的可视化窗体中包含实时温度显示、数据记录、存储管理和ROM数据,并且能将测得的数据保存到指定的数据库中。窗体界面如下.图4窗体界面实时温度显示中可以看到当前室温,并且可以显示摄氏温度和华氏温度。数据记录包含温度曲线和温度日志,可以显示一天内的温度变化曲线。存储管理和ROM数据用来对数据库中已经保存的温度数据进行管理,如删除、转移等操作。3。2.2软件编程本系统软件部分采用Delphi来实现初始化、数据采集处理、温度报表管理,其主程序的流程图见图5。图5主程序流程图本系统软件部分共分为3个部分,分别是:1)初始化程序。a.设置串行通信波特率;b.串行通讯方式的初始化;c.对TO,T1两个计数器的初始化;d.中断控制程序的初始化。此外,还负责从E2PROM中调出以前的采样参数,使器件能够以它采样温度数据。2)当监控到ONTIME1和NTIME2标记时作相应温度的存储、转换、发送处理。ONTIME1和NTIME2的标记主要有定时电路决定,当到达采样间隔时,做出相应的处理。3)采用动态显示方式即时显示温度,以节省电路规模,使得整个系统的体积变小。元器件的选择4。1主要元器件知识4。1。1DS18B20DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0。0625℃,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路.以上特点使DS18B20非常适用于远距离多点温度检测系统.4。1.1。1DS18B20内部结构如图5所示,主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器.DS18B20的管脚排列如图6所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端,在寄生电源接线方式时接地,见图7。图6DS18B20的内部结构图7DS18B20的管脚排列ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8+X5+X4+1)。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20中的温度传感器完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0。0625℃/LSB形式表达,其中S为符号位。例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。高低温报警触发器TH和TL、配置寄存器均由一个字节的EEPROM组成,使用一个存储器功能命令可对TH、TL或配置寄存器写入。其中配置寄存器的格式如下:0R1R011111MSBLSBR1、R0决定温度转换的精度位数:R1R0=“00”,9位精度,最大转换时间为93.75ms;R1R0=“01”,10位精度,最大转换时间为187.5ms;R1R0=“10”,11位精度,最大转换时间为375ms;R1R0=“11”,12位精度,最大转换时间为750ms;未编程时默认为12位精度。高速暂存器是一个9字节的存储器.开始两个字节包含被测温度的数字量信息;第3、4、5字节分别是TH、TL、配置寄存器的临时拷贝,每一次上电复位时被刷新;第6、7、8字节未用,表现为全逻辑1;第9字节读出的是前面所有8个字节的CRC码,可用来保证通信正确。4。1。1.2DS18B20的工作时序DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输.其工作时序包括初始化时序、写时序和读时序,如图8(a)(b)(c)所示。(a)初始化时序(b)写时序(c)读时序图8DS18B20的工作时序图4。1。1。3DS18B20与微处理器的连接DS18B20与微处理器的连接如下图9所示。(a)寄生电源工作方式(b)外接电源工作方式图9DS18B20与微处理器的典型连接图4.1。2ﻩ串口UART/RS232至单总线通信协议的转接桥DS2480B4。1.2。1DS2480B主要特性串口UART/RS232至单总线通信协议的转接桥,可直接连到UART和5VRS232系统中,支持Dallas全系列单总线器件,如数字温度传感器DS18B20、A/D转换器DS2450等;将主机从单总线时序控制中解脱出来,提供规范的、灵活的和强驱动的单总线定时;支持标准UART通信,支持9。6(默认)、19.2、57。6和115.2kbps速率;具有较强的总线驱动能力,通信距离可达300m;可编程下拉摆率控制和有源上拉,工作范围5V,-40~+85℃,8引脚SOIC封装。4。1.2.2管脚图及引脚说明ﻩ11234875RXDTXDPOLVPPGND1-WNCVDD图10DS2480B的封装和引脚DS2480B为8脚贴片式封装,如图10所示。引脚功能如表1所列:表1引脚功能说明引脚号引脚名称引脚功能1GND地线21-W单总线输入输出端3NC悬空4VDD4。5~5。5V电压5VPPEPROM编程电压6POLRXD/TXD选择端7TXD发送端8RXD接收端DS2480B工作原理框图如图11所示。图11DS2480B工作原理框图DS2480B与RS232的接口技术DS2480B与RS232的接口如图12所示。图12DS2480B与RS232的接口图4.2元件清单表2元件清单序号元件个数1PC机串行口UART/RS2321个2转接桥DS2480B1个3数字温度传感器DS18B201个4电容U07HF1个5稳压管2个6二极管M72个7电路板XF071个学习心得通过这次专业课程设计,我对本专业的理论知识和动手操作能力都有了大幅度的提高。首先从研究课题的要求和任务开始,刚拿到“基于单总线的温度实时监控系统”这个设计题目时,完全是不知所措,不知道从那下手。经过王老师和李老师的耐心讲解后,才有点头绪。课后通过自己查资料和老师所给的任务书与指导书才真正开始搞懂题目,并且去研究它.根据指导书上的要求和指示,我们小组设计出了基于单总线的温度实时监控系统硬件电路。接下来就要依据设计好的电路图,进行硬件的焊接。说到焊接,我并不陌生,在大二的时候就焊接过收音机,在专业综合实习时,又焊接过红外线感应开关。焊接最需要注意的是焊接的温度和时间,焊接时要使电烙铁的温度高于焊锡,但是不能太高,以烙铁接头的松香刚刚冒烟为好,焊接的时间不能太短,因为那样焊点的温度太低,焊点融化不充分,焊点粗糙容易造成虚焊,而焊接时间长,焊锡容易流淌,使元件过热,容易损坏,或者造成焊接短路现象.在软件设计与编程的环节,要求用自己熟悉的计算机语言编写温度实时监控系统软件。在设计之前我也考虑过关于选用什么语言的问题,在大学生涯中,我学过了C语言,Java语言和Delphi语言,在去年的计算机课程设计中,我曾用Delphi语言编写过一个高校学生选课成绩管理系统,对Delphi言语的应用相对灵活些,所以我决定用Delphi语言编写程序。在本次课程设计的过程中,我还发现基于DS18B20数字温度传感器构成的实时监控系统确实具有精度高、抗干扰能力强、电路简单等诸多优点。相比之下,传统的温度检测系统采用热敏电阻等温度敏感元件,热敏电阻成本低,但需要后续信号调理、AD转换处理电路才能将温度信号转换成数字信号,不但电路复杂,而且热敏电阻的可靠性相对较差,测量温度的精度差,很难保证热敏电阻的一致性和线性。通过对这个专业课程设计的学习,为我们掌握单总线的温度采集电路,单总线和PC机串行口的接口电路的开发打下了坚实的基础,还使我掌握了设计复杂电路和装配技能,培养了我理论联系实际的能力,提高了我分析问题和解决问题的能力,增强了独立工作的能力.其中感触最深的便是实践联系理论的重要性,当遇到实际问题时,只要认真思考,用所学的知识,再一步一步探索,是完全可以解决遇到的一般问题的.在实习过成中,要时刻保持清醒的头脑,出现错误,一定要认真的冷静的去检查分析错误,不能草草了事,这样做出来的课程设计才能达到它真正的效果,为我们以后步入社会做好充分的准备.参考文献[1]DS18B20ProgrammableResolution1—WireDigitalThermometer[2]DS2480BSerial1—WireLineDriverwithLoadSensor[3]左冬红,谢瑞和.实现单总线搜索ROM命令的一种算法[4]李朝青,单片机原理及接口技术(简明修订版)[M].1998[5]李广弟。单片机基础[M].1994[6]沙占友等.智能化集成温度传感器原理与应用.2002[7]阎石.数字电子技术基础(第三版)[M].1989附:源程序清单{-——-—-——--————-----—--—---—-—-—--—--—-——————-—--————-—---——----—-———--—--—---———--—--—TEMPDL32:ThisutilityusesTMEXtoviewareadthetemperaturefromaDS18B20.Itrequiresthe32-BitWindowsTMEXdriverstobepresent.Compiler:BorlandDelphi5.0}procedureTForm1.FormCreate(Sender:Tobject;Var ztbuf:array[0。.200]ofChar;Typebuf:array[0..200]ofChar;i,k,RetValue:smallint;RetStr:array[0..200]ofChar;SetupDone:Boolean;PortNum,PortType:smallint;begindieer:=false;SetupDone:=FALSE;{TMSetupnotdoneyet}Label4.Caption:=’’;{ReaddefaultPortNumberandPortTypefromregistry}RetValue:=TMReadDefaultPort(@PortNum,@PortType);if(RetValue〈1)thenTMReadDefaultPort(@PortNum,@PortType)beginShowMessage('Pleasesetportfirst');Halt;endelsebegin{readthetmexversionandtypeversion}Get_Version(@ztbuf);Label1.Caption:=StrPas(ztbuf);TMGetTypeVersion(PortType,@Typebuf);Label2.Caption:=StrPas(Typebuf);{attemptogetasession}Done:=False;RepeatSHandle:=TMExtendedStartSession(PortNum,PortType,NIL);If(SHandle>0)Thenbeginif(TMSetup(SHandle)=1)then{ThedevicethatwillbefoundisTemperatureDeviceDS18B20,soFamilyTypeissetto$28}FindFirstFamily($28,SHandle)elsebeginTMEndSession(SHandle);ShowMessage(’FailtosetupMicroLan!');Halt;end;endelsebeginif(SHandle〈0)thenBeginShowMessage('TheDefaultPortTypedoesnothaveadriver!');Halt;end;end;{Releasecontrolbacktowindow}Application.ProcessMessages;until(Done);Done:=False;RepeatSHandle:=TMExtendedStartSession(PortNum,PortType,NIL);If(SHandle>0)Thenbeginif(TMSetup(SHandle)=1)then{ThedevicethatwillbefoundisTemperatureDeviceDS18B20,soFamilyTypeissetto$28}FindSecondFamily($28,SHandle)elsebeginTMEndSession(SHandle);ShowMessage('FailtosetupMicroLan!');Halt;end;endelsebeginif(SHandle〈0)thenBeginShowMessage('TheDefaultPortTypedoesnothaveadriver!');Halt;end;end;{Releasecontrolbacktowindow}Application.ProcessMessages;until(Done);label18.Caption:=keke1;label19.caption:=keke2;table1.Active:=true;iftable1.CanModifythenbegintable1。Append;table1.Fields[0]。AsDateTime:=now;table1.Fields[1].AsString:=floattostr(diwei1);table1.Fields[2].AsFloat:=shangxian1;table1.Fields[3]。AsFloat:=xiaxian1;table1。Fields[4]。AsString:=floattostr(diwei2);table1.Fields[5].AsFloat:=shangxian2;table1。Fields[6].AsFloat:=xiaxian2;table1。Post;end;end;end;procedureTForm1。FindFirstFamily(family:smallint;SHandle:longint);vari,flag:smallint;romstr:string;rom:array[0.。8]ofsmallint;begin{Setuptofindthefirstdevicewiththefamily’family’}if(TMFamilySearchSetup(SHandle,@stateBuf,family)=1)thenbeginif(TMNext(SHandle,@stateBuf)=1)thenbegin{Readtheromnumberbysettingrom[0]to0forreadingandusingTMRom}rom[0]:=0;TMRom(SHandle,@stateBuf,@rom);{Checkifcorrecttype}romstr:='’;if((familyand$7F)=(rom[0]and$7F))thenbeginfori:=7downto0doromstr:=romstr+IntToHex(ROM[i],2);Label3.caption:=’SerialROMID1:’+romstr;ReadTemperature1(SHandle);endelsebeginShowMessage(’ThereisnoTemperatureDeviceontheport’);halt;end;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport’);halt;end;endelsebeginTMEndSession(SHandle);ShowMessage(’ThereisnoTemperatureDeviceontheport’);halt;end;end;procedureTForm1.ReadTemperature1(session_handle:longint);vartsht,i,tmp1:smallint;cr,cpc,tmpf,tmp:Extended;rbuf:array[0.。9]ofsmallint;st:longint;CRCByte,xiaxianbyte:Byte;begintmp:=0。00;{accessthedevice}if(TMAccess(session_handle,@StateBuf)=1)thenbegin{SendtherecallE2command(bysetting$B8tooutbyteinTMTouchByte)makesureScratchiscorrect}TMTouchByte(session_handle,$B8);{SendthestartTcommand}if(TMAccess(session_handle,@StateBuf)=1)thenbegin{PreparethestrongpullupafternextTMTouchByte}TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_STRONG_PULL_UP,PRIMED_BYTE);{Sendtheconversioncommand(bysetting$44tooutbyteinTMTouchByte)}TMTouchByte(session_handle,$44);{Sleepforasecond}st:=GetTickCount+1000;While(GetTickCount<st)doTMValidSession(Session_handle);{Disablethestrongpullup}TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE);{verifyconversioniscompletebysetting$01tooutbitinTMTouchBitandcheckthereturnvaluewith1}if(TMTouchBit(session_handle,$01)=$01)thenbegin{Accessdevice}If(TMAccess(session_handle,@StateBuf)=1)thenbegin{Sendreadscratchcommandbysetting$BEtooutbyteinTMTouchByte}TMTouchByte(session_handle,$BE);CRC8:=0;{Readscratch(setting$FFtooutbyteinTMTouchByte)andcheckcrcforeachbyte}fori:=0to7dobeginrbuf[i]:=TMTouchByte(session_handle,$FF);CRCByte:=Byte(rbuf[i]);{thebytetorunthroughCRC8routine}CRC8:=TMCRC(1,@CRCByte,CRC8,0);end;{Checkcrc}CRCByte:=Byte(TMTouchByte(session_handle,$FF));{thebytetorunthroughCRC8routine}CRC8:=TMCRC(1,@CRCByte,CRC8,0);if(CRC8=0)thenbegin{Calculatethetemperaruretsht:=rbuf[0];if((rbuf[1]and$01)=1)thentsht:=tshtor(-256);tmp1:=Round((tsht)/2);tmp:=tmp1;cr:=rbuf[6];cpc:=rbuf[7];if(rbuf[7]<>0)thentmp:=tmp-(0.25)+(cpc—cr)/cpc;}if((rbuf[1]and$F8)=$F8)thenBEGINENDELSEBEGINcase(rbuf[4]and$60)of$00:beginfenbianlv1:=9;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$f8)/16;diwei1:=(rbuf[0]and$f8)/16;end;$20:beginfenbianlv1:=10;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$fc)/16;diwei1:=(rbuf[0]and$fc)/16;end;$40:beginfenbianlv1:=11;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$fe)/16;diwei1:=(rbuf[0]and$fe)/16;end;$60:beginfenbianlv1:=12;tmp:=(rbuf[1]and$07)*16+rbuf[0]/16;diwei1:=rbuf[0]/16;end;end;END;tmpf:=(tmp*9)/5+32;label4.caption:='Currenttemp1:’+FormatFloat('0.0000',tmp)+'Cor'+FormatFloat(’0.0000',tmpf)+'F’;keke1:=FormatFloat('0.0000',tmp);yuanshi1:=rbuf[4];shangxian1:=rbuf[2]and$7f;xiaxianbyte:=rbuf[3]and$80;ifxiaxianbyte=1thenxiaxian1:=(rbuf[3]and$7f)*(-1)elsexiaxian1:=rbuf[3]and$7f;MessageBeep(0);TMEndSession(session_handle);Done:=True;end;end;end;end;end;end;procedureTForm1.FindSecondFamily(family:smallint;SHandle:longint);vari,flag:smallint;romstr:string;rom:array[0。.8]ofsmallint;begin{Setuptofindthefirstdevicewiththefamily'family'}if(TMFamilySearchSetup(SHandle,@stateBuf,family)=1)thenbegin{Getfirstdevice}if(TMNext(SHandle,@stateBuf)=1)thenif(TMNext(SHandle,@stateBuf)=1)thenbegin{Readtheromnumberbysettingrom[0]to0forreadingandusingTMRom}rom[0]:=0;TMRom(SHandle,@stateBuf,@rom);{Checkifcorrecttype}romstr:=’';if((familyand$7F)=(rom[0]and$7F))thenbeginfori:=7downto0doromstr:=romstr+IntToHex(ROM[i],2);Label10。caption:=’SerialROMID2:’+romstr;ReadTemperature2(SHandle);endelsebeginShowMessage('ThereisnoTemperatureDeviceontheport’);halt;end;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport');halt;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport’);halt;end;endelsebeginTMEndSession(SHandle);ShowMessage('ThereisnoTemperatureDeviceontheport’);halt;end;end;procedureTForm1。ReadTemperature2(session_handle:longint);vartsht,i,tmp1:smallint;cr,cpc,tmpf,tmp:Extended;rbuf:array[0.。9]ofsmallint;st:longint;CRCByte,xiaxianbyte:Byte;begintmp:=0.00;{accessthedevice}if(TMAccess(session_handle,@StateBuf)=1)thenbegin{SendtherecallE2command(bysetting$B8tooutbyteinTMTouchByte)makesureScratchiscorrect}TMTouchByte(session_handle,$B8);{SendthestartTcommand}if(TMAccess(session_handle,@StateBuf)=1)thenbegin{PreparethestrongpullupafternextTMTouchByte}TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_STRONG_PULL_UP,PRIMED_BYTE);{Sendtheconversioncommand(bysetting$44tooutbyteinTMTouchByte)}TMTouchByte(session_handle,$44);{Sleepforasecond}st:=GetTickCount+1000;While(GetTickCount<st)doTMValidSession(Session_handle);{Disablethestrongpullup}TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE);{verifyconversioniscompletebysetting$01tooutbitinTMTouchBitandcheckthereturnvaluewith1}if(TMTouchBit(session_handle,$01)=$01)thenbegin{Accessdevice}If(TMAccess(session_handle,@StateBuf)=1)thenbegin{Sendreadscratchcommandbysetting$BEtooutbyteinTMTouchByte}TMTouchByte(session_handle,$BE);CRC8:=0;{Readscratch(setting$FFtooutbyteinTMTouchByte)andcheckcrcforeachbyte}fori:=0to7dobeginrbuf[i]:=TMTouchByte(session_handle,$FF);CRCByte:=Byte(rbuf[i]);{thebytetorunthroughCRC8routine}CRC8:=TMCRC(1,@CRCByte,CRC8,0);end;{Checkcrc}CRCByte:=Byte(TMTouchByte(session_handle,$FF));{thebytetorunthroughCRC8routine}CRC8:=TMCRC(1,@CRCByte,CRC8,0);if(CRC8=0)thenbegin{Calculatethetemperaruretsht:=rbuf[0];if((rbuf[1]and$01)=1)thentsht:=tshtor(-256);tmp1:=Round((tsht)/2);tmp:=tmp1;cr:=rbuf[6];cpc:=rbuf[7];if(rbuf[7]〈>0)thentmp:=tmp—(0。25)+(cpc-cr)/cpc;}if((rbuf[1]and$F8)=$F8)thenBEGINENDELSEBEGINcase(rbuf[4]and$60)of$00:begintmp:=(rbuf[1]and$07)*16+(rbuf[0]and$f8)/16;fenbianlv2:=9;diwei2:=(rbuf[0]and$f8)/16;end;$20:beginfenbianlv2:=10;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$fc)/16;diwei2:=(rbuf[0]and$fc)/16;end;$40:beginfenbianlv2:=11;tmp:=(rbuf[1]and$07)*16+(rbuf[0]and$fe)/16;//11位分辨率diwei2:=(rbuf[0]and$fe)/16;end;$60:beginfenbianlv2:=12;tmp:=(rbuf[1]and$07)*16+rbuf[0]/16;//12位分辨率diwei2:=rbuf[0]/16;end;end;END;tmpf:=(tmp*9)/5+32;label11。caption:=’Currenttemp2:’+FormatFloat('0。0000’,tmp)+’Cor’+FormatFloat('0.0000',tmpf)+’F';keke2:=FormatFloat('0.0000’,tmp);yuanshi2:=rbuf[4];shangxian2:=rbuf[2]and$7f;xiaxianbyte:=rbuf[3]and$80;ifxiaxianbyte=1thenxiaxian2:=(rbuf[3]and$7f)*(-1)elsexiaxian2:=rbuf[3]and$7f;MessageBeep(0);TMEndSession(session_handle);Done:=True;end;end;end;end;end;end;procedureTForm1.Image1Click(Sender:TObject);begindieer:=true;//全局变量用来动态显示温度柱状图end;procedureTForm1.Button2Click(Sender:TObject);varRetValue,i:smallint;PortNum,PortType:smallint;beginif(radiobutton3.Checked)thenbeginedit9.Text:='';edit4.Text:='';edit5。Text:=’';edit6.Text:='';edit7.Text:=’';edit8.Text:='’;RetValue:=TMReadDefaultPort(@PortNum,@PortType);SHandle:=TMExtendedStartSession(PortNum,PortType,NIL);FindFirstFamily($28,SHandle);edit9.Text:=inttostr(fenbianlv1);edit4.Text:=floattostr(gaowei1);edit5.Text:=floattostr(diwei1);edit6.Text:=floattostr(shangxian1);edit7。Text:=floattostr(xiaxian1);edit8.Text:=floattostr(yuanshi1);end;if(radiobutton4.Checked)thenbeginedit9.Text:='';edit4.Text:='';edit5.Text:='’;edit6.Text:=’’;edit7.Text:='’;edit8.Text:='';RetValue:=TMReadDefaultPort(@PortNum,@PortType);SHandle:=TMExtendedStartSession(PortNum,PortType,NIL);FindSecondFamily($28,SHandle);edit4.Text:=floattostr(gaowei2);edit9。Text:=floattostr(fenbianlv2);edit5。Text:=floattostr(diwei2);edit6.Text:=floattostr(shangxian2);edit7.Text:=floattostr(xiaxian2);edit8.Text:=floattostr(yuanshi2);end;end;procedureTForm1.Button3Click(Sender:TObject);varn,m,h:integer;o,p:single;a,b:string;beginh:=0;label24。Caption:=’50’;label25。Caption:='25’;label23.Caption:='0’;label22.Caption:=’50';label26.Caption:='25’;label6。Caption:='0’;paintbox1。Canvas。Pixels[0,128]:=clBlack;paintbox1。Canvas.Pixels[1,127]:=clBlack;paintbox1.Canvas.Pixels[1,129]:=clBlack;paintbox1.Canvas.Pixels[2,127]:=clBlack;paintbox1。Canvas.Pixels[2,129]:=clBlack;paintbox1。Canvas。Pixels[2,128]:=clBlack;paintbox1。Canvas。MoveTo(0,45);paintbox1.Canvas.LineTo(0,230);paintbox1.Canvas。MoveTo(0,128);paintbox1.Canvas。LineTo(425,128);paintbox1.Canvas。MoveTo(0,230);paintbox1。Canvas。LineTo(425,230);paintbox1.Canvas.MoveTo(0,45);paintbox1.Canvas。LineTo(5,57);paintbox1.Canvas。MoveTo(0,135);paintbox1.Canvas。LineTo(5,147);paintbox1。Canvas。MoveTo(0,200);paintbox1。Canvas。LineTo(7,200);paintbox1.Canvas.MoveTo(0,98);paintbox1。Canvas.LineTo(7,98);paintbox1.Canvas.MoveTo(0,128);table1。Active:=true;table1.First;ifradiobutton5.Checkedthenbeginwhilenottable1。Eofdobegina:=table1.FieldValues['TempC1'];b:=table1.FieldValues['TempC2'];o:=strtofloat(a);p:=strtofloat(b);a:=FormatFloat('00',o);b:=FormatFloat(’00’,p);n:=128—strtoint(a);h:=h+5;Paintbox1.Canvas。LineTo(h,n);table1。Next;end;end;ifradiobutton6。Checkedthenbeginpaintbox1。Canvas。MoveTo(0,230);whilenottable1。Eofdobegina:=table1。FieldValues['TempC1’];b:=table1.FieldValues[’TempC2'];o:=strtofloat(a);p:=strtofloat(b);a:=FormatFloat(’00',o);b:=FormatFloat('00',p);m:=230—strtoint(b);h:=h+5;Paintbox1.Canvas.LineTo(h,m);table1.Next;end;end;end;procedureTForm1.Button1Click(Sender:TObject);varrbuf1:array[0.。4]ofbyte;l,m,n:integer;o,p,q,z:smallint;RetValue,i:smallint;PortNum,PortType:smallint;rbuf:array[0..9]ofsmallint;CRCByte:Byte;st:longint;rom:array[0..8]ofsmallint;beginl:=strtoint(edit1.Text);m:=strtoint(edit2.Text);n:=strtoint(edit3。Text);ifn=9thenn:=31elseifn=10thenn:=63elseifn=11thenn:=95elseifn=12thenn:=127elsebeginshowmessage('errornumber,pleaseinputtherightnumber(9~12)');halt;end;RetValue:=TMReadDefaultPort(@PortNum,@PortType);//从这里开始不能改有关时序的问题,改了可能出错SHandle:=TMExtendedStartSession(PortNum,PortType,NIL);If(SHandle〉0)Thenbeginif(TMSetup(SHandle)=1)thenifradiobutton1。Checked=truethen//写入第一个温度传感器ﻩif(TMFirst(SHandle,@stateBuf)=1)thenﻩbeginﻩﻩif(TMAccess(SHandle,@StateBuf)=1)thenﻩﻩbeginﻩﻩﻩ//i:=TMBlockStream(SHandle,@rbuf1,4); ﻩ //ifi=4then//beginif(TMTouchByte(SHandle,$4E)>0)then///$4E是写命令且判断是否传递成功beginif(TMTouchByte(SHandle,l)<0)then//传递温度上限且判断是否传递成功halt;if(TMTouchByte(SHandle,m)=255)then//传递温度下限且判断是否传递成功halt;if(TMTouchByte(SHandle,n)〈0)then//传递精度且判断是否传递成功halt;end;TMAccess(SHandle,@StateBuf);TMTouchByte(SHandle,$48);//这里是写道E2Rom里所以用上拉电压TMOneWireLevel(SHandle,LEVEL_SET,LEVEL_STRONG_PULL_UP,PRIMED_BYTE);st:=GetTickCount+1000;while(GetTickCount<st)do;TMOneWireLevel(SHandle,LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE);ﻩ ﻩﻩﻩ ﻩﻩﻩ//恢复正常电压//TMEndSession(SHandle);//ifi〉=0then//begin//TMTouchByte(SHandle,$B8);TMAccess(SHandle,@StateBuf);TMTouchByte(SHandle,$BE);CRC8:=0;fori:=0to7dobeginrbuf[i]:=TMTouchByte(SHandle,$FF);//CRCByte:=Byte(rbuf[i]);{thebytetorunthroughCRC8routine}//CRC8:=TMCRC(1,@CRCByte,CRC8,0);end;//end//else//showmessage(’errorTM$48');//end ﻩ//else ﻩ//showmessage('errortmBlock’); end else ﻩshowmessage(’errorTmAccess');ﻩendﻩelse showmessage('errorTMnext');ifradiobutton2.Checked=truethen//写入第二个温度传感器下面就是复制的代码if(TMFirst(SHandle,@stateBuf)=1)thenif(TMNext(SHandle,@stateBuf)=1)thenﻩbeginﻩﻩif(TMAccess(SHandle,@StateBuf)=1)thenﻩﻩbegin //i:=TMBlockStream(SHandle,@rbuf1,4);ﻩﻩﻩ//ifi=4then//beginif(TMTouchByte(SHandle,$4E)>0)thenbeginif(TMTouchByte(SHandle,l)〈0)thenhalt;if(TMTouchByte(SHandle,m)=255)thenhalt;if(TMTouchByte(SHandle,n)<0)thenhalt;end;TMAccess(SHandle,@StateBuf);TMTouchByte(SHandle,$48);TMOneWireLevel(SHandle,LEVEL_SET,LEVEL_STRONG_PULL_UP,PRIMED_BYTE);st:=GetTickCount+1000;while(GetTickCount〈st)do;TMOneWireLevel(SHandle,LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE);//TMEndSession(SHandle);//ifi>=0then//begin//TMTouchByte(SHandle,$B8);TMAccess(SHandle,@StateBuf);TMTouchByte(SHandle,$BE);CRC8:=0;fori:=0to7dobeginrbuf[i]:=TMTouchByte(SHandle,$FF);//CRCByte:=Byte(rbuf[i]);{thebytetorunthroughCRC8routine}//CRC8:=TMCRC(1,@CRCByte,CRC8,0);end;//end//else//showmessage('errorTM$48’);//endﻩ //else ﻩﻩ//showmessage('errortmBlock'); endﻩﻩelseﻩ showmessage('errorTmAccess');ﻩend else showmessage('errorTMnext’);//else//showmessage(’errorTMFamily’);endelseshowmessage(’errorSHandle’);end;procedureTForm1.Button4Click(Sender:TObject);beginbutton4。Enabled:=false;button5。Enabled:=true;timer1.Enabled:=true;end;procedureTForm1.Timer1Timer(Sender:TObject);varPortNum,PortType:smallint;RetValue:smallint;st:longint;beginifdieerthenbeginProgressbar1.Step:=1;whileprogressbar1。Position〈strtofloat(keke1)dobeginprogressbar1.StepIt;end;progressbar2。Step:=1;whileprogressbar2.Position<strtofloat(keke2)dobeginprogressbar2.StepIt;end;label18.Caption:=keke1;label19.caption:=keke2;end;RetValue:=TMReadDefaultPort(@PortNum,@PortType);SHandle:=TMExtendedStartSession(PortNum,PortType,NIL);FindFirstFamily($28,SHandle);RetValue:=TMReadDefaultPort(@PortNum,@PortType);SHandle:=TMExtendedStartSession(PortNum,PortType,NIL);FindSecondFamily($28,SHandle);label18.Caption:=keke1;label19。caption:=keke2;table1.Active:=true;iftable1.CanModifythenbegintable1。Append;table1。Fields[0].AsDateTime:=now;table1.Fields[1].AsString:=floattostr(diwei1);table1。Fields[2].AsFloat:=shangxian1;table1.Fields[3].AsFloat:=xiaxian1;table1.Fields[4]。AsString:=floattostr(diwei2);table1.Fields[5].AsFloat:=shangxian2;table1。Fields[6]。AsFloat:=xiaxian2;table1.Post;end;st:=GetTickCount+1000;While(GetTickCount〈st)do;TMEndSession(SHandle);end;procedureTForm1.Button5Click(Sender:TObject);beginbutton4.Enabled:=true;button5。Enabled:=false;timer1。Enabled:=false;dieer:=false;end;end.基于单片机的防水型温度智能监控系统摘要:本文设计了一种由STC89C52单片机和防水温度传感器构成的温度智能监控系统,温度信号由防水型温度传感器DS18B20采集,并以数字信号的方式传送给单片机。本文介绍了该控制系统的硬件部分,包括:温度检测电路、温度
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淮阴师范学院《数字电子技术基础》2021-2022学年期末试卷
- 淮阴师范学院《基础和声(2)》2022-2023学年第一学期期末试卷
- 淮阴师范学院《证券法》2023-2024学年第一学期期末试卷
- 淮阴工学院《税务代理》2021-2022学年第一学期期末试卷
- 淮阴工学院《设施规划与物流分析》2023-2024学年第一学期期末试卷
- DB4414T+30-2024柑橘种质资源圃建设和管理规范
- DB2310-T 141-2024红松苗芽接培育技术规程
- 文书模板-《小区停车自治管理方案》
- 钢结构大棚安拆专项施工方案
- 林业项目融资与资本运作考核试卷
- 高考名句名篇《菩萨蛮 书江西造口壁》课件
- 兽医病理学智慧树知到期末考试答案章节答案2024年浙江农林大学
- 大学生生涯发展展示 (修改版)
- JT-T 1495-2024 公路水运危险性较大工程专项施工方案编制审查规程
- 教科版小学科学六年级上学期期中考试检测试卷与答案(共5套)
- 运动安全与健康智慧树知到期末考试答案章节答案2024年浙江大学
- 模具设计与制造生涯规划报告
- (完整版)四宫格数独题目204道(可直接打印)及空表(一年级数独题练习)
- 1.1信息社会及其特征课件高中信息技术粤教版必修2
- 小学科学教科版六年级上册全册教案(2023秋)
- 《第1课时 勾股定理》公开课教学课件
评论
0/150
提交评论