两个行前写的DHT11的驱动程序,从焊接板子到将温湿度读取到数码管上,前前后后用了一个星期的时间,个人感觉效率太低了.....
但从DHT11的这一个小项目中我还是收获颇丰D!
首先秀一段DHT11的代码吧....
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit WENSHI=P0^5;
void DHT_init(void);
uchar R_dat();
void delay_ms(uint ms);
void delay_5us();
int shiH,shiL,wenH,wenL,jiaoyan;
uchar i=1;
void get_dat(void);
void get_dat(void) //取得温度湿度
{
// while(i)
// {
DHT_init(); //0.00039600
shiH=R_dat();
shiL=R_dat();
wenH=R_dat();
wenL=R_dat();
jiaoyan=R_dat();
if(shiH+shiL+wenH+wenL==jiaoyan)
{
i=0;
}
else i=1;
// }
}
void DHT_init(void) //初始化
{
/* uchar i;
WENSHI=1; //0.00048394
for(i=0;i<35;i++)
{
delay_ms(20);
} */
WENSHI=0; //0.63131836
delay_ms(20); //约0.0181680s
delay_ms(20); //约0.0181680s
WENSHI=1; //0.67074653
while(WENSHI==1); //跳过高电平
_nop_();
_nop_();
// delay_5us(); //0.67077474 //约40us
while(WENSHI==0); //0.67080078 //延时过80us低电平
_nop_();
_nop_();
while(WENSHI==1); //延时过80us高电平
_nop_();
_nop_();
}
uchar R_dat(dat)
{
for(i=0;i<8;i++)
{
while(WENSHI==0); //延时过50us低电平
delay_5us();
if(WENSHI!=0)
dat=(dat+0x01)<<1;
else
dat=dat<<1;
while(WENSHI==1);
}
return dat;
}
void delay_5us() //约27us
{
uint i;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
}
void delay_ms(uint ms) //约1ms
{
uchar i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
上述就是我的DHT11的驱动。
开始写DHT11时;我大致写了3遍,但一直取不到值,到最后实在没办法,只好观摩了一下别人写好的程序,看了半天也楞是没看懂....
但关键的地方还是抓住了-----卡时间....将时间调的必须相当准!(充分利用keil里的调试功能)
由于DHT11是单总线数据传输用8051单片机模拟时序必须严格按照温湿度传感器的时序来,所以while语句相当重要!