📄 ds18b20数字温度计使用.htm
字号:
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 36pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt"
vAlign=top width=48>
<P style="TEXT-ALIGN: center" align=center>名称</P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 357.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt"
vAlign=top width=477>
<P style="TEXT-ALIGN: center"
align=center>引脚功能描述</P></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 32.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=43>
<P>1</P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 36pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=48>
<P>GND</P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 357.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=477>
<P>地信号</P></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 32.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=43>
<P>2</P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 36pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=48>
<P>DQ</P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 357.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=477>
<P>数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。</P></TD></TR>
<TR style="HEIGHT: 20.55pt">
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 32.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 20.55pt; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=43>
<P>3</P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 36pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 20.55pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=48>
<P>VDD</P></TD>
<TD
style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 357.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 20.55pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt"
vAlign=top width=477>
<P>可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。</P></TD></TR></TBODY></TABLE>
<P
style="MARGIN-LEFT: 39pt; TEXT-INDENT: -39pt; tab-stops: list 39.0pt left 54.0pt; mso-list: l0 level2 lfo1">3.
DS18B20的使用方法
<P
style="TEXT-INDENT: 21pt; tab-stops: 54.0pt">由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
<P
style="TEXT-INDENT: 21pt; tab-stops: 54.0pt">由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
<P style="TEXT-INDENT: 21pt; tab-stops: 54.0pt">DS18B20的复位时序
<P style="tab-stops: 54.0pt"><IMG height=142
src="DS18B20数字温度计使用.files/200692185725580.gif" width=544
v:shapes="_x0000_i1025">
<P>DS18B20的读时序
<P
style="TEXT-INDENT: 21pt; tab-stops: 54.0pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt">对于DS18B20的读时序分为读0时序和读1时序两个过程。
<P
style="TEXT-INDENT: 21pt; tab-stops: 54.0pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt">对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。
<P style="tab-stops: 54.0pt"><IMG height=152
src="DS18B20数字温度计使用.files/200692185726621.gif" width=544
v:shapes="_x0000_i1026">
<P style="tab-stops: 54.0pt">DS18B20的写时序
<P
style="TEXT-INDENT: 21pt; tab-stops: 54.0pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt">对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
<P
style="TEXT-INDENT: 21pt; tab-stops: 54.0pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt">对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
<P style="tab-stops: 54.0pt"><IMG height=168
src="DS18B20数字温度计使用.files/200692185726360.gif" width=544
v:shapes="_x0000_i1027">
<P style="tab-stops: 54.0pt">
<P
style="MARGIN-LEFT: 39pt; TEXT-INDENT: -39pt; tab-stops: list 39.0pt left 54.0pt; mso-list: l0 level2 lfo1">4.
实验任务
<P
style="TEXT-INDENT: 21pt; tab-stops: 54.0pt">用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来。
<P
style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt; tab-stops: list 36.0pt left 54.0pt; mso-list: l5 level1 lfo8">5.
电路原理图
<P style="tab-stops: 54.0pt"><IMG height=564
src="DS18B20数字温度计使用.files/200692185726371.gif" width=544
v:shapes="_x0000_i1028">
<P style="tab-stops: 54.0pt">
<P
style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt; tab-stops: list 36.0pt left 54.0pt; mso-list: l5 level1 lfo8">6.
系统板上硬件连线
<P
style="MARGIN-LEFT: 70.3pt; TEXT-INDENT: -49.3pt; tab-stops: list 0cm left 54.0pt; mso-list: l4 level1 lfo3">(1).
把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。
<P
style="MARGIN-LEFT: 70.3pt; TEXT-INDENT: -49.3pt; tab-stops: list 0cm left 54.0pt; mso-list: l4 level1 lfo3">(2).
把“单片机系统”区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。
<P
style="MARGIN-LEFT: 70.3pt; TEXT-INDENT: -49.3pt; tab-stops: list 0cm left 54.0pt; mso-list: l4 level1 lfo3">(3).
把DS18B20芯片插入“四路单总线”区域中的任一个插座中,注意电源与地信号不要接反。
<P
style="MARGIN-LEFT: 70.3pt; TEXT-INDENT: -49.3pt; tab-stops: list 0cm left 54.0pt; mso-list: l4 level1 lfo3">(4).
把“四路单总线”区域中的对应的DQ端子连接到“单片机系统”区域中的P3.7/RD端子上。
<P
style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt; tab-stops: list 36.0pt left 54.0pt; mso-list: l5 level1 lfo8">7.
C语言源程序<BR>#include <AT89X52.H><BR>#include
<INTRINS.h><BR> <BR>unsigned char code
displaybit[]={0xfe,0xfd,0xfb,0xf7,<BR>0xef,0xdf,0xbf,0x7f};<BR>unsigned
char code
displaycode[]={0x3f,0x06,0x5b,0x4f,<BR>0x66,0x6d,0x7d,0x07,<BR>0x7f,0x6f,0x77,0x7c,<BR>0x39,0x5e,0x79,0x71,0x00,0x40};<BR>unsigned
char code
dotcode[32]={0,3,6,9,12,16,19,22,<BR>25,28,31,34,38,41,44,48,<BR>50,53,56,59,63,66,69,72,<BR>75,78,81,84,88,91,94,97};<BR>unsigned
char displaycount;<BR>unsigned char
displaybuf[8]={16,16,16,16,16,16,16,16};<BR>unsigned char
timecount;<BR>unsigned char readdata[8]; <BR>sbit
DQ=P3^7;<BR>bit sflag;<BR> <BR>bit
resetpulse(void)<BR>{<BR>unsigned char
i;<BR> <BR>DQ=0;<BR>for(i=255;i>0;i--);<BR>DQ=1;<BR>for(i=60;i>0;i--);<BR>return(DQ);<BR>for(i=200;i>0;i--);<BR>}<BR> <BR>void
writecommandtods18b20(unsigned char command)<BR>{<BR>unsigned
char i;<BR>unsigned char
j;<BR> <BR>for(i=0;i<8;i++)<BR>{<BR>if((command &
0x01)==0)<BR>{<BR>DQ=0;<BR>for(j=35;j>0;j--);<BR>DQ=1;<BR>}<BR>else<BR>{<BR>DQ=0;<BR>for(j=2;j>0;j--);<BR>DQ=1;<BR>for(j=33;j>0;j--);<BR>}<BR>command=_cror_(command,1);<BR>}<BR>}<BR> <BR>unsigned
char readdatafromds18b20(void)<BR>{<BR>unsigned char
i;<BR>unsigned char j;<BR>unsigned char
temp;<BR> <BR>temp=0;<BR>for(i=0;i<8;i++)<BR>{<BR>temp=_cror_(temp,1);<BR>DQ=0;<BR>_nop_();<BR>_nop_();<BR>DQ=1;<BR>for(j=10;j>0;j--);<BR>if(DQ==1)<BR>{<BR>temp=temp
| 0x80;<BR>}<BR>else<BR>{<BR>temp=temp |
0x00;<BR>}<BR>for(j=200;j>0;j--);<BR>}<BR>return(temp);<BR>}<BR> <BR>void
main(void)<BR>{<BR>TMOD=0x01;<BR>TH0=(65536-4000)/256;<BR>TL0=(65536-4000)%256;<BR>ET0=1;<BR>EA=1;<BR> <BR>while(resetpulse());<BR>writecommandtods18b20(0xcc);<BR>writecommandtods18b20(0x44);<BR>TR0=1;<BR>while(1)<BR>{<BR>;<BR>}<BR>}<BR> <BR>void
t0(void) interrupt 1 using 0<BR>{<BR>unsigned char
x;<BR>unsigned int
result;<BR> <BR>TH0=(65536-4000)/256;<BR>TL0=(65536-4000)%256;<BR>if(displaycount==2)<BR>{<BR>P0=displaycode[displaybuf[displaycount]]
|
0x80;<BR>}<BR>else<BR>{<BR>P0=displaycode[displaybuf[displaycount]];<BR>}<BR>P2=displaybit[displaycount];<BR>displaycount++;<BR>if(displaycount==8)<BR>{<BR>displaycount=0;<BR>}<BR> <BR>timecount++;<BR>if(timecount==150)<BR>{<BR>timecount=0;<BR>while(resetpulse());<BR>writecommandtods18b20(0xcc);<BR>writecommandtods18b20(0xbe);<BR>readdata[0]=readdatafromds18b20();<BR>readdata[1]=readdatafromds18b20();<BR>for(x=0;x<8;x++)<BR>{<BR>displaybuf[x]=16;<BR>}<BR>sflag=0;<BR>if((readdata[1]
&
0xf8)!=0x00)<BR>{<BR>sflag=1;<BR>readdata[1]=~readdata[1];<BR>readdata[0]=~readdata[0];<BR>result=readdata[0]+1;<BR>readdata[0]=result;<BR>if(result>255)<BR>{<BR>readdata[1]++;<BR>}<BR>}<BR>readdata[1]=readdata[1]<<4;<BR>readdata[1]=readdata[1]
& 0x70;<BR>x=readdata[0];<BR>x=x>>4;<BR>x=x &
0x0f;<BR>readdata[1]=readdata[1] |
x;<BR>x=2;<BR>result=readdata[1];<BR>while(result/10)<BR>{<BR>displaybuf[x]=result%10;<BR>result=result/10;<BR>x++;<BR>}<BR>displaybuf[x]=result;<BR>if(sflag==1)<BR>{<BR>displaybuf[x+1]=17;<BR>}<BR>x=readdata[0]
&
0x0f;<BR>x=x<<1;<BR>displaybuf[0]=(dotcode[x])%10;<BR>displaybuf[1]=(dotcode[x])/10;<BR>while(resetpulse());<BR>writecommandtods18b20(0xcc);<BR>writecommandtods18b20(0x44);<BR>}<BR>}
</P><SPAN class=style1>(<A class=link3
href="http://www.avrw.com/"
target=_parent>综合电子论坛</A>)</SPAN></TD></TR></TBODY></TABLE>
<P
align=center> *注:部份文章为网上收录供大家共同学习参考之用,并不代表本站意见。如存在版权问题请马上通知我们,我们将马上删除。</P></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE>
<SCRIPT src="DS18B20数字温度计使用.files/floor.htm"></SCRIPT>
<SCRIPT src="DS18B20数字温度计使用.files/homeright.js"></SCRIPT>
<SCRIPT language=javascript src="DS18B20数字温度计使用.files/339405.js"
type=text/javascript></SCRIPT>
<NOSCRIPT><A href="http://www.51.la/?339405" target=_blank><IMG
style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none"
alt=我要啦免费统计 src="DS18B20数字温度计使用.files/go.htm"></A></NOSCRIPT>
<SCRIPT language=JavaScript src="DS18B20数字温度计使用.files/stat.htm"
charset=gb2312></SCRIPT>
<SCRIPT src="DS18B20数字温度计使用.files/shownum.htm"></SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -