搜索
bottom↓
回复: 7

看到论坛里小女子和老男人写的DHT11的程序,也发一个我写的DHT21的驱动程序吧。用MEGA

[复制链接]

出0入0汤圆

发表于 2010-10-15 21:39:07 | 显示全部楼层 |阅读模式
//***********************************************************************************************
//  DHT21.c    DHT21 bus module
//  2010,4,8
//  Compiler  WINAVR 20100110
//  Copyright By zsmbj
//
//**********************************************************************************************
#define F_CPU                8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//----------------------------------------------------------------------------------------------
//         DHT21 Hardware IO defination
//----------------------------------------------------------------------------------------------
//DDR        PORT       
//0        0        in,high
//0        1        in,r
//1        0        out=0
//1        1        out=1

#define        DHT_DAT                                PINB0

#define DHT_DAT_HIGH()                ( DDRB &= ~(1<<DHT_DAT) )
#define DHT_DAT_LOW()                ( DDRB |= (1<<DHT_DAT) )
#define IS_DHT_DAT_High()        ( PINB & (1<<DHT_DAT) )

//----------------------------------------------------------------------------------------------
//  Name: void DHT_Delay(void)
//  Parameters:   CLK_WIDTH  delay time
//  Function:   delay us time with nop
//  return   :  none
//  Notice:        none
//  Created:   2010,4,8 zsmbj
//----------------------------------------------------------------------------------------------
void DHT_Delay(unsigned char us)
{
        _delay_us(us);
}

//----------------------------------------------------------------------------------------------
//  Name: void Init_DHT21(void)
//  Parameters:   none
//  Function:   Init_DHT21 bus
//  return   :   none
//  Notice:        none
//  Created:   2010,4,8 zsmbj
//----------------------------------------------------------------------------------------------

void Init_DHT21(void)
{
        DHT_DAT_HIGH();
}

//----------------------------------------------------------------------------------------------
//  Name: unsigned char Wait_RISE_EDGE(unsigned char* temp)
//  Parameters:   none
//  Function:   
//  return   :   none
//  Notice:        none
//  Created:   2010,4,8 zsmbj
//----------------------------------------------------------------------------------------------
unsigned char Wait_RISE_EDGE(unsigned char* temp)
{
        unsigned char flag=0,i=0,ack=0;

        while(1)
        {
                if( !(IS_DHT_DAT_High()) )
                {
                        flag = 1;
                }
                else
                {
                        if(flag == 1)
                        {
                                temp[0] = i;        //return time :us
                                break;
                        }
                }
        //        DHT_Delay(1);
                i++;
                if(i >= 200)                        //if wait 200us for nothing then return
                {
                        ack = 1;
                        break;
                }
        }
        return ack;
}

//----------------------------------------------------------------------------------------------
//  Name: unsigned char Wait_FALL_EDGE(unsigned char* temp)
//  Parameters:   none
//  Function:   
//  return   :   none
//  Notice:        none
//  Created:   2010,4,8 zsmbj
//----------------------------------------------------------------------------------------------
unsigned char Wait_FALL_EDGE(unsigned char* temp)
{
        unsigned char flag=0,i=0,ack=0;

        while(1)
        {
                if( (IS_DHT_DAT_High()) )
                {
                        flag = 1;
                }
                else
                {
                        if(flag == 1)
                        {
                                temp[0] = i;        //return time :us
                                break;
                        }
                }
        //        DHT_Delay(1);
                i++;
                if(i >= 200)                        //if wait 200us for nothing then return
                {
                        ack = 1;
                        break;
                }
        }
        return ack;
}

                               
//----------------------------------------------------------------------------------------------
//  Name: unsigned char Get_DHT_Temp_Humi(unsigned char* temp)
//  Parameters:   none
//  Function:   
//  return   :   none
//  Notice:        none
//  Created:   2010,4,8 zsmbj
//
//       ----|   start     | 20-  |salve ack(2*80us)| data0  26-  |   data1       |stop-------
//       ____               _40us_          __80us__        _28us_        __70us__        ____
//  DAT :    |____500us____|      |__80us__|        |_50us_|      |_50us_|        |_50us_|
//----------------------------------------------------------------------------------------------
unsigned char Get_Temp_Humi(unsigned char* temp)
{
        unsigned char sum,i,j,ack,data[5],dat;

        //Send start
        DHT_DAT_LOW();                //set data low
        DHT_Delay(250);                //
        DHT_Delay(250);                //delay 500us
        DHT_DAT_HIGH();                //set data high
        DHT_Delay(20);                //delay 20us
       
        //get ack
        ack = Wait_RISE_EDGE(&dat);                //senond riseedge,80us,low level
        if(ack != 0)
        {
                return ack;
        }
        ack += Wait_FALL_EDGE(&dat);        //third falledge,80us high level
        if(ack != 0)
        {
                return ack;
        }
        cli();                //we close interrupt
       
        //get temp and humi 5 byte
        for(i = 0;i<5;i++)                                        //we got 40 bit data that is 5 byte
        {
                data = 0;
                for(j = 0;j<8;j++)       
                {
                        ack = Wait_FALL_EDGE(&dat);
                        if(ack != 0)
                        {
                                ack = 1;
                                break;
                        //        return ack;
                        }
                        else
                        {
                                if( (dat >= 110) && (dat <= 130) )                                //bit 1,total 120us; we test is 122us
                                {
                                        data <<= 1;
                                        data += 1;
                                }
                                else if( (dat >= 67) && (dat <= 87) )                        //bit 0,total 77us ;we test is 72us
                                {
                                        data <<= 1;
                                        data += 0;
                                }
                                else                                                                                        //an know bit
                                {
                                        ack = 1;
                                        break;
                                //        return ack;
                                }
                        }
                }
        }
       
        sei();                 //we open interrupt
       
        if(ack == 1)
        {
                return ack;
        }
        else
        {
                //calculate sum
                sum = data[0] + data[1] + data[2] + data[3];
                if( sum == data[4] )
                {
                        temp[0] = data[2];                //temp msb
                        temp[1] = data[3];                //temp lsb
                        temp[2] = data[0];                //humi msb
                        temp[3] = data[1];                //humi lsb
                        ack = 0;
                }
                else
                {
                        temp[0] = 0;                //temp msb
                        temp[1] = 0;                //temp lsb
                        temp[2] = 0;                //humi msb
                        temp[3] = 0;                //humi lsb

                        ack = 1;
                }
                //Stop
                DHT_Delay(50);                //delay 50us
                DHT_DAT_HIGH();                //set data high
               
                return ack;
        }
}

//END OF DHT21.C

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-10-15 21:45:00 | 显示全部楼层
奇怪,排版怎么变化了?上传一下文件吧。

点击此处下载 ourdev_590191GFK30X.rar(文件大小:1K) (原文件名:dht21.rar)

出0入0汤圆

发表于 2011-6-1 09:07:29 | 显示全部楼层
累加和数据始终位0,是什么问题?

出0入0汤圆

发表于 2012-1-4 00:08:19 | 显示全部楼层
马克

出0入0汤圆

发表于 2012-4-14 14:03:24 | 显示全部楼层
MARK  真好  这个  我也在做这个 好像和DHT11兼容的

出0入0汤圆

发表于 2012-7-7 11:28:02 | 显示全部楼层
楼主弱弱的问一声。。。不是说8M晶振的最大延时是96us吗   250us不是溢出了吗

出0入0汤圆

发表于 2012-11-21 12:19:27 | 显示全部楼层
不错,支持

出0入0汤圆

发表于 2013-4-8 17:25:39 来自手机 | 显示全部楼层
谢谢楼主......
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表