关于51单片机中DHT11温湿度传感器器问题 20
大神帮忙看一下我这个程序出在哪嘛,问什么温湿度传感器没响应,采集不了数据,我真的服了。晶振22.1184MHz的1T单片机,DHT11并没有将总线拉低(我设置报警判断过)...
大神帮忙看一下我这个程序出在哪嘛,问什么温湿度传感器没响应,采集不了数据,我真的服了。晶振22.1184MHz的1T单片机,DHT11并没有将总线拉低(我设置报警判断过)。但是用他人的11.0592MHz单片机通过串口发数据就能响应,不过程序是网上的,我的程序跟网上差不多啊。
void Delay_ms(unsigned int dly)
{
unsigned int dly1; //内循环变量
while(dly--) //外循环,递减至0
{dly1=950; while(dly1--);} //内循环,延时1ms
}
void delay_10us(uint t)
{
for (;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
uchar send_byte(void)//送出一个字节
{
uchar i,b;
uint c;
for(i=0;i<8;i++)
{ c=2;
while((!DHT11_Bus)&&(c++)); //将总线拉低,等待50us开始信号结束数据,开始传输
//a=DHT11_Bus; //DHT11将总线拉高,
delay_10us(8); //延时到26-28us时,表示输出0
b=0;
if(DHT11_Bus)
b=1;
c=2;
while((DHT11_Bus)&&c++);//超时则跳出for循环
if(c==1)break;
RT_type<<=1;
RT_type|=b; //将RT_type和b”或“运算,所得的结果,送到RT_type中
}
return RT_type; //到此,一个字节发送完,将其返回
}
//读取一路湿温度值
void read_DHT11()//
{
uchar a,R_H,R_L,T_H,T_L,RT_check;
uint c;
DHT11_Bus=0; //在将总线拉低,传感器读取设备发出的响应信号
Delay_ms(18); //大于18ms
DHT11_Bus=1; //再释放总线,等待传感器响应信号
delay_10us(3); //发送开始信号结束后,延时20-40us即可,
DHT11_Bus=1; //主机将总线拉高,判断从机DHT11响应信号
if(!DHT11_Bus) //判断总线是否有低电平响应
{
c=2;
while((!DHT11_Bus)&&(c++));//判断从机发出80us 的低电平响应信号是否结束
c=2;
while(DHT11_Bus&&(c++)); //判断从机发出80us 的高电平是否结束
R_H=send_byte();
R_L=send_byte();
T_H=send_byte();
T_L=send_byte();//读取温度值
RT_check=send_byte();; //读取校验位
delay_10us(100);
DHT11_Bus=1;//读取完毕,从机拉低总线50us,后将总线空闲
a=(R_H+R_L+T_H+T_L); //得到前四组8位数据相加送入a
if(a==check) //判断a是否与校验位RT_check相等
{RH=R_H;RL=R_L;TH=T_H;TL=T_L;check=RT_check;}//取出温度和湿度高8位
}
// RH=34;TH=26;
table_R[0]=RH/10+0x30;
table_R[1]=RH%10+0x30;
table_T[0]=TH/10+0x30;
table_T[1]=TH%10+0x30;
}
说明:DHT11_Bus数据总线,程序中没有定义的变量RH、TH、TL、RL、table_R[i]都是全局变量,没有别的意思,//后面的东西代表不用,请大神们注意! 展开
void Delay_ms(unsigned int dly)
{
unsigned int dly1; //内循环变量
while(dly--) //外循环,递减至0
{dly1=950; while(dly1--);} //内循环,延时1ms
}
void delay_10us(uint t)
{
for (;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
uchar send_byte(void)//送出一个字节
{
uchar i,b;
uint c;
for(i=0;i<8;i++)
{ c=2;
while((!DHT11_Bus)&&(c++)); //将总线拉低,等待50us开始信号结束数据,开始传输
//a=DHT11_Bus; //DHT11将总线拉高,
delay_10us(8); //延时到26-28us时,表示输出0
b=0;
if(DHT11_Bus)
b=1;
c=2;
while((DHT11_Bus)&&c++);//超时则跳出for循环
if(c==1)break;
RT_type<<=1;
RT_type|=b; //将RT_type和b”或“运算,所得的结果,送到RT_type中
}
return RT_type; //到此,一个字节发送完,将其返回
}
//读取一路湿温度值
void read_DHT11()//
{
uchar a,R_H,R_L,T_H,T_L,RT_check;
uint c;
DHT11_Bus=0; //在将总线拉低,传感器读取设备发出的响应信号
Delay_ms(18); //大于18ms
DHT11_Bus=1; //再释放总线,等待传感器响应信号
delay_10us(3); //发送开始信号结束后,延时20-40us即可,
DHT11_Bus=1; //主机将总线拉高,判断从机DHT11响应信号
if(!DHT11_Bus) //判断总线是否有低电平响应
{
c=2;
while((!DHT11_Bus)&&(c++));//判断从机发出80us 的低电平响应信号是否结束
c=2;
while(DHT11_Bus&&(c++)); //判断从机发出80us 的高电平是否结束
R_H=send_byte();
R_L=send_byte();
T_H=send_byte();
T_L=send_byte();//读取温度值
RT_check=send_byte();; //读取校验位
delay_10us(100);
DHT11_Bus=1;//读取完毕,从机拉低总线50us,后将总线空闲
a=(R_H+R_L+T_H+T_L); //得到前四组8位数据相加送入a
if(a==check) //判断a是否与校验位RT_check相等
{RH=R_H;RL=R_L;TH=T_H;TL=T_L;check=RT_check;}//取出温度和湿度高8位
}
// RH=34;TH=26;
table_R[0]=RH/10+0x30;
table_R[1]=RH%10+0x30;
table_T[0]=TH/10+0x30;
table_T[1]=TH%10+0x30;
}
说明:DHT11_Bus数据总线,程序中没有定义的变量RH、TH、TL、RL、table_R[i]都是全局变量,没有别的意思,//后面的东西代表不用,请大神们注意! 展开
展开全部
第44期《Arduino入门》传感器 05:温度与湿度传感器 DHT11(上)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
解决了吗?我也发生了一样的问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序太长,没细看。51单片机有个毛病,读数据之前要先将该位置1,不知你是不是注意到了
追问
你好,你这个想法到时提示了我,但是一般都是默认准双向I/O,用在其他情况都没事啊,如果改了能实现,我再给你些财富值,希望你多提点其他的建议!
试过还是不行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询