一、原理分析
考试时可能会需要自己编写底层驱动的.h文件,编写.h的关键是会查原理图把DQ定义好。
sbit DQ = P1^4;
二、应用
-
温度监控:DS18B20广泛应用于温度监控系统中,如室内温度监测、工业生产过程中的温度控制等。
-
环境监测:DS18B20可用于环境监测系统,如温室温度监测、气象站温度采集等。
-
智能家居:在智能家居系统中,DS18B20可用于室内温度控制、智能恒温器等设备。
-
电子设备:DS18B20也可应用于电子设备中,如电脑散热系统的温度监测、电池温度监测等。
-
医疗设备:在医疗设备中,DS18B20可用于体温监测、恒温器控制等应用。
三、思维导图
四、示例框架
#include "ds18b20.h"
#include "reg52.h"
#include "onewire.h"
float temp_ds18b20 = 0;
extern unsigned int smg_ds18b20; //数码管显示温度值
//初始化DS18B20的温度,避免在上电的时候,读取温度默认值85,作为当前的采样温度
void Init_DS18B20_Temp()
{
unsigned char LSB,MSB;
init_ds18b20(); //初始化DS18B20
Write_DS18B20(0xcc); //忽略ROM操作
Write_DS18B20(0x44); //启动温度转换
do{
init_ds18b20(); //初始化DS18B20
Write_DS18B20(0xcc); //忽略ROM操作
Write_DS18B20(0xbe); //读出内部存储器
LSB = Read_DS18B20(); //第0字节:温度低8位
MSB = Read_DS18B20(); //第1字节,温度高8位
MSB = (MSB << 4) | (LSB >> 4); //将高8位数据左移4位,然后与低8位数据右移4位后的结果进行或运算,得到完整的16位温度数据。
}while(MSB == 85); //直到首次温度转换完成
}
//DS18B20的温度读出
void Read_DS18B20_Temp()
{
unsigned char LSB,MSB;
unsigned int temp = 0;
init_ds18b20(); //初始化DS18B20
Write_DS18B20(0xcc); //忽略ROM操作
Write_DS18B20(0x44); //启动温度转换
DisplaySMG_Info();
init_ds18b20(); //初始化DS18B20
DisplaySMG_Info();
Write_DS18B20(0xcc); //忽略ROM操作
Write_DS18B20(0xbe); //读出内部存储器
LSB = Read_DS18B20(); //第0字节:温度低8位
MSB = Read_DS18B20(); //第1字节,温度高8位
temp = MSB;
temp = (temp << 8) | LSB; //合成16位温度原始数据
if((temp & 0xf800) == 0x0000) //处理正温度
{
temp_ds18b20 = temp * 0.0625; //计算实际温度值
}
smg_ds18b20 = temp_ds18b20 * 10;//将小数转换成整数方便后续显示
}
这段代码主要实现了DS18B20温度传感器的初始化、温度读取和显示功能。通过单总线通信协议与DS18B20传感器通信,获取温度数据并进行处理
-
#include "ds18b20.h"
、#include "reg52.h"
、#include "onewire.h"
:包含了三个头文件,分别是DS18B20传感器的头文件、STC单片机的头文件和单总线通信的头文件。 -
float temp_ds18b20 = 0;
、extern unsigned int smg_ds18b20;
:定义了一个浮点型变量temp_ds18b20
用于存储DS18B20的温度值,以及一个外部声明的无符号整型变量smg_ds18b20
用于在数码管上显示温度值。 -
void Init_DS18B20_Temp()
:定义了一个无返回值的函数Init_DS18B20_Temp()
,用于初始化DS18B20的温度,避免在上电时读取默认温度值85。 -
unsigned char LSB, MSB;
:定义了两个无符号字符型变量LSB和MSB,用于存储DS18B20传感器读取的温度数据的低8位和高8位。 -
init_ds18b20();
、Write_DS18B20(0xcc);
、Write_DS18B20(0x44);
:初始化DS18B20传感器,忽略ROM操作,启动温度转换。 -
do { ... } while (MSB == 85);
:使用do-while循环,读取DS18B20传感器的温度数据,直到首次温度转换完成(MSB不等于85)。 -
void Read_DS18B20_Temp()
:定义了一个无返回值的函数Read_DS18B20_Temp()
,用于读取DS18B20传感器的温度数据并显示在数码管上。 -
unsigned int temp = 0;
:定义了一个无符号整型变量temp,用于存储DS18B20传感器读取的温度数据。 -
DisplaySMG_Info();
:显示数码管信息。 -
temp = (temp << 8) | LSB;
:将高8位数据左移8位,然后与低8位数据进行或运算,得到完整的16位温度数据。 -
if ((temp & 0xf800) == 0x0000)
:判断温度数据的符号位,处理正温度。 -
temp_ds18b20 = temp * 0.0625;
:计算实际温度值,乘以0.0625得到实际温度值。 -
smg_ds18b20 = temp_ds18b20 * 10;
:将实际温度值乘以10,转换为整数方便后续显示在数码管上。