shuipaopao 发表于 2015-9-7 13:22:07

发一个调试好的DHT11驱动程序

程序是根据网上的例子修改而来的,已经在AVR上调试成功,单片机晶振为11.0592,里面的延时函数是通过示波器调试出来的,现将h文件,C文件上传,供大家参考。
DHT11.h文件
#ifndef _DHT11_H_
#define _DHT11_H_
extern int RH_valve;
extern int RH_value_dot;
extern int Temp_valve;
unsigned char DHTReadByte(void);//从DHT11中读一个字节
void DHTReadData(void);//读DHT11中的数据
#endif
DHT11.C文件
#include<iom64v.h>
#include<macros.h>
#include"DHT11.h"
#include"Mylib.h"
int RH_valve=0;
int RH_value_dot=0;
int Temp_valve=0;
unsigned char DHTReadByte(void)
{
unsigned char i,Data=0 ;   
DDRA&=~(1<<PA0);             //设置PA0为输入
for(i=0;i<8;i++)
{                                                           
        while(!(PINA&(1<<PA0))); //等待50us低电平数据位间隙过去,等高电平到来                                             
        delayus(25);       //延时40us ,延时必须(26-28us)
        delayus(25);
        delayus(8);
        Data<<=1;                                               
        if(PINA&(1<<PA0))      //如果40us以后采集到数据还是高电平,则输出为高电平
        {
                Data|=0X01;
        }
        else
        {
                Data|=0X00;
        }                                                     
        while(PINA&(1<<PA0));    //等50us低电平到来 ,然后去读下一位数据                                                
}   
return(Data);
}
void DHTReadData(void)//读DHT11中的数据
{   
          unsigned char i,Data={0,0,0,0,0};
          DDRA|=(1<<PA0);
          PORTA|=(1<<PA0);
          delayms(5);
          PORTA&=~(1<<PA0);      //发送启动信号
          delayms(10);//拉低至少18ms
          delayms(10);
          delayms(2);
          PORTA|=(1<<PA0);
          delayus(25);//主机拉高20-40?s
          delayus(25);
          DDRA&=~(1<<PA0);   //配置为输入模式
          PORTA&=~(1<<PA0);//内部不上拉
          delayus(25);
          delayus(25);
       if(!(PINA&(1<<PA0)))
        while(!(PINA&(1<<PA0)));   // 等待响应信号结束
        while(PINA&(1<<PA0));//等待高电平结束         
        for(i=0;i<5;i++)//读取五个字节数据         
        {
             Data=DHTReadByte();
        }
        if(Data+Data==Data)
        {
                RH_valve=Data;   //湿度
                RH_value_dot=Data;
                Temp_valve=Data;   //温度       
        }
}
辅助文件
mylib.h文件
#ifndef _Mylib_H_
#define _Mylib_H_
#define xtal 11.0592
#define uint unsignedint
#define uchar unsigned char
void delay_ms(void);
void delayms(uint ms);
void delayus(unsigned int temp);
#endif
mylib.C文件
#include"Mylib.h"
/************************************************
*函数名称: void delayms(uint ms)
*入口参数: 无
*出口参数: 无
*函数功能: 延时1Ms
*创建时间: 2012.09.24
*修改说明:
/************************************************/
void delay_ms(void)
{
uint i;
for(i=1;i<(uint)(xtal*143-2);i++);
}
void delayms(uint ms)
{
uint i=0;
for(i=0;i<ms;i++)
delay_ms();
}
/***********11.0592M*********
//delayus(1000);//500us
//delayus(25);//15us
//delayus(450);//240us
//delayus(125);//70us
//delayus(8);//6us
//delayus(88);//50us
*****************************/
/***********4.9152M*********
//delayus(406);//500us
//delayus(9);//15us
//delayus(194);//240us
delayus(54);//70us
//delayus(2);//6us
//delayus(38);//50us
*****************************/
void delayus(unsigned int temp)
{
while(temp--);
}

hetao7241 发表于 2015-9-10 21:45:29

精度如何?

Ray______ 发表于 2015-9-11 07:58:43

死等不加溢出吗

shuipaopao 发表于 2015-12-19 11:55:44

hetao7241 发表于 2015-9-10 21:45
精度如何?

数据手册上标明的是±5%RH,主要用途是民用。测室内相对湿度。

shuipaopao 发表于 2015-12-19 11:57:48

Ray______ 发表于 2015-9-11 07:58
死等不加溢出吗

是的,只是做出玩玩,只显示个相对湿度。有超时溢出的程序,没做。

漂渺 发表于 2016-3-10 21:08:25

收了,参考学习
页: [1]
查看完整版本: 发一个调试好的DHT11驱动程序