【12】温度传感器
本课资源下载
共 2 个资源课程笔记
本节目标概括
创建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 P4223// 复位DS18B20,并读取从机是否存在4bit DS18B20_Reset(void)5{6 bit presence;78 DQ = 0;9 delay(1); // 主机拉低不少于480us10 DQ = 1;11 Delay10us(7); // 等待70us12 presence = DQ; // 读取从机应答13 delay(1);1415 return !presence; // 返回1表示芯片存在16}1718// 写一个字节19void DS18B20_WriteByte(unsigned char byte)20{21 unsigned char data i;2223 for (i = 0; i < 8; i++)24 {25 if (byte & 0x01)26 {27 // 写128 DQ = 0;29 DELAY_1US;30 DQ = 1;31 Delay10us(10);32 }33 else34 {35 // 写036 DQ = 0;37 Delay10us(9);38 DQ = 1;39 Delay10us(1);40 }41 byte >>= 1;42 }43 Delay10us(5);44}4546// 读一个字节47unsigned char DS18B20_ReadByte(void)48{49 unsigned char data i, byte = 0;50 unsigned char data bitval = 0;5152 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}6566// 启动温度转换(此函数会阻塞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); // 转换需要750ms74}7576// 写配置字节(分辨率设置)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}8889// 读取温度90// temperature的值:91// 低8位(LSB):小数部分,每个单位代表0.0625°C92// 高8位(MSB):整数部分93// 例如:0x0160 = 22.375°C94int DS18B20_ReadTemperature(void)95{96 unsigned char LSB, MSB;97 int pdata temperature;9899 DS18B20_Reset();100 delay(1);101 DS18B20_WriteByte(SKIP_ROM);102 DS18B20_WriteByte(READ_SCRATCHPAD);103104 LSB = DS18B20_ReadByte();105 MSB = DS18B20_ReadByte();106107 DS18B20_Reset();108109 temperature = (MSB << 8) | LSB;110111 return temperature;112}113114// 计算浮点温度值(摄氏度)115// temperature的值:116// 低8位(LSB):小数部分,每个单位代表0.0625°C117// 高8位(MSB):整数部分118// 例如:0x0160 = 22.375°C119float 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"56void main(void)7{8 xdata unsigned char showData[20];9 float temperature = 0.0f;1011 LCD_Init();12 LCD_ShowString(1, 1, "Temperature");1314 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);2425 delay(100);26 }27}