哪位大侠用msp430f149单片机写过DTH11的程序?

2019-03-24 16:15发布

本人在用一款msp430f149单片机,通过DTH11温湿度传感器测定当前的温湿度,哪位大侠有现成的代码分享一下喂!不尽感谢! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
yejun5665
2019-03-25 03:24
< :TI_MSP430_内容页_SA7 --> 这个去哪儿找啊,我程序也有一个就是调不成功!悲剧啊!
#include<msp430x16x.h>
#define DATA_DIR_OUTPUT         P2DIR|=BIT2
#define DATA_DIR_INPUT         P2DIR&=~BIT2
#define DATA_H         P2OUT|=BIT2
#define DATA_L         P2OUT&=~BIT2
#define DATA_IN  ((P2IN&BIT2)>>2)
//#define DATA_IN         ((PINC & BIT(PC0)) >> PC0)
unsigned int temperature;
unsigned int humidity;
void delay_1us(void)                 //1us延时函数
{
  _NOP();
}

void delay_nus(unsigned int n)       //N us延时函数
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   _NOP();
}

void delay_ms(unsigned int n)                 //1ms延时函数
{
   unsigned int i,j;
   for(j=0; j<n; ++j)
   for (i=0;i<1140;i++);
}

unsigned char get_DHT11_value(void)
{       
    unsigned int bit;
    unsigned char p=0,time_count;
   
    temperature=0x0000;
    humidity=0x0000;
    bit=0x8000;
   
    DATA_L;
    DATA_DIR_OUTPUT;
    delay_ms(30);       //主机至少拉低18ms
    //delay_25_ms();
    DATA_H;
    delay_nus(30);         //主机拉高20~40us
    //delay_30_us();
   
    DATA_DIR_INPUT;
    delay_nus(60);
    //DelayUs(60);            //DHT11响应80us
    //delay_30_us();
    //delay_30_us();
   
    //无应答信号,退出
    if(DATA_IN!=0)                  
        return 0;
   
    //等待电平变高,设置200us超时控制
    time_count=0;
    while(DATA_IN == 0)
    {       
       delay_nus(10);
      //DelayUs(10);
      //delay_10_us();
      if(++time_count==20)        
        return 0;
    }
   
    //等待电平变低,设置150us超时控制
    time_count=0;
    while(DATA_IN==1)
    {       
      delay_nus(10);
      //delay_10_us();
      if(++time_count==15)        
        return 0;
    }
   
    //数据开始
    while(p!= 2)
    {       
        //低电平宽度50us
        //等待电平变高,设置100us超时控制
        time_count=0;
        while(DATA_IN==0)
        {       
           delay_nus(10);
          //delay_10_us();
          if(++time_count==10)
            return 0;
        }
        
        time_count=0;
        do
        {        
          delay_nus(10);
          //delay_10_us();
          time_count++;
          if(time_count==10)         
            return 0;
        }
        while(DATA_IN==1);
        
        //若高电平超过50us,说明数据位为1,否则为0
        if(time_count>=5)
        {       
          if(p==0)       
            humidity|=bit;
          if(p==1)       
            temperature|=bit;
        }
        
        bit>>=1;
        //1字节结束
        if(bit==0x0000)
        {       
          p++;
          bit=0x8000;
        }
    }
   
    return 1;
}
void main()
{
   
    WDTCTL=WDTPW+WDTHOLD;  
    get_DHT11_value( );
}

一周热门 更多>

相关问题

    相关文章