波特律动
课程中心/51单片机教程/P11 温度传感器

P11 温度传感器

DS18B20温度传感器

板载DS18B20传感器规格:(详细可参考资料包中的手册)

参数名称

符号

工作条件

最小值

典型值

最大值

单位

供电电压

VDD​

本地供电

3

5.5

V

上拉供电电压

VPU​

寄生供电本地供电

6

———

+5.5VDD​

VV

测温误差

tERR​

-10℃ ~ +85℃-30℃ ~ +100℃-55℃ ~ +125℃

———

±0.5±1±2

输入低逻辑电平

VIL​


-0.3

0.8

V

输入高逻辑电平

VIH​

本地供电寄生供电

5.2

取 5.5 与VDD​+0.3两者中的较小值

V

灌电流

IL​

输入输出引脚电压VI/O​=0.4V

4

mA

待机电流

IDDS​


750

1000

nA

工作电流

IDD​

VDD​=5V

1

1.5

mA

DQ 引脚输入电流

IDQ​


5

μA

温漂

Drift


±0.2

学习板上的DS18B20传感器:

烧录例程代码后,可以在lcd屏幕上看到温度信息

例程讲解

下面介绍了如何自己实现该例程的功能
DS18B20.C 温度驱动工程包括:

C语言
1unsigned char OneWire_Init(void)
2{
3unsigned char i;
4unsigned char AckBit;
5OneWire_DQ=1;
6OneWire_DQ=0;
7i = 247;while (--i); //Delay 500us
8OneWire_DQ=1;
9i = 32;while (--i); //Delay 70us
10AckBit=OneWire_DQ;
11i = 247;while (--i); //Delay 500us
12return AckBit;
13}
14/**
15@brief 单总线发送一位
16@param Bit 要发送的位
17@retval 无
18*/
19void OneWire_SendBit(unsigned char Bit)
20{
21unsigned char i;
22OneWire_DQ=0;
23i = 4;while (--i); //Delay 10us
24OneWire_DQ=Bit;
25i = 24;while (--i); //Delay 50us
26OneWire_DQ=1;
27}
28/**
29@brief 单总线接收一位
30@param 无
31@retval 读取的位
32*/
33unsigned char OneWire_ReceiveBit(void)
34{
35unsigned char i;
36unsigned char Bit;
37OneWire_DQ=0;
38i = 2;while (--i); //Delay 5us
39OneWire_DQ=1;
40i = 2;while (--i); //Delay 5us
41Bit=OneWire_DQ;
42i = 24;while (--i); //Delay 50us
43return Bit;
44}
45/**
46@brief 单总线发送一个字节
47@param Byte 要发送的字节
48@retval 无
49*/
50void OneWire_SendByte(unsigned char Byte)
51{
52unsigned char i;
53for(i=0;i<8;i++)
54{
55OneWire_SendBit(Byte&(0x01<<i));
56}
57}
58/**
59@brief 单总线接收一个字节
60@param 无
61@retval 接收的一个字节
62*/
63unsigned char OneWire_ReceiveByte(void)
64{
65unsigned char i;
66unsigned char Byte=0x00;
67for(i=0;i<8;i++)
68{
69if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
70}
71return Byte;
72}

头文件需要

C语言
1#include <STC89C5xRC.H>
2#include "LCD1602.h"
3#include "DS18B20.h"
4#include "Delay.h"

主要读取和显示逻辑:

C语言
1void main()
2{
3float T;
4LCD_Init();
5DS18B20_ConvertT(); //上电先转换一次温度,防止第一次读数据错误
6Delay(1000); //等待转换完成
7LCD_ShowString(1,1,"Temperature:");
8while(1)
9{
10Delay(1000);
11DS18B20_ConvertT(); //转换温度
12T=DS18B20_ReadT(); //读取温度
13if(T<0) //如果温度小于0
14{
15LCD_ShowChar(2,1,'-'); //显示负号
16T=-T; //将温度变为正数
17}
18else //如果温度大于等于0
19{
20LCD_ShowChar(2,1,'+'); //显示正号
21}
22LCD_ShowNum(2,2,T,3); //显示温度整数部分
23LCD_ShowChar(2,5,'.'); //显示小数点
24LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);//显示温度小数部分
25}
26}

其中转换和读取函数为:
DS18B20_ConvertT(); //转换温度

T=DS18B20_ReadT(); //读取温度

其余为lcd显示功能