找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1666|回复: 0
打印 上一主题 下一主题
收起左侧

为什么采集不到值?请大神帮忙。谢谢!

[复制链接]
跳转到指定楼层
楼主
ID:189312 发表于 2017-4-13 19:19 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
void start()
{
DHTIO=1;
delay_10us();
DHTIO=0;
delay(25);  // 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号
DHTIO=1;  //发送开始信号结束后拉高电平延时20-40us
delay_10us();
delay_10us();
delay_10us();
}
/*-------------DHT11接受一个数据----------------*/
unsigned char COM()
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
  while(!DHTIO);//等待50us低电平结束
  delay_10us();
  delay_10us();
  delay_10us();
  temp=0;
  if(DHTIO==1)
  temp=1;   //如果26us-28us之后还为高电平则表示接收的数据为'1'
  while(DHTIO) //等待数据信号高电平'0'为26us-28us'1'为70us
  comdata<<=1;
  comdata|=temp;
}
return comdata;
}
/*--------------DHT11接收数据--------------*/
void RH()
{
unsigned char wendu_h_temp,wendu_l_temp,shidu_h_temp,shidu_l_temp,check_temp,i;
start();
DHTIO=1;
if(!DHTIO)  //判断从机是否有低电平响应信号
{
  while(!DHTIO);//判断从主机是否发出80us的低电平相应是否结束
  while(DHTIO);//判断主机是否发出80us高电平,发出则开始采集数据
  shidu_h_temp=COM();//采集湿度整数
  shidu_l_temp=COM();//采集湿度小数
  wendu_h_temp=COM();//采集温度整数
  wendu_l_temp=COM();//采集温度小数
  check_temp=COM();//采集校验位

  DHTIO=0;  //当最后一bit数据接完毕后从机拉低电平50us//
  for(i=0;i<7;i++)  //差不多50us的延时
  delay_10us();
  DHTIO=1;  //总线由上拉电阻拉高进入空闲状态
  num_check=shidu_h_temp+shidu_l_temp+wendu_h_temp+wendu_l_temp;
  if(num_check=check_temp) //判断读到的四个数据之和是否与校验位相同
  {
   shidu_h_data=shidu_h_temp;
   shidu_l_data=shidu_l_temp;
   wendu_h_data=wendu_h_temp;
   wendu_l_data=wendu_l_temp;
   check_temp=num_check;
  }
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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