查看: 653|回复: 0
打印 上一主题 下一主题

DHT22(AM2303)的AVR的GCC例程

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-28 18:25:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 char  i;
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[10]={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 ;
}
//
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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