|
程序是根据网上的例子修改而来的,已经在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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|