读取DS18B20温度、测量环境温度信息(单只DS18B20写法)
一、前言
1.1 功能介绍
随着工业自动化和智能家居技术的不断发展,精确测量和监控环境温度变得尤为重要。在许多应用场景中,如仓库管理、温室控制、空调系统以及工业制造过程中,实时准确地获取环境温度信息对于保障设备正常运行、提高能源利用效率以及优化生产流程具有重要意义。
DS18B20是一款高精度、高可靠性的数字温度传感器,它以其独特的单线接口和直接输出数字信号的特点,简化了温度测量系统的设计。STC90C51作为一款经典的8位微控制器,以其强大的数据处理能力和丰富的I/O端口资源,成为了实现温度读取和控制的理想选择。
本项目设计并实现一个能够实时读取环境温度信息的系统。通过STC90C51对DS18B20进行初始化、控制以及数据读取,可以实现对环境温度的精确测量,并将温度数据通过显示屏或其他输出设备展示给用户。该系统不仅可以提供实时温度监控功能,还可以根据温度数据进行相应的控制操作,如启动或关闭冷却设备、调整空调温度等,以满足不同应用场景对环境温度控制的需求。
本项目的开发背景体现了对环境温度监控和管理的迫切需求,通过结合STC90C51和DS18B20的技术优势,实现一个高效、精确的环境温度测量和控制系统,为工业自动化和智能家居等领域提供有力支持。
1.2 DS1820介绍
DS1820是一款由美国Dallas半导体公司(后被Maxim半导体公司收购)推出的数字化温度传感器,它是世界上第一片支持“一线总线”接口的温度传感器。DS1820以其独特的设计和优异的性能,在温度测量领域占据了重要地位。
DS1820的测量温度范围广泛,覆盖了从-55°C到+125°C的广阔区间。在-10°C到+85°C的范围内,其测量精度高达±0.5°C,这使得DS1820在各种环境条件下都能提供准确可靠的温度数据。
其DS1820采用了独特的“一线总线”接口技术,通过单一的数据线进行通信和供电。这种设计不仅简化了温度测量系统的布线,降低了成本,还提高了系统的抗干扰能力和可靠性。同时,DS1820还支持多个传感器在同一总线上进行连接,方便用户构建多点测温系统。
在内部结构方面,DS1820采用了受温度影响的振荡器和计数器作为核心部件。低温时,振荡器的脉冲可以通过门电路,使计数器对脉冲信号进行计数;高温时,振荡器的脉冲频率发生变化,无法通过门电路,此时计数器的计数值反映了被测温度。通过这种方式,DS1820能够实时、准确地测量环境温度。
DS1820还具有一些其他特性。例如,它支持多种分辨率设置,最高可达12位,从而保证了高精度的温度测量。同时,DS1820还具有报警功能,用户可以根据需要设定报警温度,当温度超过或低于设定值时,DS1820将触发报警机制。
DS1820是一款功能强大、性能优异的数字化温度传感器。它以其独特的“一线总线”接口技术、广泛的测量温度范围、高精度的测量能力以及丰富的功能特性,成为了温度测量领域的佼佼者。无论是在环境控制、设备或过程控制、测温类消费电子产品等领域,DS1820都发挥着重要作用。
二、代码实现
2.1 main.c
#include <reg51.h>
#include "delay.h"
#include "key.h"
#include "type.h"
#include "led.h"
#include "uart.h"
#include "timer.h"
#include "exti.h"
#include "infrared.h"
#include "ds18b20.h"
int main()
{
int temp=0;
UART_Init(); //初始化串口波特率为4800
while(1)
{
temp=DS18B20_ReadTemp();
if(temp<0) //如果温度是负数
{
temp=temp-1;
temp=~temp;
printf("DS18b20=-%d.%d\r\n",temp>>4,temp&0xF);
}
else
{
printf("DS18b20=%d.%d\r\n",temp>>4,temp&0xF);
}
DelayMs(1000);
}
}
2.2 DS18B20.c
#include "ds18b20.h"
/*
说明: 在12MHZ晶振下,12T模式下,i++消耗的时间差不多是12us
*/
/*
函数名称:u8 DS18B20_Init(void)
函数功能:向DS18B20发送复位脉冲,并检测应答信号
返 回 值:1表示失败,0表示成功
说明: 51单片机IO口默认输出高电平
*/
u8 DS18B20_ResetSignal(void)
{
u8 i=0;
//1. 发送复位信号
DS18B20_GPIO=0;//将总线拉低480us
i=50;
while(i--){} //延时600us ,最少480us
i=0;
DS18B20_GPIO=1;//然后释放(拉高)总线,如果DS18B20做出反应会将在15us~60us后总线拉低
//2. 等待DS18B20拉低总线
while(DS18B20_GPIO)
{
i++;
if(i>10)return 1;//失败 ,大概120us
}
//3. 等待DS18B20释放总线
i=0;
while(DS18B20_GPIO==0) //60us~240us
{
i++;
if(i>20)return 1;//失败,大概240us
}
return 0;//初始化成功
}
/*
函数名称:u8 DS18B20_WriteByte(void)
函数功能:向DS18B20写入一个字节的数据
函数形参:写入的字节数据
*/
void DS18B20_WriteByte(u8 byte)
{
u16 i=0,j=0;
for(j=0;j<8;j++)
{
DS18B20_GPIO=0;//每写入一位数据之前先把总线拉低1us
i++; //+1消耗的时间是12us
DS18B20_GPIO=byte&0x01;//然后写入一个数据,从最低位开始
i=6;
while(i--){}//持续时间最少60us,这里大概72us
DS18B20_GPIO=1;//然后释放总线
byte>>=1;//继续发送
}
}
/*
函数名称:u8 DS18B20_ReadByte(void)
函数功能:从DS18B20读取一个字节的数据
返 回 值:读到的数据
*/
u8 DS18B20_ReadByte(void)
{
u8 byte=0;
u16 i=0,j=0;
for(j=0;j<8;j++)
{
DS18B20_GPIO=0;//先将总线拉低1us
i++;//+1消耗的时间是12us
DS18B20_GPIO=1;//然后释放总线
i++;
i++;//至少等待15us的时间,在读取数据
byte>>=1; //先从低位开始接收数据
if(DS18B20_GPIO)byte|=0x80;
i=4; //读取完之后等待48us再接着读取下一个数据
while(i--){}
}
return byte;
}
/*
函数名称:u16 DS18B20_ReadTemp(void)
函数功能:读取一次DS18B20的温度数据
返 回 值:读取的温度值
注意: 返回值要使用有符号的数据类型,因为温度可以返回负数。
*/
int DS18B20_ReadTemp(void)
{
int temp=0;//存放温度数据
u8 TH,TL;
//第一步: 启动温度转换
DS18B20_ResetSignal(); //发送复位脉冲并检测应答信号
DS18B20_WriteByte(0xcc);//跳过ROM操作命令
DS18B20_WriteByte(0x44);//温度转换命令
//第二步: 读取温度
DS18B20_ResetSignal();//发送复位脉冲并检测应答信号
DS18B20_WriteByte(0xcc);//跳过ROM操作命令
DS18B20_WriteByte(0xbe);//发送读取温度命令
TL=DS18B20_ReadByte();//读取温度值共16位,先读低字节
TH=DS18B20_ReadByte();//再读高字节
temp=TH<<8|TL; //合并成16位
return temp;
}
2.3 DS18B20.h
#ifndef _DS18B20_H
#define _DS18B20_H
#include "delay.h"
#include "type.h"
#include <reg51.h>
/*DS18B20硬件接口: P3.7*/
sbit DS18B20_GPIO=P3^7;
int DS18B20_ReadTemp(void);
#endif
- 点赞
- 收藏
- 关注作者
评论(0)