minier 发表于 2012-4-9 11:26:46

DHT22(AM2303)的AVR的GCC例程

DHT22(AM2303)的AVR的GCC例程,运行已经1年,非常稳定

#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
//#include"DHT22.h"
#include"UART.H"
//

//端口设定
#define DHT22_PIN             PA0
#define DDR_DHT22             DDRA
#define PORT_DHT22            PORTA
#define PIN_DHT22             PINA
//端口操作宏定义
#define DHT22_PIN_SET_OUT()   DDR_DHT22|=(1<<DHT22_PIN)
#define DHT22_PIN_SET_IN()    DDR_DHT22&=~(1<<DHT22_PIN)
#define DHT22_WR1()         PORT_DHT22|=(1<<DHT22_PIN)
#define DHT22_WR0()         PORT_DHT22&=~(1<<DHT22_PIN)
#define R_DHT22()             PIN_DHT22&(1<<DHT22_PIN)

unsigned char star=0 ;
//
unsigned char FLAG , temp , comdata ;
//
unsigned char T_data_H_temp , T_data_L_temp , RH_data_H_temp , RH_data_L_temp , checkdata_temp ;
//
void COM(void)
{

unsigned chari;
for(i=0;i<8;i++)          
    {
       FLAG=2;
       while((!(R_DHT22()))&&FLAG++);
       if(FLAG==1)break;
       _delay_us(10);
       _delay_us(10);
       _delay_us(10);
       _delay_us(10);
       temp=0;
       if(R_DHT22())temp=1;
       FLAG=2;
       while((R_DHT22())&&FLAG++);
       //超时则跳出for循环                  
       if(FLAG==1)break;
       //判断数据位是0还是1       
   // 如果高电平高过预定0高电平值则数据位为 1
   comdata<<=1;
   comdata|=temp;      //0
        }//rof
}
//
void RH(void)
        {
       
          //主机拉低18ms
       DHT22_PIN_SET_OUT() ;
       DHT22_WR0();
           _delay_ms(1);
           DHT22_PIN_SET_IN();
           DHT22_WR1();
          
       //总线由上拉电阻拉高 主机延时20us
           _delay_us(10);
           _delay_us(10);
           _delay_us(10);
           _delay_us(10);
       //主机设为输入 判断从机响应信号
       //P2_0=1;
       
       //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
          // if(!P2_0)               //T !       
           if(R_DHT22())FLAG=1;
           while(!(R_DHT22()))               
           {
           FLAG=2;
       //判断从机是否发出 80us 的低电平响应信号是否结束       
           //while((!P2_0)&&U8FLAG++);
           while((!(R_DHT22()))&&FLAG++);
           if(FLAG==1)break;
           FLAG=2;
       //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
       //while((P2_0)&&U8FLAG++);
           while((R_DHT22())&&FLAG++);
           if(FLAG==1)break;
       //数据接收状态               
           COM();
           if(FLAG==1)break;
           T_data_H_temp=comdata;
           COM();
           if(FLAG==1)break;
           T_data_L_temp=comdata;
           COM();
           if(FLAG==1)break;
           RH_data_H_temp=comdata;
           COM();
           if(FLAG==1)break;
           RH_data_L_temp=comdata;
           COM();
           if(FLAG==1)break;
           checkdata_temp=comdata;
           break;
          }//while
           //P2_0=1;
           DHT22_PIN_SET_IN();
           DHT22_WR1();
       //数据校验
       /*
           temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
           if(U8temp==U8checkdata_temp)
           {
                     U8RH_data_H=U8T_data_H_temp;
                     U8RH_data_L=U8T_data_L_temp;
                     U8T_data_H=U8RH_data_H_temp;
                     U8T_data_L=U8RH_data_L_temp;
                     U8checkdata=U8checkdata_temp;
           }//fi
          
          */
           DHT22_PIN_SET_IN();
           DHT22_WR1();
}
//
int main(void)
{
//unsigned char data={0};
//unsigned char i;
Init_Uart();
asm("sei") ;
UART_Transmit(0x34) ;
DHT22_PIN_SET_IN();
DHT22_WR1();
while(1)
      {
           if(star>0)//串口接收到一个非0数字
              {
                   asm("cli") ;
                   RH();
                   UART_Transmit(T_data_H_temp) ;
                   UART_Transmit(T_data_L_temp) ;
                   UART_Transmit(RH_data_H_temp) ;
                   UART_Transmit(RH_data_L_temp) ;
                   UART_Transmit(checkdata_temp) ;
                   asm("sei");
                   star = 0 ;
                  }
       //DHT22_Start();
       _delay_us(50);
       _delay_ms(50);
       _delay_ms(50);
       _delay_ms(50);
          }

}
/****************************************************
                     UART中断函数

****************************************************/
ISR(USART_RXC_vect)
{
asm("cli");//关中断
star = UDR;//读取暂时无用
asm("sei");//开中断
return ;
}
//

minier 发表于 2012-4-9 11:29:11

值得高兴的是,去年买还是至少40多的DHT22,现在居然大幅掉价,淘宝上居然有25元的!哈
http://item.taobao.com/item.htm?id=15105931142&

搞电子这行看来真是…………

minier 发表于 2012-4-9 14:43:18

如果DHT22可以像DS18B20一样,可以单总线挂接多个器件就好了

shichenxiaohai 发表于 2012-12-1 23:58:27

FLAG=2;
         
while((!(R_DHT22()))&&FLAG++);

看不懂。。。,求教呀。。

shichenxiaohai 发表于 2012-12-3 02:22:11

太坏了,有一个地方的写反了。。。初学的人肯定会先失败,然后找呀找呀找错误。。看起来是对的,运行起来就有问题啦。。。。{:curse:}

minier 发表于 2013-5-3 08:01:26

楼上不厚道,我运行的很好!你试验了吗?鄙视
页: [1]
查看完整版本: DHT22(AM2303)的AVR的GCC例程