51单片机ds18b20测温湿度
时间: 2023-07-24 16:22:17 浏览: 115
51单片机可以通过DS18B20数字温度传感器测量温度,但是它不能直接测量湿度。如果您需要同时测量温度和湿度,建议使用DHT11或DHT22等数字温湿度传感器。以下是使用DS18B20测量温度的步骤:
1. 首先需要将DS18B20连接到51单片机。DS18B20有三个引脚:VCC、GND和数据线(DQ)。其中,VCC和GND分别连接到单片机的电源和地,数据线连接到单片机的任意一个IO口,需要通过上拉电阻将数据线拉高。
2. 单片机需要通过1-Wire协议与DS18B20进行通信。您可以通过搜索引擎查找1-Wire协议的具体实现方法,或者使用已有的1-Wire库进行开发。
3. 通过1-Wire协议向DS18B20发送温度转换命令,DS18B20会将温度转换为数字信号并存储在内部寄存器中。
4. 再次通过1-Wire协议向DS18B20发送读取数据命令,单片机可以读取DS18B20内部寄存器中的数字信号,并将其转换为温度值。
5. 最后,将获得的温度值进行处理和显示。
请注意,在实际开发中,可能需要考虑到DS18B20的精度、温度范围、数据通信的稳定性等因素。
相关问题
51单片机ds18b20测温程序
以下是51单片机ds18b20测温程序的示例代码:
```c
#include <reg51.h>
#include <intrins.h>
sbit DQ = P1^4; //定义DS18B20数据线接口
void delay_us(unsigned int i) //延时1us的函数
{
while(i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int i) //延时1ms的函数
{
unsigned int j, k;
for(j = i; j > 0; j--)
for(k = 110; k > 0; k--);
}
void Init_DS18B20() //初始化DS18B20
{
DQ = 1;
delay_us(5);
DQ = 0;
delay_us(400);
DQ = 1;
delay_us(30);
}
unsigned char Read_DS18B20() //读取DS18B20的数据
{
unsigned char i, dat = 0;
for(i = 8; i > 0; i--)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
dat |= 0x80;
delay_us(5);
}
return dat;
}
void Write_DS18B20(unsigned char dat) //向DS18B20写入数据
{
unsigned char i;
for(i = 8; i > 0; i--)
{
DQ = 0;
DQ = dat & 0x01;
delay_us(5);
DQ = 1;
dat >>= 1;
}
}
int Get_Temp_DS18B20() //获取DS18B20的温度值
{
unsigned char TL, TH;
int temp;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delay_ms(750);
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
TL = Read_DS18B20();
TH = Read_DS18B20();
temp = TH;
temp <<= 8;
temp |= TL;
return temp;
}
void main()
{
int temp;
while(1)
{
temp = Get_Temp_DS18B20();
temp = (temp / 16.0) * 100;
//将温度值转换为实际温度并乘以100,得到两位小数的温度值
//例如:温度值为25.75℃,转换后的值为2575
//需要注意的是,DS18B20的温度值是16位有符号整数,需要适当处理
}
}
```
此代码实现了DS18B20的初始化、读取温度值等功能。需要注意的是,DS18B20的温度值是16位有符号整数,需要适当处理。另外,由于DS18B20的精度高,可以将温度值转换为实际温度并乘以100,得到两位小数的温度值。例如:温度值为25.75℃,转换后的值为2575。
51单片机DS18B20测温 lcd显示
好的,我可以为您提供一些关于51单片机和DS18B20测温以及LCD显示的基本知识和代码实现。
1. DS18B20测温原理
DS18B20是一款数字温度传感器,采用单总线接口进行通信,具有精度高、精度可调、线长可达100米等特点,常用于温度测量和控制领域。
DS18B20测温的原理是通过传感器内部的温度传感器将温度转换成数字信号,然后通过单总线接口将数字信号发送到单片机,单片机再将数字信号转化为实际温度值进行处理。
2. 51单片机和DS18B20测温的连接
DS18B20采用单总线接口进行通信,与51单片机的连接如下:
- DS18B20的VCC引脚连接到51单片机的5V电源
- DS18B20的GND引脚连接到51单片机的GND
- DS18B20的DQ引脚连接到51单片机的任意I/O口
需要注意的是,DS18B20的DQ引脚需要使用上拉电阻将其拉高。
3. 51单片机和LCD显示的连接
51单片机和LCD显示的连接如下:
- LCD的VSS引脚连接到51单片机的GND
- LCD的VDD引脚连接到51单片机的5V电源
- LCD的VEE引脚连接到51单片机的可调电位器
- LCD的RS引脚连接到51单片机的任意I/O口
- LCD的RW引脚连接到51单片机的任意I/O口
- LCD的E引脚连接到51单片机的任意I/O口
- LCD的D0-D7引脚连接到51单片机的任意I/O口
需要注意的是,LCD的VEE引脚需要通过可调电位器进行调节,以控制LCD显示的亮度。
4. 代码实现
下面是51单片机通过DS18B20测温并通过LCD显示温度值的代码实现:
```
#include <reg52.h>
#include <intrins.h>
#define LCD_DPORT P0
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_E = P1^2;
sbit DQ = P3^7;
void delay(unsigned int i) //延时函数
{
while(i--);
}
void lcd_init() //LCD初始化函数
{
delay(1000);
lcd_cmd(0x38);
lcd_cmd(0x0c);
lcd_cmd(0x06);
lcd_cmd(0x01);
}
void lcd_cmd(unsigned char cmd) //LCD指令函数
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DPORT = cmd;
delay(5);
LCD_E = 1;
_nop_();
_nop_();
LCD_E = 0;
delay(5);
}
void lcd_data(unsigned char dat) //LCD数据函数
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DPORT = dat;
delay(5);
LCD_E = 1;
_nop_();
_nop_();
LCD_E = 0;
delay(5);
}
void lcd_string(unsigned char *str) //LCD字符串函数
{
while(*str != '\0')
{
lcd_data(*str);
str++;
}
}
void lcd_float(float f) //LCD浮点数函数
{
unsigned char str[16];
sprintf(str, "%f", f);
lcd_string(str);
}
unsigned char ds18b20_read() //DS18B20读取函数
{
unsigned char i;
unsigned char dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ == 1)
{
dat |= 0x80;
}
_nop_();
_nop_();
}
return dat;
}
void ds18b20_write(unsigned char dat) //DS18B20写入函数
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
if(dat & 0x01)
{
DQ = 1;
}
dat >>= 1;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
}
}
void ds18b20_convert() //DS18B20转换函数
{
ds18b20_write(0xcc);
ds18b20_write(0x44);
}
void main() //主函数
{
unsigned char temp_l, temp_h;
int temp;
float ftemp;
lcd_init();
while(1)
{
ds18b20_convert();
delay(1000);
ds18b20_write(0xcc);
ds18b20_write(0xbe);
temp_l = ds18b20_read();
temp_h = ds18b20_read();
temp = temp_h;
temp <<= 8;
temp |= temp_l;
ftemp = (float)temp / 16.0;
lcd_cmd(0x01);
lcd_string("Temp: ");
lcd_float(ftemp);
lcd_string(" C");
delay(1000);
}
}
```
上述代码实现了通过DS18B20测温并通过LCD显示温度值。其中ds18b20_convert()函数用于触发DS18B20转换温度值,ds18b20_write()函数用于向DS18B20写入命令或数据,ds18b20_read()函数用于从DS18B20读取温度值。同时,lcd_float()函数可以将浮点数转化为字符串并在LCD上显示。
阅读全文