1、 1) DS18B20的内部结构DS18B20内部结构如图5所示,主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如图7-1-2所示,DQ为数字信号输入输出端;GND为电源地;VDD为外接供电电源输入端,在寄生电源接线方式时接地,见图6。 图5 DS18B20的内部结构 图6 DS18B20的管脚排列ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8X5X41)。ROM的作用是使每一个DS18B20都各不相同
2、,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20中的温度传感器完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0.0625/LSB形式表达,其中S为符号位。例如125的数字输出为07D0H,25.0625的数字输出为0191H,25.0625的数字输出为FF6FH,55的数字输出为FC90H。 高低温报警触发器TH和TL、配置寄存器均由一个字节的EEPROM组成,使用一个存储器功能命令可对TH、TL或配置寄存器写入。其中配置寄存器的格式如下:0 R1 R0 1 MSBLSBR1、R0决定温度转换的精度位数:R1R0=“00”,9位精度,最大转换时间为93.7
3、5ms;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码,可用来保证通信正确。 2) DS18B20的工作时序DS18B20的一线工作协议流程是:初始化ROM操作指令存储器操作指令数据传输。其工作时序包括初始化时序
4、、写时序和读时序,如图7(a)(b)(c)所示。(a)初始化时序(b)写时序(c)读时序图7 DS18B20的工作时序图3) DS18B20与微处理器的连接DS18B20与微处理器的连接如下图8所示。(a)寄生电源工作方式(b)外接电源工作方式图8 DS18B20与微处理器的典型连接图3.1.2 DS2480B1) DS2480B主要特性串口UART/RS232至单总线通信协议的转接桥,可直接连到UART和5V RS232系统中, 支持Dallas全系列单总线器件,如数字温度传感器DS18B20、A/D转换器DS2450等;将主机从单总线时序控制中解脱出来,提供规范的、灵活的和强驱动的单总线定
5、时;支持标准UART通信,支持9.6(默认)、19.2、57.6和115.2 kbps速率;具有较强的总线驱动能力,通信距离可达300 m;可编程下拉摆率控制和有源上拉,工作范围 5 V,-40 +85 ,8引脚SOIC封装。2)管脚图及引脚说明图9 DS2480B的封装和引脚DS2480B为8脚贴片式封装,如图9所示。引脚功能如表1所列引脚号引脚名称引 脚 功 能1GND地线21-W单总线输入输出端3NC悬空4VDD4.55.5V电压5VPPEPROM编程电压6POLRXD/TXD选择端7TXD发送端8RXD接收端表1 引脚功能说明DS2480B工作原理框图如图10所示。图10 DS2480
6、B工作原理框图3) DS2480B与RS232的接口技术:DS2480B与RS232的接口如图11所示。 图11 DS2480B与RS232的接口图 3.2元件清单序号元件个数PC机串行口UART/RS2321 个转接桥DS2480B数字温度传感器DS18B20电容U07HF稳压管2 个二极管M7电路板XF07表2 元件清单4 学习心得通过该温度监控实验,我们可以发现:基于DS18B20数字温度传感器构成的实时监控系统确实具有精度高、抗干扰能力强、电路简单等诸多优点,温度传感器得到电缆长度达到几十米都可以正常读取温度数据,并且已经在站长开发的机房安全监控系统中得到了实际考验,那可是要365天从
7、不间断地对机房及相关设备提供实时温度监控的哦。 相比之下,传统的温度检测系统采用热敏电阻等温度敏感元件,热敏电阻成本低,但需要后续信号调理、AD转换处理电路才能将温度信号转换成数字信号,不但电路复杂,而且热敏电阻的可靠性相对较差,测量温度的精度差,很难保证热敏电阻的一致性和线性,在应用中需要很好的解决引线误差补偿问题、共模干扰问题和放大电路零点漂移误差等技术问题。 因此,如果你开发的系统对温度监控精度要求不是非常高,而且测温的范围DS18B20的-55+125 之间的话,那么采用DS18B20是一个不错的选择,通过软件的插值运算,其实DS18B20的测温精度还可以进一步提高的,具体的实现方法大
8、家可以参考DALLAS公司相关技术资料。当然,如果你有条件的话,也可以预先对每一个DS18B20进行一次校验,在标准恒温箱中测量并记录下每个传感器的测温误差,在实际应用中,我们就可以根据每个传感器的实际校准对读出的实时温度进行适当的误差纠正,这样也不失为提高DS18B20测温精度的一个好办法。可惜的是,并非大家都有这种高精度的恒温箱来校验传感器,如果你的参考温度不准确,那么校准将会适得其反。 通过对这个课程设计的学习,为我们掌握单片机实时温度监控的开发、串口通信程序的开发及计算机串口实时控制开发原理及PC监控软件的开发,以及开发其他功能更加完善的单片机综合应用系统打好基础。5 参考文献1 DS
9、18B20 Programmable Resolution 1-Wire Digital Thermometer2 DS2480B Serial 1-Wire Line Driver with Load Sensor3 左冬红,谢瑞和.实现单总线搜索ROM命令的一种算法4 求是科技.单片机典型模块设计实例导航附:源程序清单- TEMPDL32 : This utility uses TMEX to view a read the temperature from a DS18B20. It requires the 32-Bit Windows TMEX drivers to be prese
10、nt. Compiler : Borland Delphi 5.0 procedure TForm1.FormCreate(Sender: Tobject;Var ztbuf : array0.200 of Char; Typebuf : array 0.200 of Char; i,k,RetValue : smallint; RetStr : SetupDone: Boolean; PortNum, PortType :begindieer :=false; SetupDone := FALSE; TMSetup not done yet Label4.Caption := ; Read
11、default Port Number and Port Type from registry RetValue := TMReadDefaultPort(PortNum, PortType);if (RetValue 0) Then if (TMSetup(SHandle) = 1) then The device that will be found is Temperature Device DS18B20, so Family Type is set to $28 FindFirstFamily($28,SHandle) TMEndSession(SHandle);Fail to se
12、tup MicroLan! end; if (SHandle 0 ) then BeginThe Default Port Type does not have a driver ! Release control back to window Application.ProcessMessages; until (Done); Repeat if (TMSetup(SHandle) = 1) then FindSecondFamily($28,SHandle) label18.Caption :=keke1; label19.caption :=keke2; table1.Active :=
13、true; if table1.CanModify then table1.Append; table1.Fields0.AsDateTime :=now; table1.Fields1.AsString :=floattostr(diwei1); table1.Fields2.AsFloat :=shangxian1; table1.Fields3.AsFloat :=xiaxian1; table1.Fields4.AsString :=floattostr(diwei2); table1.Fields5.AsFloat :=shangxian2; table1.Fields6.AsFlo
14、at:=xiaxian2; table1.Post;end;procedure TForm1.FindFirstFamily(family : SHandle: longint);var i , flag : romstr : string; rom : array0.8 of smallint; Set up to find the first device with the family family if (TMFamilySearchSetup(SHandle,stateBuf,family ) = 1 ) then if (TMNext(SHandle, stateBuf)= 1)
15、then Read the rom number by setting rom0 to 0 for reading and using TMRom rom0 := 0; TMRom(SHandle,stateBuf,rom); Check if correct type if (family and $7F )= (rom0 and $7F) then for i := 7 downto 0 do= romstr + IntToHex(ROMi,2); Label3.caption :Serial ROM ID1 : + romstr; ReadTemperature1(SHandle);Th
16、ere is no Temperature Device on the port halt;procedure TForm1.ReadTemperature1(session_handle : tsht, i, tmp1 : cr,cpc, tmpf,tmp : Extended; rbuf : array0.9 of smallint ; st : longint; CRCByte,xiaxianbyte : Byte; tmp := 0.00; access the device if (TMAccess(session_handle,StateBuf)= 1) then Send the
17、 recall E2 command (by setting $B8 to outbyte in TMTouchByte) make sure Scratch is correct TMTouchByte(session_handle, $B8); Send the start T command if (TMAccess(session_handle,StateBuf) = 1) then Prepare the strong pullup after next TMTouchByte TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_STRONG_
18、PULL_UP, PRIMED_BYTE); Send the conversion command (by setting $44 to outbyte in TMTouchByte) TMTouchByte(session_handle, $44); Sleep for a second= GetTickCount + 1000; While (GetTickCount st) do TMValidSession(Session_handle); Disable the strong pullup TMOneWireLevel(session_handle, LEVEL_SET,LEVEL
19、_NORMAL,PRIMED_NONE); verify conversion is complete by setting $01 to outbit in TMTouchBit and check the return value with 1 if (TMTouchBit(session_handle,$01) = $01) then Access device If (TMAccess(session_handle,StateBuf) = 1 ) then Send read scratch command by setting $BE to outbyte in TMTouchByt
20、e TMTouchByte(session_handle,$BE); CRC8 : Read scratch (setting $FF to outbyte in TMTouchByte) and check crc for each byte= 0 to 7 do rbufi:= TMTouchByte(session_handle, $FF); CRCByte := Byte(rbufi); the byte to run through CRC8 routine = TMCRC(1, CRCByte, CRC8, 0); Check crc= Byte(TMTouchByte(sessi
21、on_handle, $FF); if ( CRC8 = 0 ) then Calculate the temperarure tsht := rbuf0; if (rbuf1 and $01)= 1) then= tsht or (-256); tmp1 := Round(tsht)/2);= tmp1; cr := rbuf6; cpc := rbuf 7; if (rbuf7 0) then= tmp - (0.25) + (cpc-cr)/cpc; if (rbuf1 and $F8)= $F8) then BEGIN END ELSE case (rbuf4 and $60) of $00: fenbianlv1 :=9; tmp:=(rbuf1 and $07)*16+(rbuf0 and $f8)/16; diwei1 :=(rbuf0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1