51单片机ds18b20测温湿度
时间: 2023-07-24 08:21:19 浏览: 119
DS18B20多点测温(51C程序)
要使用51单片机和DS18B20传感器测量温度和湿度,你可以按照以下步骤进行:
1. 连接DS18B20传感器和51单片机:将DS18B20传感器的VCC引脚连接到51单片机的+5V电源,将GND引脚连接到51单片机的GND,将DQ引脚连接到51单片机的任意一个IO口(比如P1.0)。
2. 在程序中初始化DS18B20传感器:首先需要定义一个函数来复位DS18B20传感器,然后发送读取温度的指令,并等待DS18B20传感器的应答信号。具体代码如下:
```
void Ds18b20Init()
{
DQ = 1; //DQ引脚上拉
delay_us(2); //延时2us
DQ = 0; //发送复位信号
delay_us(480);
DQ = 1; //释放总线
delay_us(60);
}
void Ds18b20ReadTemp()
{
unsigned char i, j;
unsigned char temp;
unsigned char buffer[9]; //存放读取的数据
Ds18b20Init(); //复位DS18B20传感器
DQ = 1; //发送读取温度的指令
delay_us(2);
DQ = 0;
delay_us(80);
DQ = 1;
delay_us(15);
temp = DQ; //读取DS18B20传感器的应答信号
delay_us(60);
if (temp == 0) //判断应答信号是否正确
{
for (i = 0; i < 8; i++) //读取8个字节的数据
{
DQ = 1;
delay_us(2);
DQ = 0;
delay_us(5);
DQ = 1;
delay_us(15);
buffer[i] = DQ; //存储读取的数据
}
if (buffer[0] > 7) //判断温度是否为负数
{
buffer[0] = ~buffer[0] + 1;
buffer[1] = ~buffer[1];
buffer[2] = ~buffer[2];
buffer[3] = ~buffer[3];
buffer[4] = ~buffer[4];
buffer[5] = ~buffer[5];
buffer[6] = ~buffer[6];
buffer[7] = ~buffer[7];
temp = 1; //标记温度为负数
}
else
{
temp = 0; //标记温度为正数
}
temp = (buffer[1] << 4) | (buffer[0] >> 4); //计算温度的整数部分
Temp = temp;
}
}
```
3. 计算温度值:根据DS18B20传感器的数据手册,我们可以得知DS18B20传感器返回的温度值是一个16位的数据,其中前12位是温度的整数部分,后4位是温度的小数部分。因此,我们需要将读取的数据进行计算,得出实际的温度值。具体代码如下:
```
float TempConversion(unsigned char tempL, unsigned char tempH)
{
float temp;
temp = tempH;
temp = temp << 8;
temp = temp | tempL;
temp = temp * 0.0625;
return temp;
}
```
4. 连接DHT11湿度传感器和51单片机:将DHT11湿度传感器的VCC引脚连接到51单片机的+5V电源,将GND引脚连接到51单片机的GND,将DATA引脚连接到51单片机的任意一个IO口(比如P1.1)。
5. 在程序中读取DHT11湿度传感器的数据:首先需要向DHT11湿度传感器发送读取数据的指令,并等待DHT11湿度传感器的应答信号。然后从DHT11湿度传感器读取40位的数据,并进行校验,最终得到湿度值和温度值。具体代码如下:
```
void Dht11Read()
{
unsigned char i, j, temp;
unsigned char buffer[5]; //存放读取的数据
DHT11 = 1; //拉高DATA引脚
delay_ms(10);
DHT11 = 0; //发送开始信号
delay_ms(20);
DHT11 = 1; //释放DATA引脚
delay_us(40);
temp = DHT11; //读取DHT11传感器的应答信号
if (temp == 0) //判断应答信号是否正确
{
delay_us(80);
temp = DHT11; //读取DHT11传感器的数据
if (temp == 1) //判断第一个字节是否正确
{
for (i = 0; i < 5; i++) //读取40个位的数据
{
buffer[i] = 0;
for (j = 0; j < 8; j++)
{
while (DHT11 == 0);
delay_us(30);
if (DHT11 == 1)
{
buffer[i] |= (1 << (7 - j));
}
while (DHT11 == 1);
}
}
if ((buffer[0] + buffer[1] + buffer[2] + buffer[3]) == buffer[4]) //判断校验和是否正确
{
Humidity = buffer[0];
Temp = buffer[2];
}
}
}
}
```
6. 在主函数中循环读取温度和湿度的值,并将其显示在LCD1602液晶屏上。
阅读全文