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

【12】温度传感器



本课资源下载
共 2 个资源
P12温度传感器

本节课的标准源代码工程/可供参考

V1.0压缩包54 KB
下载
DS18B20Z

温度传感器芯片

PDF 文档1.8 MB
预览下载

课程笔记


本节目标概括

创建main.c > 编写点灯代码 > 编译HEX文件 > 下载到学习板 > 读取温度

DS18B20温度传感器

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

参数名称

符号

工作条件

最小值

典型值

最大值

单位

测温误差

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

DQ 引脚输入电流

IDQ​


—

5

—

μA

温漂

Drift


—

±0.2

—

℃

学习板上的DS18B20传感器:

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

例程讲解

下面介绍了如何自己实现该例程的功能

DS18B20.C 温度驱动工程包括:

C语言
1#define DQ P42
2
3// 复位DS18B20,并读取从机是否存在
4bit DS18B20_Reset(void)
5{
6 bit presence;
7
8 DQ = 0;
9 delay(1); // 主机拉低不少于480us
10 DQ = 1;
11 Delay10us(7); // 等待70us
12 presence = DQ; // 读取从机应答
13 delay(1);
14
15 return !presence; // 返回1表示芯片存在
16}
17
18// 写一个字节
19void DS18B20_WriteByte(unsigned char byte)
20{
21 unsigned char data i;
22
23 for (i = 0; i < 8; i++)
24 {
25 if (byte & 0x01)
26 {
27 // 写1
28 DQ = 0;
29 DELAY_1US;
30 DQ = 1;
31 Delay10us(10);
32 }
33 else
34 {
35 // 写0
36 DQ = 0;
37 Delay10us(9);
38 DQ = 1;
39 Delay10us(1);
40 }
41 byte >>= 1;
42 }
43 Delay10us(5);
44}
45
46// 读一个字节
47unsigned char DS18B20_ReadByte(void)
48{
49 unsigned char data i, byte = 0;
50 unsigned char data bitval = 0;
51
52 for (i = 0; i < 8; i++)
53 {
54 DQ = 0;
55 DELAY_1US;
56 DELAY_1US;
57 DQ = 1;
58 Delay10us(1);
59 bitval = DQ;
60 byte |= (bitval << i);
61 Delay10us(5);
62 }
63 return byte;
64}
65
66// 启动温度转换(此函数会阻塞750毫秒 以等待完成)
67void DS18B20_StartConvert(void)
68{
69 DS18B20_Reset();
70 delay(1);
71 DS18B20_WriteByte(SKIP_ROM);
72 DS18B20_WriteByte(CONVERT_T);
73 delay(750); // 转换需要750ms
74}
75
76// 写配置字节(分辨率设置)
77void DS18B20_WriteConfig(unsigned char config)
78{
79 DS18B20_Reset();
80 delay(1);
81 DS18B20_WriteByte(SKIP_ROM);
82 DS18B20_WriteByte(WRITE_SCRATCHPAD);
83 DS18B20_WriteByte(0xFF); // 设置高温报警值
84 DS18B20_WriteByte(0x00); // 设置低温报警值
85 DS18B20_WriteByte(config); // 设置配置字节
86 delay(1);
87}
88
89// 读取温度
90// temperature的值:
91// 低8位(LSB):小数部分,每个单位代表0.0625°C
92// 高8位(MSB):整数部分
93// 例如:0x0160 = 22.375°C
94int DS18B20_ReadTemperature(void)
95{
96 unsigned char LSB, MSB;
97 int pdata temperature;
98
99 DS18B20_Reset();
100 delay(1);
101 DS18B20_WriteByte(SKIP_ROM);
102 DS18B20_WriteByte(READ_SCRATCHPAD);
103
104 LSB = DS18B20_ReadByte();
105 MSB = DS18B20_ReadByte();
106
107 DS18B20_Reset();
108
109 temperature = (MSB << 8) | LSB;
110
111 return temperature;
112}
113
114// 计算浮点温度值(摄氏度)
115// temperature的值:
116// 低8位(LSB):小数部分,每个单位代表0.0625°C
117// 高8位(MSB):整数部分
118// 例如:0x0160 = 22.375°C
119float DS18B20_RawToFloat(int RawTemperature)
120{
121 return RawTemperature * 0.0625f;
122}


主函数:

  • 现象:LCD1602显示温度(通过DS18b20芯片测温)
C语言
1#include <STC89C5XRC.H>
2#include "Delay.h"
3#include "DS18B20.h"
4#include "LCD1602.h"
5
6void main(void)
7{
8 xdata unsigned char showData[20];
9 float temperature = 0.0f;
10
11 LCD_Init();
12 LCD_ShowString(1, 1, "Temperature");
13
14 while (1)
15 {
16 // 启动转换(阻塞750ms等待完成)
17 DS18B20_StartConvert();
18 // 读取结果,并计算浮点温度值℃
19 temperature = DS18B20_RawToFloat(DS18B20_ReadTemperature());
20 // 显示温度
21 sprintf(showData, "T=%.3f", temperature);
22 LCD_ClearLine(2);
23 LCD_ShowString(2, 1, showData);
24
25 delay(100);
26 }
27}