基于STC32G的DHT11温度模块检测程序
时间: 2024-05-19 14:14:07 浏览: 85
DHT11温度检测程序
#include <reg52.h>
#include <intrins.h>
#define DHT11_DAT P1_0
bit StartSignal(void);
bit CheckResponse(void);
unsigned char ReadByte(void);
void main()
{
unsigned char humi_int, humi_deci, temp_int, temp_deci;
unsigned char checksum, i;
TMOD = 0x01; // 定时器0工作方式1
TH0 = 0xfc; // 定时器初值
TL0 = 0x67;
TR0 = 1; // 启动定时器0
while (1)
{
if (StartSignal()) // 如果开始信号发送成功
{
if (CheckResponse()) // 如果响应信号接收成功
{
humi_int = ReadByte(); // 读取湿度整数部分
humi_deci = ReadByte(); // 读取湿度小数部分
temp_int = ReadByte(); // 读取温度整数部分
temp_deci = ReadByte(); // 读取温度小数部分
checksum = ReadByte(); // 读取校验和
if (checksum == humi_int + humi_deci + temp_int + temp_deci) // 校验和正确
{
// 将温度和湿度显示在数码管上
}
else // 校验和错误
{
// 显示错误信息
}
}
else // 响应信号接收失败
{
// 显示错误信息
}
}
else // 开始信号发送失败
{
// 显示错误信息
}
}
}
bit StartSignal(void)
{
DHT11_DAT = 0; // 主机拉低数据线
_nop_();
_nop_();
_nop_();
_nop_();
DHT11_DAT = 1; // 主机释放数据线
while (DHT11_DAT); // 等待DHT11响应
if (!DHT11_DAT) // 如果DHT11成功响应
{
while (!DHT11_DAT); // 等待DHT11拉低数据线
return 1; // 返回信号发送成功
}
else // 如果DHT11响应失败
{
return 0; // 返回信号发送失败
}
}
bit CheckResponse(void)
{
while (DHT11_DAT); // 等待DHT11拉低数据线
while (!DHT11_DAT); // 等待DHT11释放数据线
while (DHT11_DAT); // 等待DHT11拉低数据线
return 1; // 返回响应信号接收成功
}
unsigned char ReadByte(void)
{
unsigned char i, byte = 0;
for (i = 0; i < 8; i++)
{
while (!DHT11_DAT); // 等待DHT11拉低数据线
TH0 = 0xfc; // 定时器初值
TL0 = 0x67;
TR0 = 1; // 启动定时器0
while (DHT11_DAT); // 等待DHT11释放数据线
TR0 = 0; // 停止定时器0
if (TH0 < 0x7f) // 如果定时器0计数小于0.5us,说明接收到的是0
{
byte <<= 1;
}
else // 如果定时器0计数大于0.5us,说明接收到的是1
{
byte <<= 1;
byte |= 1;
}
}
return byte;
}
阅读全文