赞
踩
DS18B20是一款单总线接口的数字温度传感器,仅需一个IO口即可实现数据通信。这里只对如何简单操作开发板的DS1802进行讲解,关于DS18B20温度传感器的详细操作原理,可参考此博客:DS18B20数字温度传感器操作解析。
下图显示了DS18B20的电路连接。数据总线通过J14排针引出,并连接到所选的IO口。数据总线上需要一个上拉电阻以确保稳定的通信。
DS18B20传感器通常采用TO-92封装或PDIP封装,具有以下三个主要引脚:
引脚详解
初始化过程从主机发送复位脉冲开始。主机将总线拉低至少480微秒(us),通常是500us,以确保所有从设备都能检测到复位信号。复位脉冲后,总线需保持高电平15-60微秒,等待从设备响应。
从设备通过发送存在脉冲来响应,表示它们已经检测到复位信号,并将总线拉低60-240微秒。表明它已检测到复位信号。之后将电平拉高。
sbit DS18B20_DQ = P3^7; unsigned char DS18B20_Init() { unsigned char i; unsigned char ackBit; DS18B20_DQ = 1; DS18B20_DQ = 0; i = 247; while (--i); //延时500us DS18B20_DQ = 1; i = 32; while (--i); ackBit = DS18B20_DQ; i = 247; while (--i); //延时500us return ackBit; }
写时序包括主机发送数据位“0”或“1”到从设备。每个位的写入时序稍有不同。每次写入一个数据位都需要初始化一个写周期。主机将总线拉低至少1微秒(通常是1-15微秒),然后释放总线,这是初始化写周期。
写0时序:
写1时序:
写入一个字节(8位)需要重复上述写0和写1时序八次。写入顺序为低位在前(LSB first)。
假设我们要写入字节0x5A(01011010)。
- 写入0位:主机将总线拉低至少60微秒,释放总线。
- 写入1位:主机将总线拉低至少1微秒,释放总线。
- 写入0位:重复写0时序。
- 写入1位:重复写1时序。
- 写入1位:重复写1时序。
- 写入0位:重复写0时序。
- 写入1位:重复写1时序。
- 写入0位:重复写0时序。
//发送一位 void ds18b20_write_bit(unsigned char bits) { unsigned char i; DS18B20_DQ = 0; i = 4; while (--i); //延时10us DS18B20_DQ = bits; i = 24; while (--i); //延时50us DS18B20_DQ = 1; } //发送字节 void ds18b20_write_byte(unsigned char byte) { unsigned char i; for(i = 0;i<8;i++) { ds18b20_write_bit(byte & 0x01<<i);//先发送低位 } }
每次读取一个数据位都需要初始化一个读周期。初始化读周期期间需要主机将总线拉低至少1微秒(通常是1-15微秒),然后释放总线。之后读取数据位,主机在读周期内读取从设备发送的数据位。需要主机将总线拉低至少1微秒(通常是1-15微秒)。然后释放总线,主机释放总线,并在15微秒内读取总线状态。读取数据位期间如果总线保持低电平,读取到的数据位为0;如果总线拉高,读取到的数据位为1。要读取一个字节(8位),需要重复上述读取数据位的过程八次,按低位在前(LSB first)的顺序读取。
假设我们要读取一个字节的数据,具体步骤如下:
//接收一位 unsigned char ds18b20_read_bit() { unsigned char i; unsigned char bits; DS18B20_DQ = 0; i = 2; while (--i); //延时5us DS18B20_DQ = 1; i = 2; while (--i); //延时5us bits = DS18B20_DQ; i = 24; while (--i); //延时50us return bits; } unsigned char ds18b20_read_byte() { unsigned char i; unsigned char byte = 0x00; for(i = 0;i<8;i++) { if(ds18b20_read_bit()) { byte |= 0x01<<i; } } return byte; }
DS18B20温度传感器的温度转换功能允许用户读取精确的温度数据。为了实现温度转换,必须遵循特定的时序和命令流程。
温度转换流程包括以下几个主要步骤:
//转换温度
void ds18b20_ConvertT()
{
DS18B20_Init();
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0x44);
}
读取DS18B20温度传感器的数据是一个包括命令发送和数据处理的过程。
温度读取过程包括以下几个主要步骤:
先读取低位,后读取高位,温度数据是16位带符号的二进制数,最低位代表
2
−
4
2^{-4}
2−4摄氏度(即0.0625摄氏度)
//读取温度 float ds18b20_ReadT() { unsigned char byteL; unsigned char byteH; int temp; float T; DS18B20_Init(); ds18b20_write_byte(0xCC); ds18b20_write_byte(0xBE); byteL = ds18b20_read_byte();//低字节 byteH = ds18b20_read_byte();//高字节 temp = (byteH << 8) | byteL; T = temp / 16.0; return T; }
LCD1602液晶显示屏实时获取温度变化
#include <REGX52.H> #include <LCD1602.H> #include "stdio.h" sbit DS18B20_DQ = P3^7; unsigned char DS18B20_Init() { unsigned char i; unsigned char ackBit; DS18B20_DQ = 1; DS18B20_DQ = 0; i = 247; while (--i); //延时500us DS18B20_DQ = 1; i = 32; while (--i); ackBit = DS18B20_DQ; i = 247; while (--i); //延时500us return ackBit; } //发送一位 void ds18b20_write_bit(unsigned char bits) { unsigned char i; DS18B20_DQ = 0; i = 4; while (--i); //延时10us DS18B20_DQ = bits; i = 24; while (--i); //延时50us DS18B20_DQ = 1; } //接收一位 unsigned char ds18b20_read_bit() { unsigned char i; unsigned char bits; DS18B20_DQ = 0; i = 2; while (--i); //延时5us DS18B20_DQ = 1; i = 2; while (--i); //延时5us bits = DS18B20_DQ; i = 24; while (--i); //延时50us return bits; } //发送字节 void ds18b20_write_byte(unsigned char byte) { unsigned char i; for(i = 0;i<8;i++) { ds18b20_write_bit(byte & 0x01<<i);//先发送低位 } } unsigned char ds18b20_read_byte() { unsigned char i; unsigned char byte = 0x00; for(i = 0;i<8;i++) { if(ds18b20_read_bit()) { byte |= 0x01<<i; } } return byte; } //转换温度 void ds18b20_ConvertT() { DS18B20_Init(); ds18b20_write_byte(0xCC); ds18b20_write_byte(0x44); } //读取温度 float ds18b20_ReadT() { unsigned char byteL; unsigned char byteH; int temp; float T; DS18B20_Init(); ds18b20_write_byte(0xCC); ds18b20_write_byte(0xBE); byteL = ds18b20_read_byte();//低字节 byteH = ds18b20_read_byte();//高字节 temp = (byteH << 8) | byteL; T = temp / 16.0; return T; } unsigned char ack = 1; float g_T; void main() { char temp_buff[50]; LCD_Init(); LCD_ShowString(1,1,"helloworld"); ack = DS18B20_Init(); LCD_ShowNum(2,1,ack,3); while(1) { ds18b20_ConvertT(); g_T = ds18b20_ReadT(); if(g_T<0) { //负数 LCD_ShowChar(2,1,'-'); g_T = -g_T; } else { LCD_ShowChar(2,1,'+'); } // 使用 sprintf 将浮点数转换为字符串 sprintf(temp_buff, "%.3f", g_T); LCD_ShowString(2,2,temp_buff); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。