| 温湿度传感器DHT11(DHT21、DHT22同)接口采用单总线通信。和DS18B20这样的器件相比,其通信过程比较简单;但和采用IIC的器件相比,其通信定时的要求较高。虽然器件手册给出了相关的例程,但由于定时要求高,所以不同MCU、不同时钟频率、甚至不同编译都会对定时带来影响。下面给出的是STC15F2K系列(主频:11.0592MHz)的通信程序。是从手册中的例程修改而来的。修改的主要内容如下: 1. 修改了延时程序(Delay_5us函数),并调整了其定时的准确性; 2. RH函数增加了返回值,以显示操作是否成功; 3. 原例程判断阈值标称为30us,现改为标称值40us,以保证与定时函数的配合。 RH的返回值定义如下: 0 - 正常操作; 1 - 超时; 2 - 校验和错。 注:如果主频变化,则需修改延时函数Delay_5us( )。 如果需要拷贝使用,请从本行以下拷贝: #define MAIN_Fosc 11059200UL //定义主时钟 #define DHT_DATA P42 #include "STC15Fxxxx.H" // ExternalGlobal,注:使用时,要将下列外部变量的定义拷贝到主程序文件中,注意拷贝时不带"extern"关键字。 extern unsigned char xdata U8T_data_H, U8T_data_L, U8RH_data_H,U8RH_data_L, U8checkdata; //Global defined in this file. unsigned char U8FLAG, k; unsigned char U8count, U8temp; unsigned char xdata U8T_data_H_temp, U8T_data_L_temp,U8RH_data_H_temp, U8RH_data_L_temp, U8checkdata_temp; unsigned char U8comdata; unsigned int U16temp1, U16temp2; //======================================================================== // 函数名称: void delay_5us(unsigned ms) // 简要说明: 5微秒延时函数。 // 输入参数: us_5,要延时的5微秒倍数。 // 返回值: 无 // 当前版本: VER 0.1 // 版本:VER 0.1; // 生成日期: 2016-02-08 // 说明:经过测试,连同调用时间,程序的定时(正)误差小于1%,用于 // 主频为11.0592MHz的系统。 //======================================================================== void Delay_5us() { NOP21(); NOP16(); } //======================================================================== // 函数名称: void COM(void) // 简要说明: 从DHT系列单总线读取一个字节。 // 输入参数: 无 // 返回值: 无 // 当前版本: VER 0.1 // 版本:VER 0.1 // 生成日期: 2016-02-16 // 说明:来自AM2302的器件说明,针对STC单片机及本项目函数进行了修改。 // 备注:读取的字节放在全局变量U8comdata中。 //======================================================================== void COM(void) { unsigned char i; U8comdata = 0; for(i = 0; i < 8; i++) { U8FLAG =2; while(!DHT_DATA && U8FLAG++); Delay_5us(); Delay_5us(); Delay_5us(); Delay_5us(); Delay_5us(); Delay_5us(); Delay_5us(); Delay_5us(); U8temp =0; if(DHT_DATA) //若延时30us还是高电平,则表示该位为“1”。 U8temp=1; U8FLAG =2; while(DHT_DATA && U8FLAG++); //高电平的延续时间超时,出错。 if(U8FLAG ==1) break; U8comdata<<= 1; U8comdata |=U8temp; //0 } } //======================================================================== // 函数名称: unsigned char RH(void) // 简要说明: 从DHT系列传感器读取温湿度数据。 // 输入参数: 无 // 返回值: 0 - 正常; 1 - 超时; 2 - 校验和错。 // 当前版本: VER 0.1 // 版本:VER 0.1 // 生成日期: 2016-02-16 // 说明:来自AM2302的器件说明,针对STC单片机及本项目函数进行了修改。 // 备注:读取的数据放在下列四个全局变量中: // U8T_data_H、U8T_data_L、U8RH_data_H、U8RH_data_L //======================================================================== unsigned char RH(void) { unsigned char i, j = 0; unsigned int U16FLAG; //DHT22(AM2320)要求拉低至少800us,最大2ms,这里>1000us。 DHT_DATA = 0; for (i = 0; i < 255; i++) Delay_5us(); //拉高 DHT_DATA = 1; //等待20 - 40us,这里是30us Delay_5us(); Delay_5us(); Delay_5us(); Delay_5us(); Delay_5us(); Delay_5us(); //输入方式 DHT_DATA = 1; U16FLAG = 0xc2; if(!DHT_DATA && U16FLAG++) //T ! { U8FLAG =2; while(!DHT_DATA && U8FLAG++); if (U8FLAG== 1) { j = 1; return j; } U8FLAG =2; while(DHT_DATA && U8FLAG++); if(U8FLAG == 1) { j = 1; return j; } //Get bytesfrom DHT22. COM(); U8RH_data_H_temp = U8comdata; COM(); U8RH_data_L_temp = U8comdata; COM(); U8T_data_H_temp = U8comdata; COM(); U8T_data_L_temp = U8comdata; COM(); U8checkdata_temp = U8comdata; DHT_DATA =1; //Calculate check sum. U8temp =(U8T_data_H_temp + U8T_data_L_temp + U8RH_data_H_temp +U8RH_data_L_temp); if(U8temp ==U8checkdata_temp) { U8RH_data_H = U8RH_data_H_temp; U8RH_data_L = U8RH_data_L_temp; U8T_data_H = U8T_data_H_temp; U8T_data_L = U8T_data_L_temp; U8checkdata = U8checkdata_temp; } else { j = 2; }//fi }//fi if (U16FLAG == 1) j = 1; return j; } |
| 欢迎光临 迅维网 (https://www.chinafix.com/) | Powered by Discuz! X3.4 |