关于温湿度传感器DHT11的个人感悟

两个行前写的DHT11的驱动程序,从焊接板子到将温湿度读取到数码管上,前前后后用了一个星期的时间,个人感觉效率太低了.....

但从DHT11的这一个小项目中我还是收获颇丰D!

首先秀一段DHT11的代码吧....

#include
#include

#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语句相当重要!

你可能感兴趣的:(delay)