温度传感器型号
1.ds18B20基础知识
DS18B20数字温度计是DALLAS公司生产的1线器件,具有电路简单,体积小的特点。所以用它来组成测温系统是非常方便的,电路简单,可以在一条通讯线上挂很多这样的数字温度计。
1和DS18B20产品的特性
(1),通信只需要一个端口。
(2)ds 18b 20中的每个设备都有一个唯一的序列号。
(3)在实际应用中,无需任何外部元件即可实现温度测量。
(4)测量温度范围为-55℃。c到+125。c之间。
(5)用户可以在9位到12位之间选择数字温度计的分辨率。
(6)、内部温度上下限报警设置。
2.DS18B20引脚介绍
TO-92封装中DS18B20的引脚排列如图1所示,引脚功能描述见表1。
(仰视图)图1
表1 DS18B20详细引脚功能描述
序列号
名字
引脚功能描述
1
GND
矮型信号
2
冰雪皇后(Dairy Queen)
数据输入/输出引脚。开漏单总线接口引脚。当用于寄生电源时,它也可以为器件供电。
三
VDD
可选VDD引脚。在寄生电源下工作时,此引脚必须接地。
3.如何使用DS 18B20
由于DS18B20采用1线总线协议,即在一条数据线上实现数据的双向传输,但对于AT89S51单片机,硬件不支持单总线协议。因此,我们必须用软件的方法模拟单总线的协议序列来完成对DS18B20芯片的访问。
因为DS18B20在I/O线上读写数据,所以它对读写数据位有严格的时序要求。DS18B20有严格的通信协议,保证数据传输的正确性和完整性。该协议定义了几个信号的时序:初始化时序、读取时序和写入时序。所有时序都以主机作为主设备,单总线设备作为从设备。每个命令和数据传输都从主机主动启动写序列开始。如果要求单总线器件发送回数据,在写命令之后,主机需要启动读序列来完成数据接收。数据和命令的传输是低位优先。
DS18B20的复位时序
DS18B20的读取时序
DS18B20的读取时序分为读取0时序和读取1时序两个过程。
对于DS18B20,从主机上拉下单总线后,必须在15秒内释放单总线,这样DS18B20才能向单总线传输数据。DS18B20至少需要60us来完成一个读取序列。
DS18B20的写时序
DS18B20的写时序仍然分为写0时序和写1时序两个过程。
DS18B20写0序列和1序列有不同的要求。写入0序列时,单总线应至少下拉60us,以确保DS18B20能够在15us和45us之间正确采样IO总线上的“0”电平。当写入1序列时,单总线应为
4.实验任务
温度测量系统由一片DS18B20组成。测量温度精度达到0.1度,测量温度范围为-20度至+100度,由8位数码管显示。
5.电路原理图
6.系统板上的硬件连接
(1).用8芯电缆将“单片机系统”区的P0.0-P0.7连接到“动态数字显示”区的ABCDEFGH端子上。
(2)用一根8芯电缆将“单片机系统”区的P2.0-P2.7连接到“动态数字显示”区的S1S2S3S4S5S6S7S8端子上。
(3)将DS18B20芯片插入“四路单总线”区域的任意插座,注意不要将电源和接地信号接反。
(4)将“四路单总线”区域对应的DQ端子连接到“单片机系统”区域的P3.7/RD端子。
7.c语言源程序
#i包括& ltAT89X52。H & gt
#i包括& ltINTRINS.h & gt
无符号字符代码displaybit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f };
无符号字符代码displaycode[]={0x3f,0x06,0x5b,0x4f,
0x66、0x6d、0x7d、0x07、
0x7f、0x6f、0x77、0x7c、
0x39,0x5e,0x79,0x71,0x00,0x 40 };
无符号字符码dotcode[32]={0,3,6,9,12,16,19,22,
25,28,31,34,38,41,44,48,
50,53,56,59,63,66,69,72,
75,78,81,84,88,91,94,97};
无符号字符显示计数;
无符号char displaybuf[8]={16,16,16,16,16,16,16 };
无符号字符时间计数;
无符号字符read data[8];
sbit dq=p3^7;
位sflag
位复位脉冲(无效)
{
无符号字符I;
DQ = 0;
for(I = 255;我& gt0;我-);
DQ = 1;
for(I = 60;我& gt0;我-);
返回(DQ);
for(I = 200;我& gt0;我-);
}
void writecommandtods 18b 20(无符号字符命令)
{
无符号字符I;
无符号字符j;
for(I = 0;我& lt8;i++)
{
if((命令& amp0x01)==0)
{
DQ = 0;
for(j = 35;j & gt0;j-);
DQ = 1;
}
其他
{
DQ = 0;
for(j = 2;j & gt0;j-);
DQ = 1;
for(j = 33;j & gt0;j-);
}
command=_cror_(command,1);
}
}
无符号字符readdatafromds18b20(void)
{
无符号字符I;
无符号字符j;
无符号字符温度;
temp = 0;
for(I = 0;我& lt8;i++)
{
temp=_cror_(temp,1);
DQ = 0;
_ nop _();
_ nop _();
DQ = 1;
for(j = 10;j & gt0;j-);
如果(DQ==1)
{
temp = temp | 0x80
}
其他
{
temp = temp | 0x00
}
for(j = 200;j & gt0;j-);
}
返回(临时);
}
无效总管(无效)
{
TMOD = 0x 01;
TH0 =(65536-4000)/256;
TL0 =(65536-4000)% 256;
ET0 = 1;
EA = 1;
while(resetpulse())。
writecommandtods 18b 20(0x cc);
writecommandtods 18b 20(0x 44);
TR0 = 1;
while(1)
{
}
}
void t0(void)使用0中断1
{
无符号字符x;
无符号整数结果;
TH0 =(65536-4000)/256;
TL0 =(65536-4000)% 256;
if(displaycount==2)
{
P0 = display code[display buf[display count]]| 0x 80;
}
其他
{
P0 =显示代码[display buf[display count]];
}
P2 = display bit[显示计数];
display count++;
if(displaycount==8)
{
display count = 0;
}
time count++;
if(timecount==150)
{
time count = 0;
while(resetpulse())。
writecommandtods 18b 20(0x cc);
writecommandtods 18b 20(0x be);
read data[0]= readdatafromds 18b 20();
read data[1]= readdatafromds 18b 20();
for(x = 0;x & lt8;x++)
{
display buf[x]= 16;
}
sflag = 0;
if((read data[1]& amp;0xf8)!=0x00)
{
sflag = 1;
read data[1]= ~ read data[1];
read data[0]= ~ read data[0];
结果= read data[0]+1;
read data[0]=结果;
if(结果& gt255)
{
read data[1]++;
}
}
read data[1]= read data[1]& lt;& lt4;
readdata[1]= readdata[1]& amp;0x70
x = read data[0];
x = x & gt& gt4;
x = x & amp0x0f
read data[1]= read data[1]| x;
x = 2;
result = readdata[1];
while(结果/10)
{
display buf[x]=结果% 10;
结果=结果/10;
x++;
}
display buf[x]=结果;
if(sflag==1)
{
display buf[x+1]= 17;
}
x = read data[0]& amp;0x0f
x = x & lt& lt1;
display buf[0]=(dot code[x])% 10;
display buf[1]=(dot code[x])/10;
while(resetpulse())。
writecommandtods 18b 20(0x cc);
writecommandtods 18b 20(0x 44);
}
}