发一个调试好的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
精度如何?
数据手册上标明的是±5%RH,主要用途是民用。测室内相对湿度。 Ray______ 发表于 2015-9-11 07:58
死等不加溢出吗
是的,只是做出玩玩,只显示个相对湿度。有超时溢出的程序,没做。 收了,参考学习
页:
[1]