#ifndef _DHT11_H_
#define _DHT11_H_
#include"AT89X52.h"
#include"intrins.h"
#define DHT11_Dq P2_4
bit DHT11_Read();
void DHT11_Init();
bit DHT11_Start();
void Delay_Us(unsigned char i);
void Delay_Xms(unsigned int Time);
extern unsigned char Temp[5];
void UART_Init(void); //串口
#endif
include"DHT11.h"
unsigned char Temp[5];
/*---------------------------------
|函数名称:毫秒级延时函数。
|说 明:晶振12Mhz
|延时时间:1.01Ms
-----------------------------------*/
void Delay_Xms(unsigned int Time)
{
unsigned int i = 0;
unsigned char j = 0;
for (i = Time;i > 0;i--)
{
for (j = 123;j > 0;j--);
}
}
/**************************
MOV R7,#0X01; 1
LCALL DELAY; 2
DELAY: DJNZ R7,DELAY; 2
RET 2
延时时间 = 5+I*2;
**************************/
void Delay_Us(unsigned char i)
{
while(--i);
}
/*---------------------------------
|函数名称:DHT11初始化函数
|说 明:等待1S,越过不稳定的因素
|输 入:无
|输 出:无
-----------------------------------*/
void DHT11_Init()
{
DHT11_Dq = 1;
Delay_Xms(1010);
}
/*---------------------------------
|函数名称:DHT11开始信号
|说 明:成功返回1,否则返回0
|输 入:无
|输 出:DHT_StarT
-----------------------------------*/
bit DHT11_Start()
{
bit DHT_StarT = 0;
DHT11_Dq = 1;
DHT11_Dq = 0;
Delay_Xms(20); //拉低总线必须大于18Ms,这里用20Ms
DHT11_Dq = 1;
Delay_Us(17); //主机拉高总线后延时20-40US
DHT11_Dq = 1;
while(!DHT11_Dq)
{
DHT_StarT = 1;
}
while(DHT11_Dq)
{
break;
}
return(DHT_StarT);
}
/*---------------------------------
|函数名称:DHT11读取数据
|说 明:成功返回1,否则返回0
|输 入:无
|输 出:Flag
-----------------------------------*/
bit DHT11_Read()
{
bit Flag = 0;
unsigned char i = 0;
unsigned char j = 0;
unsigned char n = 0;
for (i = 0;i < 5;i++)
{
for(j = 0;j < 8;j++)
{
while(!DHT11_Dq);
while(DHT11_Dq)
{
n++;
}
if (n > 40)
{
Temp
|= 0x80 >> j;
}
}
}
if (Temp[4] == (Temp[0] + Temp[1] + Temp[2] + Temp[3]))
{
Flag = 1;
}
return(Flag);
}
void UART_Init(void)
{
TMOD = 0X20;
TH1 = 0xfd;
TL1 = 0xfd;
SCON = 0X50;
TR1 = 1;
ES = 1;
EA = 1;
}
#include"AT89X52.H"
#include"DHT11.h"
sbit LED = P0^7;
bit Flag1 = 0;
void main(void)
{
//Delay_Us(25);
unsigned char T = 0;
unsigned char i = 0;
DHT11_Init();
UART_Init(); //串口
while(1)
{
/* if (DHT11_Start())
{
if (DHT11_Read())
{
LED = 0;
}
}*/
if (DHT11_Start())
{
DHT11_Read();
}
if (Flag1)
{
for (i = 0;i < 5;i++)
{
SBUF = Temp;
while(!TI);
TI = 0;
Delay_Xms(100);
}
Flag1 = 0;
}
P0 = Temp[0];
}
}
void dfds() interrupt 4
{
RI = 0;
Flag1 = 1;
}
完整的程序包点击此处下载 ourdev_620858IN1PN4.rar(文件大小:35K) (原文件名:DHT11.rar)
结果:
(原文件名:未命名.jpg)
在论坛看到一个DHT11的,但是用不了,不知道为什么。
我看DHT11的说明书,说数据输出的时候主要以高电平的时间长短来确定是高低电平。
说26-28US是低电平,程序里我就是这么想的:只要超过26-28US这个时间总线依然为高的话我就认定他为高电平。
但是这个26-28US我调不出来。麻烦大虾看下。谢谢
忘了说了12M晶体
unsigned char dflag;
unsigned dtemp;
unsigned comdata;
unsigned char rh_data_h;
unsigned char rh_data_l;
unsigned char t_data_h;
unsigned char t_data_l;
unsigned char checkdata;
void delay_1ms(void) //1ms延时函数
{
unsigned char x,y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void delay_10us()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void com()
{
unsigned char i;
for(i=0;i<8;i++)
{
dflag=2;
while((!dhtport)&&dflag++);
delay_10us();
delay_10us();
dtemp=0;
if(dhtport)
dtemp=1;
dflag=2;
while((dhtport)&&dflag++);
if(dflag==1)
break;
comdata<<=1;
comdata|=dtemp;
}
}
void rh(void)
{
dhtport=0;
delay_nms(18);
dhtport=1;
delay_10us();
delay_10us();
delay_10us();
delay_10us();
dhtport=1;
_nop_();
if(!dhtport)
{
dflag=2;
while((!dhtport)&&dflag++);
dflag=2;
while((dhtport)&&dflag++);
com();
rh_data_h=comdata;
com();
rh_data_l=comdata;
com();
t_data_h=comdata;
com();
t_data_l=comdata;
com();
checkdata=comdata;
dhtport=1;
}
}
一周热门 更多>