编写使用51单片机+DHT11+LED1602进行湿度监测的代码
时间: 2024-01-13 17:03:28 浏览: 76
基于51单片机DHT11的温湿度检测系统
以下是使用51单片机、DHT11和LED1602进行湿度监测的代码:
```
#include <reg51.h> // 引入51单片机头文件
#define DHT11_PIN P1_0 // 定义DHT11数据引脚
#define LCD_RS P2_0 // 定义LCD_RS引脚
#define LCD_RW P2_1 // 定义LCD_RW引脚
#define LCD_EN P2_2 // 定义LCD_EN引脚
#define LCD_DATA P0 // 定义LCD数据引脚
sbit LED = P1_1; // 定义LED引脚
unsigned char humi_data = 0; // 定义湿度数据
unsigned char temp_data = 0; // 定义温度数据
unsigned char check_sum = 0; // 定义校验和
void delay_us(unsigned int i) // 延时函数
{
while (i--);
}
void LCD_Write_Cmd(unsigned char cmd) // 写入LCD指令
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = cmd;
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
}
void LCD_Write_Data(unsigned char dat) // 写入LCD数据
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = dat;
LCD_EN = 1;
delay_us(5);
LCD_EN = 0;
}
void LCD_Init() // 初始化LCD
{
LCD_Write_Cmd(0x38); // 8位数据接口,2行显示,5x7点阵字符
LCD_Write_Cmd(0x0c); // 显示开,光标关闭
LCD_Write_Cmd(0x06); // 光标右移,字符不移动
LCD_Write_Cmd(0x01); // 清屏
}
void LCD_Show_Str(unsigned char x, unsigned char y, unsigned char *str) // 在LCD上显示字符串
{
unsigned char addr;
if (y == 0) addr = 0x80 + x;
else addr = 0xc0 + x;
LCD_Write_Cmd(addr);
while (*str != '\0')
{
LCD_Write_Data(*str++);
}
}
void Start_DHT11() // 启动DHT11
{
DHT11_PIN = 0;
delay_us(20);
DHT11_PIN = 1;
delay_us(30);
}
void Check_Response() // 检查DHT11响应信号
{
while (!DHT11_PIN);
while (DHT11_PIN);
}
unsigned char Read_Data() // 读取DHT11数据
{
unsigned char i, j, dat = 0;
for (j = 0; j < 8; j++)
{
while (!DHT11_PIN);
delay_us(30);
if (DHT11_PIN == 0)
{
dat &= ~(1 << (7 - j));
}
else
{
dat |= (1 << (7 - j));
while (DHT11_PIN);
}
}
return dat;
}
void Read_DHT11() // 读取DHT11湿度和温度数据
{
Start_DHT11();
Check_Response();
humi_data = Read_Data();
humi_data = Read_Data();
temp_data = Read_Data();
temp_data = Read_Data();
check_sum = Read_Data();
}
void main()
{
unsigned char str[16];
LCD_Init(); // 初始化LCD
while (1)
{
Read_DHT11(); // 读取DHT11数据
if (check_sum == humi_data + temp_data) // 判断校验和是否正确
{
LED = 0; // 设置LED灯亮
sprintf(str, "Humi: %d%%", humi_data); // 将湿度数据转化为字符串
LCD_Show_Str(0, 0, str); // 在LCD上显示湿度数据
sprintf(str, "Temp: %dC", temp_data); // 将温度数据转化为字符串
LCD_Show_Str(0, 1, str); // 在LCD上显示温度数据
}
else
{
LED = 1; // 设置LED灯灭
LCD_Show_Str(0, 0, "DHT11 Error!"); // 在LCD上显示错误信息
LCD_Show_Str(0, 1, "Please try again!");
}
delay_us(500000); // 延时500ms
}
}
```
注意事项:
1. 以上代码假设LCD1602的数据线接口为P0,如果接口不同需要修改代码中的LCD_DATA宏定义。
2. 在读取DHT11数据时,需要先发送启动信号,然后等待DHT11响应信号,在此之后才能开始读取数据。
3. 在读取DHT11湿度和温度数据时,需要读取两次,分别为整数和小数部分。
4. 在读取DHT11数据时,需要校验和才能保证数据的正确性。
阅读全文