标题: 温度传感器 [打印本页]
作者: adwszxc1 时间: 2021-1-5 23:06
标题: 温度传感器
本程序使用于 STC12C5 系列单片机,使用其他单片机特别注意时序问题
#include <reg51.h>
#include <intrins.h>
unsigned char TH_data; // 温度高 8 位
unsigned char TL_data; // 温度低 8 位
unsigned char RH_data; // 湿度高 8 位
unsigned char RL_data; // 湿度低 8 位
unsigned char CK_data;
sbit DHT11_Data = P2^0; // DHT11 数据线
void delay_us(unsigned char us) //@12.000MHz
{
while(us--)
{
_nop_();
_nop_();
}
}
void delay_ms(unsigned char ms) //@12.000MHz
{
unsigned char i, j;
while(ms--)
{
_nop_();
_nop_();
i =12;
j =168;
do
{
while (--j);
}
while (--i);
}
}
/****************************************************************************/
// 函数名称 : DHT_Read
// 函数功能 : DHT11 读取数据
/****************************************************************************/
unsigned char DHT_Read()
{
unsigned char i; // 定义变量,用于循环
unsigned char temp; // 定义变量,用于临时返回值
unsignedchar com_data; // 定义变量,用于返回值
unsigned char respond; // 定义变量,用于响应处理
for(i=0;i<=7;i++) // 接收 8bit 数据
{
respond=0;
while((!DHT11_Data)&& respond<100)// 等待 50us 低电平开始信号结束
{
respond++;
delay_us(1);
}
delay_us(28);//开始信号结束后延时 26us-28us
if(DHT11_Data)
{
temp=1;
respond=0;
while((DHT11_Data)&& respond<100)
{
respond++;
delay_us(1);
}
}
else
{
temp=0;
}
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/
/****************************************************************************/
// 实现功能: DHT11 采集温湿度
/***************************************************************************/
void DHT11_Gets(void)
{
unsigned char respond;// 定义变量,用于响应处理
unsigned charTH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
DHT11_Data=0;
delay_ms(20);// 主机拉低总线必须大于 18ms, 保证 DHT11 能检测到信号
DHT11_Data=1;// 发送信号结束,拉高电平延时 20-40us
delay_us(30);// 延时大约 30us
if(!DHT11_Data) // 判断 DHT11 是否低电平响应信号
{
respond=0;
while((!DHT11_Data)&& respond<80)
{
respond++;
delay_us(1);
}
respond=0;
while((DHT11_Data)&&respond<100)
{
respond++;
delay_us(1);
}
RH_temp = DHT_Read();
RL_temp = DHT_Read();
TH_temp = DHT_Read();
TL_temp = DHT_Read();
CK_temp = DHT_Read();
DHT11_Data=0;
delay_us(50);
DHT11_Data=1;
if((RH_temp+RL_temp+TH_temp+TL_temp)==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
}
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |