搜索
bottom↓
回复: 5

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

[复制链接]

出0入4汤圆

发表于 2015-9-7 13:22:07 | 显示全部楼层 |阅读模式
程序是根据网上的例子修改而来的,已经在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[5]={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[i]=DHTReadByte();  
        }
        if(Data[0]+Data[2]==Data[4])
        {
                RH_valve=Data[0];     //湿度
                RH_value_dot=Data[1];
                Temp_valve=Data[2];     //温度         
        }
}
辅助文件
mylib.h文件
#ifndef _Mylib_H_
#define _Mylib_H_
#define xtal 11.0592
#define uint unsigned  int
#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--);
}

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2015-9-10 21:45:29 | 显示全部楼层
精度如何?

出0入0汤圆

发表于 2015-9-11 07:58:43 来自手机 | 显示全部楼层
死等不加溢出吗

出0入4汤圆

 楼主| 发表于 2015-12-19 11:55:44 | 显示全部楼层

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

出0入4汤圆

 楼主| 发表于 2015-12-19 11:57:48 | 显示全部楼层

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

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-25 21:46

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

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