DS18B20温度传感器实验报告Word格式.docx
《DS18B20温度传感器实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《DS18B20温度传感器实验报告Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
![DS18B20温度传感器实验报告Word格式.docx](https://file1.bdocx.com/fileroot1/2022-10/26/b3a82df5-3fc8-4c74-9a26-392b7c22797c/b3a82df5-3fc8-4c74-9a26-392b7c22797c1.gif)
2.DS18B20主要特性:
a.适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
b.独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
c.DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
d.DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
e.测温范围-55℃~+125℃,在-10~+85℃时精度为±
0.5℃
f.可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
g.在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
h.测量结果直接输出数字温度信号,以"
一线总线"
串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
i.负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
四、实验步骤
硬件调试比较简单,首先检查电感的焊接是否正确,然后可用万用表测试或通电检测。
软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等的编程及调试。
本次实验采用C语言进行编写,keilC51进行编程调试。
五、实验程序
#include"
STC15F104E.h"
intrins.h"
stdio.h"
#defineuintunsignedint
#defineucharunsignedchar
sbitrs=P3^5;
sbitrw=P3^6;
sbiten=P3^7;
sbitDS=P3^2;
ucharn,m=0;
uchart;
uintROM_COAD[9];
uintlie[8];
ucharcodetable[]="
TEMP:
"
;
ucharcodetable1[]="
ERROR"
ucharcodetable3[]="
0123456789abcdef"
ucharcodecrc_array[256]={
0x00,0x5e,0xbc,0xe2,0x61,0x3f,0xdd,0x83,
0xc2,0x9c,0x7e,0x20,0xa3,0xfd,0x1f,0x41,
0x9d,0xc3,0x21,0x7f,0xfc,0xa2,0x40,0x1e,
0x5f,0x01,0xe3,0xbd,0x3e,0x60,0x82,0xdc,
0x23,0x7d,0x9f,0xc1,0x42,0x1c,0xfe,0xa0,
0xe1,0xbf,0x5d,0x03,0x80,0xde,0x3c,0x62,
0xbe,0xe0,0x02,0x5c,0xdf,0x81,0x63,0x3d,
0x7c,0x22,0xc0,0x9e,0x1d,0x43,0xa1,0xff,
0x46,0x18,0xfa,0xa4,0x27,0x79,0x9b,0xc5,
0x84,0xda,0x38,0x66,0xe5,0xbb,0x59,0x07,
0xdb,0x85,0x67,0x39,0xba,0xe4,0x06,0x58,
0x19,0x47,0xa5,0xfb,0x78,0x26,0xc4,0x9a,
0x65,0x3b,0xd9,0x87,0x04,0x5a,0xb8,0xe6,
0xa7,0xf9,0x1b,0x45,0xc6,0x98,0x7a,0x24,
0xf8,0xa6,0x44,0x1a,0x99,0xc7,0x25,0x7b,
0x3a,0x64,0x86,0xd8,0x5b,0x05,0xe7,0xb9,
0x8c,0xd2,0x30,0x6e,0xed,0xb3,0x51,0x0f,
0x4e,0x10,0xf2,0xac,0x2f,0x71,0x93,0xcd,
0x11,0x4f,0xad,0xf3,0x70,0x2e,0xcc,0x92,
0xd3,0x8d,0x6f,0x31,0xb2,0xec,0x0e,0x50,
0xaf,0xf1,0x13,0x4d,0xce,0x90,0x72,0x2c,
0x6d,0x33,0xd1,0x8f,0x0c,0x52,0xb0,0xee,
0x32,0x6c,0x8e,0xd0,0x53,0x0d,0xef,0xb1,
0xf0,0xae,0x4c,0x12,0x91,0xcf,0x2d,0x73,
0xca,0x94,0x76,0x28,0xab,0xf5,0x17,0x49,
0x08,0x56,0xb4,0xea,0x69,0x37,0xd5,0x8b,
0x57,0x09,0xeb,0xb5,0x36,0x68,0x8a,0xd4,
0x95,0xcb,0x29,0x77,0xf4,0xaa,0x48,0x16,
0xe9,0xb7,0x55,0x0b,0x88,0xd6,0x34,0x6a,
0x2b,0x75,0x97,0xc9,0x4a,0x14,0xf6,0xa8,
0x74,0x2a,0xc8,0x96,0x15,0x4b,0xa9,0xf7,
0xb6,0xe8,0x0a,0x54,0xd7,0x89,0x6b,0x35,
};
voiddelay(uintn)//延时函数
{
uintx,y;
for(x=n;
x>
0;
x--)
for(y=50;
y>
y--);
}
voidDelay1us()//@12.000MHz
{
_nop_();
}
voidDelay60us()//@12.000MHz
unsignedchari,j;
i=1;
j=176;
do
{
while(--j);
}while(--i);
voidDelay750us()//@12.000MHz
i=9;
j=190;
voidDelay1ms()//@12.000MHz
i=12;
j=169;
voidDelay200us()//@12.000MHz
i=3;
j=82;
voidDelay35us()//@12.000MHz
unsignedchari;
i=102;
while(--i);
voidlcd_wcom(ucharcom)//1602写命令函数
{
rs=0;
rw=0;
//选择写
P1=com;
//把命令字送入P1
delay(10);
//延时一小会儿,让1602准备接收数据
en=1;
//使能线电平变化,命令送入1602的8位数据口
en=0;
}
voidlcd_wdat(uchardat)//1602写数据函数
rs=1;
//选择数据寄存器
rw=0;
P1=dat;
//把要显示的数据送入P1
en=1;
//使能线电平变化,数据送入1602的8位数据口
en=0;
}
voidlcd_init()//1602初始化函数
lcd_wcom(0x38);
//8位数据,双列,5*7字形
lcd_wcom(0x0c);
//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);
//显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01);
//清屏
voidinit_tempr()//DS18B20初始化
DS=1;
Delay1us();
DS=0;
Delay750us();
Delay1ms();
ucharread_byte(void)
uchari,value;
_nop_();
for(i=0;
i<
8;
i++)
value>
>
=1;
if(DS)value|=0x80;
Delay200us();
returnvalue;
voidwrite_byte(uchardat)
uchari;
DS=dat&
0x01;
Delay60us(