DHT11显示一直为零
最近一直在调试DHT11,知道对时序要求比较高,延时函数都是用示波器测量的。 液晶是用的12864,就不贴程序了,一直显示的为0,求各位大虾帮忙解决一下。MCU:atmega16内部晶振:1MHz
void delay_10us() //10us
{
NOP();
}
void delay_20us()
{
NOP(); //10us
NOP(); //12us
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP(); //20us
}
void delay_nus(uint i)
{
while(--i);
}
void delay_ms(uint ms)
{
uint i;
while(ms--)
{
for(i=144;i>0;i--);
}
}
/*******DHT11的引脚控制*************/
#define DHT_OUT DDRA|= BIT(3)
#define DHT_IN DDRA&=~BIT(3)
#define DHT_1 PORTA|= BIT(3)
#define DHT_0 PORTA&=~BIT(3)
#define DHT_R (PORTA& BIT(3))
/******变量的定义*******/
uchar RH_data_H,TM_data_H,RH_data_L,TM_data_L,Check_Data,temp;
uchar data; //数据缓冲数组
/*************************************************************
函数名称:Receive_Data
功能:接受数据
************************************************************/
void Receive_Data()
{
uchar i,j,m;
DHT_IN;
for(i=0;i<5;i++) //五字节的数据
{
data=0x00;
for(j=0;j<8;j++)
{
while(!DHT_R); //等待高电平的到来,当高电平到来后便开始计时
delay_nus(5); //这边的50us是低电平时隙开始
//延时50us后看还是不是高电平,如果是高那么这位就为1,否则为0
//delay_nus(5);
//上面延时了50us,此时引脚数据寄存器还是高电平的话,表明接受到的是1
if(DHT_R) //否则为0
{
data|=BIT(7-j); //由此可知,先读取的高位,此命令只是写入1的位,data = 0X00,所以没写的还是0
while(DHT_R); //如果是低电平则表示下一位的开始
}
}
}
}
/***********************************************
函数名称:Ask_Reply_Do
功能:主机发出信号,DHT11回复信号,并且处理接收到的数据
**************************************************/
void Ask_Reply_Do()
{
//主机拉低18ms
uchar i;
DHT_OUT; //DATA_OUT;
DHT_0; //PORT_CLR;
delay_ms(50);
DHT_1; //PORT_SET
//总线由上拉电阻拉高 主机延时20us
delay_nus(2);
DHT_IN; //DATA_IN;
// delay_10us(); //主机设为输入 判断从机响应信号
if(!DHT_R) // 判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
//判断从机是否发出 80us 的低电平响应信号是否结束
while(!DHT_R); //等待从机把电平拉高
while(DHT_R); //从机是否发出了高电平,是的话就跳出继续
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
Receive_Data();
DHT_OUT;
DHT_1; //PORT_SET;
//数据校验
temp=(data+data+data+data);
if(data==temp)
{
RH_data_H=data; //只要整数部分
RH_data_L=data;
TM_data_H=data;
TM_data_L=data;
Check_Data=data;
}
}
}
这种东西不准,做过你就知道了! 特别是湿度,变化大没法实用,只能玩玩。 ddcchh 发表于 2014-4-14 17:40
这种东西不准,做过你就知道了!
呵呵,就是想知道为什么我读的数据一直是零。 ddcchh 发表于 2014-4-14 17:41
特别是湿度,变化大没法实用,只能玩玩。
就是做着玩的,就是想知道为什么我读的数据是零。 下周末回家把我调好的程序贴出来,我是用4个LED显示的,弄了很长时间。 ddcchh 发表于 2014-4-14 23:36
下周末回家把我调好的程序贴出来,我是用4个LED显示的,弄了很长时间。
好的,谢谢 我已经弄了四五天了 不稀奇,光看Pdf文件也要一天,多想想有好处,很容易出来了,就不想搞了!
本来我想深入开发一下,但看了它的精度就不想弄了?我用的是广州奥松的传感DHT11有可能是dht11问题
我的贴子中有一个是内置单片机的,是dht11升级版,这个还内置了ds18b20. 看我以前发的毕业分享的帖子,里面有51的程序 ddcchh 发表于 2014-4-15 00:00
不稀奇,光看Pdf文件也要一天,多想想有好处,很容易出来了,就不想搞了!
本来我想深入开发一下,但看了它 ...
好的,谢谢 做了玩的 eva015401 发表于 2014-4-15 08:10
看我以前发的毕业分享的帖子,里面有51的程序
好的谢谢 楼主要的程序,参考一下,本来想拍一张实物图,但做过的东西太多,不好找。
毕业设计做的是DHT21的,没有遇到这个情况!具体是什么原因呢?现在解决了没有? 奮闘ing 发表于 2014-4-21 10:09
毕业设计做的是DHT21的,没有遇到这个情况!具体是什么原因呢?现在解决了没有? ...
还没有解决 程序贴在上面了,不知道什么原因 ddcchh 发表于 2014-4-21 09:34
楼主要的程序,参考一下,本来想拍一张实物图,但做过的东西太多,不好找。
谢谢啦,用你的试试看 这种是用串口发至PCR的,很方便。 大多数是时序问题,如在晶振11.0592M和22.1148M的时序是不一的 {:tongue:}会烧坏的哦 ~ 2k_man 发表于 2014-4-21 17:27
会烧坏的哦 ~
会烧坏什么? 初始化时间比较长,有时要5分钟到10分钟才有数据,要是超过还没有数据那就是其它原因
页:
[1]