数据0的表示如下:
数据1表示如下:
显然0_1信号都是先由50us的低电平开始,再由高电平的时间长短表示0或1。
#include<reg52.h> sbit DHTIO=P1^1; //humidity 湿度 //temperature 温度 //integer 整数 //decimal 小数 unsigned char humidity_interger=0,humidity_decimal; unsigned char temperature_integer=0,temperature_decimal; unsigned char check; void delay20ms() { unsigned char a,b,c; for(c=1;c>0;c--) for(b=222;b>0;b--) for(a=40;a>0;a--); } void delay40us() { unsigned char a,b; for(b=3;b>0;b--) for(a=4;a>0;a--); } void dht_start() { DHTIO=1; //初始高电平 delay40us(); DHTIO=0; //主机拉低电平 delay20ms(); //保持电平时间大于18ms DHTIO=1; //主机拉高电平 delay40us(); //延迟等待20-40us等待从机响应 } unsigned char recieve_data() { unsigned char i,flag,data_byte; for(i=0;i<8;i++) { flag=2; while((!DHTIO)&&flag++);//等待从机发出50us低电平结束 delay40us(); //延时超过26us-28us不超过70us data_byte=data_byte<<1; if(DHTIO) //如果此时dhtio为1则表示此时从机输出数据为1否则说明此时从机输出数据为0 { data_byte|=0x01; flag=2; while((DHTIO)&&flag++);//等待剩下的高电平结束 } if(!flag) break; } return data_byte; } void dht_take_sample() { unsigned char flag; dht_start(); if(!DHTIO) //从机发出响应信号 { flag=2; while((!DHTIO)&&flag++);//检测从机发出80us低电平是否结束 flag=2; while((DHTIO)&&flag++); //检测从机发出80us高电平是否结束 //开始采集数据 humidity_interger=recieve_data(); //采集湿度整数部分 humidity_decimal=recieve_data(); //采集湿度小数部分 temperature_integer=recieve_data(); //采集温度整数部分 temperature_decimal=recieve_data(); //采集温度小数部分 check=recieve_data(); //采集校验位 DHTIO=1; //采集数据后主机拉高电平 } } unsigned char get_humidity() { return humidity_interger; } unsigned char get_temperature() { return temperature_integer; }