本程序使用于 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; } }
|