DS18B20温度传感器实验报告.docx
《DS18B20温度传感器实验报告.docx》由会员分享,可在线阅读,更多相关《DS18B20温度传感器实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
DS18B20温度传感器实验报告
利用DS18B20温度传感器显示温度实验报告
一、实验目的
1.掌握KeilC51软件与proteus软件联合仿真调试的方法;
2.掌握温度传感器DS18B20的原理及使用方法;
3.设计单片机程序,实现测温显示。
二、实验内容
1.利用数字温度传感器DS18B20测量温度信号;
2.所测得温度采用数字显示,计算后在液晶显示器上显示相应得温度值;
三、实验原理
1.DS18B20工作原理:
DS18B20的测温原理是这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大于被测温度值。
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"
#include"intrins.h"
#include"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>0;y--);
}
voidDelay1us()//@12.000MHz
{
_nop_();
_nop_();
_nop_();
_nop_();
}
voidDelay60us()//@12.000MHz
{
unsignedchari,j;
i=1;
j=176;
do
{
while(--j);
}while(--i);
}
voidDelay750us()//@12.000MHz
{
unsignedchari,j;
i=9;
j=190;
do
{
while(--j);
}while(--i);
}
voidDelay1ms()//@12.000MHz
{
unsignedchari,j;
i=12;
j=169;
do
{
while(--j);
}while(--i);
}
voidDelay200us()//@12.000MHz
{
unsignedchari,j;
i=3;
j=82;
do
{
while(--j);
}while(--i);
}
voidDelay35us()//@12.000MHz
{
unsignedchari;
_nop_();
_nop_();
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
delay(10);//延时一小会儿,让1602准备接收数据
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();
DS=1;
Delay1ms();
}
ucharread_byte(void)
{
uchari,value;
DS=1;_nop_();
for(i=0;i<8;i++)
{
DS=0;
value>>=1;
DS=1;_nop_();_nop_();
if(DS)value|=0x80;Delay200us();DS=1;
}
returnvalue;
}
voidwrite_byte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
DS=0;
DS=dat&0x01;
Delay60us(