历史上的今天
返回首页

历史上的今天

今天是:2024年09月17日(星期二)

2021年09月17日 | STM8单片机读取DHT11温湿度传感器

2021-09-17 来源:eefocus

DHT11是一款温湿度传感器,也是使用一根总线来驱动,使用方法和ds18b20温度传感器很类似。


供电电压 3.3~5.5V DC

测量范围 湿度5% ~ 95%RH, 温度-20℃ ~ +60℃

测量精度 湿度±5%RH, 温度±2℃

分 辨 率 湿度1%RH, 温度0.1℃

实物图如下所示

image.png?imageView2/2/w/550

引脚顺序从左到右,依次为1、2、3、4,引脚功能如下:


image.png?imageView2/2/w/550

典型应用电路如下:

image.png?imageView2/2/w/550

由于单总线在通信时空闲状态下,电平为高电平,所以外部在2脚上要接一个上拉电阻电阻,这样当总线上没有数据传输时,就会被外部上拉电阻将数据引脚的电平强制设置为高电平。


通过单总线读取数据时,分为三个步骤:


主机发送请求指令

从机返回相应指令

主机开始从从机读取数据


1.请求指令:

主机发送求请求指令时,需要将总线至少拉低18ms,然后再释放总线40us。

image.png?imageView2/2/w/550

2.响应指令

当传感器检测到主机的请求指令后,它会给主机发送一个响应指令,告诉主机,通信已经成功了。传感器返回的响应指令为 54us低电平,80us高电平。

image.png?imageView2/2/w/550

3.读取数据

当传感器发送完响应指令后,会紧跟着发送40bit的数据,8个bit为一位数据,总共五个数据,包含当前的温度和湿度数据。前两个数据是湿度数据的整数部分和小数部分。紧跟着的两个数据是温度数据的整数部分和小数部分。最后一个数据是前面四个数据的校验和。


数据的整体格式为“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和”

image.png?imageView2/2/w/550

在数据传输的时候,通过高低电平的时间长短来代表发送的数据是“0”还是“1”。


         Bit ‘0’ : ~54uS 低电平 和 ~24uS 高电平


         Bit ‘1’ : ~54uS 低电平 和 ~70uS 高电平


image.png?imageView2/2/w/550

结束标志:


当数据传输完成后,传感器会将总线拉低54us,然后释放总线,代表数据传输结束,此时传感器进入睡眠模式,等待下一次的请求信号才会重新唤醒。

image.png?imageView2/2/w/550

完整的一次读取数据时序图如下所示:

image.png?imageView2/2/w/550

首先MCU发送请求命令,然后等待传感器的响应,传感器响应完成后,会紧跟着发送40bit的数据,然后发送结束标志。然后就自动进入睡眠模式,等待MCU的下一次唤醒。

时序搞清楚之后,下面就可以开始编写代码了。


代码如下:


#include "dht11.h"

#include "stm8s103f3p.h"

#include "delay.h"

//IO口操作

_Bool  DHT11_DQ_OUT @PD_ODR:3;

_Bool  DHT11_DQ_IN  @PD_IDR:3;

//PD3 方向设置

void DHT11_IO_IN(void)

{

    PD_DDR&=~(1<<3);    //输入 PD3

    PD_CR1|=(1<<3);     //

}

void DHT11_IO_OUT(void)

{

    PD_DDR|=(1<<3);     //输出 PD3

    PD_CR1|=(1<<3);     //

}

//发送起始信号 低电平18ms

void DHT11_Rst(void)

{

    DHT11_IO_OUT(); //设置为输出    

    DHT11_DQ_OUT=0; //拉低DQ

    delay_ms(20);   //拉低至少18ms

    DHT11_DQ_OUT=1; //置高DQ

    delay_us(30);   //主机拉高20--40us

}

//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

unsigned char DHT11_Check(void)

{

    //DHT输出80us低电平,作为应答信号

    //DHT输出80us高电平,通知处理器准备接收数据

    unsigned char retry=0;

    DHT11_IO_IN();//SET INPUT  

    while (!DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us

{

retry++;

delay_us(1);

};  

if(retry>=100)return 1;

else retry=0;

    while (DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us

{

retry++;

delay_us(1);

};

if(retry>=100)return 1;     

return 0;

}

//从DHT11读取一个位

//返回值:1/0

unsigned char DHT11_Read_Bit(void)

{

//数据为“0”格式:50us的低电平 + 26-28us的高电平

//数据为“1”格式:50us的低电平 + 70us的高电平

   unsigned char retry=0;

   while(DHT11_DQ_IN && retry<100)//若为高电平说明上一位数据传输还未结束,等待变为低电平

{

retry++;

delay_us(1);

}

retry=0;

    while(!DHT11_DQ_IN && retry<100)//若为低电平,说明还未开始传输数据,等待变高电平

{

retry++;

delay_us(1);

}

    delay_us(40);//等待40us     0为 50us低电平 26--28us高电平    1为 50us低电平 70us高电平

    if(DHT11_DQ_IN) return 1;

    else  return 0;

}

//从DHT11读取一个字节

//返回值:读到的数据

unsigned char DHT11_Read_Byte(void)

{

    unsigned char i,dat;

    dat=0;

    for(i=0;i<8;i++)

    {

        dat<<=1;

        dat|=DHT11_Read_Bit();

    }

    return dat;

}

//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)

{

    unsigned char buf[5];

    unsigned char i;

    DHT11_Rst();

    if(DHT11_Check()==0)    //读取40位数据

    {

      for(i=0;i<5;i++)

      {

          buf[i]=DHT11_Read_Byte();

      }

      if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])//湿度整数 湿度小数 温度整数 温度小数 校验和

      {

          *humi=buf[0];     

          *temp=buf[2];

      }

    }

    else return 1;

  return 0;

}

//初始化DHT11的IO口 DQ 同时检测DHT11的存在

//返回1:不存在

//返回0:存在   

unsigned char DHT11_Init(void)

{

    DHT11_IO_OUT();

    DHT11_DQ_OUT=1;

    DHT11_Rst();

    return DHT11_Check();

}


读取温度时,直接在主函数中调用


#include "stm8s103f3p.h"

#include "delay.h"

#include "dht11.h"


//时钟配置 16Mhz

void CLK_Init(void)

{

CLK_SWR=0xe1; //HSI为主时钟源  16MHz CPU时钟频率

CLK_CKDIVR=0x00; //CPU时钟0分频,系统时钟0分频

}

//读取温度湿度数据

void read_tem_hum(void)

{

    unsigned char temperature[2]={0};

    unsigned char humidity[2]={0};

    DHT11_Read_Data(temperature,humidity);   

}

main()

{

    _asm("sim"); //关全部中断

    CLK_Init();

    delay_init(16);

    _asm("rim"); //开全部中断

  while (1)

    {

        read_tem_hum();

    }

}


通过单片机的IO口输出高低电平来模拟单总线的时序,这样就可以将温度和湿度的数据读出来了。

推荐阅读

史海拾趣

BURGESS公司的发展小趣事

BURGESS公司于1975年3月13日在伦敦正式成立,这标志着它在游艇经纪行业的起点。创立之初,BURGESS就凭借其专业的知识和敏锐的市场洞察力,在短短四年内成功进驻摩纳哥这一游艇行业的重镇。更令人瞩目的是,在同一年,BURGESS成功售出了当时世界上最大的游艇,这一成就不仅彰显了其卓越的实力,也为其在行业内赢得了极高的声誉。

Don Connex Electronics Co Ltd公司的发展小趣事

Don Connex Electronics Co Ltd成立于上世纪90年代初,当时电子行业正处于快速发展阶段。公司的创始人李明凭借其在半导体领域的深厚技术背景,带领团队研发出了一款高性能的电源管理芯片,这款芯片在业界引起了广泛关注。该芯片以其低功耗、高效率的特性,迅速在市场上打开了局面,为公司的初创阶段奠定了坚实的基础。

Alorium Technology公司的发展小趣事

随着国内市场的逐渐饱和,Don Connex Electronics开始寻求海外市场的拓展。公司组建了一支专业的国际市场团队,积极参加国际电子展会,与国际客户建立联系。通过不断努力,公司成功打入欧洲和北美市场,并与多家国际知名企业建立了长期合作关系。这一举措不仅提升了公司的品牌影响力,也极大地促进了公司的销售业绩。

芯旺微电子(ChipON)公司的发展小趣事

芯旺微电子一直将技术创新作为公司发展的核心驱动力。公司拥有一支高素质的研发团队,不断在CPU系统结构、编译器、IDE软件、数模混合设计等领域进行技术创新和突破。这些技术创新的成果不仅提升了芯旺微电子的产品性能和质量,也为其在激烈的市场竞争中赢得了更多的机会和优势。

Globaltech Semiconductor Co Ltd公司的发展小趣事

随着技术的不断成熟,Globaltech开始积极拓展国际市场。公司通过与国内外多家系统厂商建立紧密的合作关系,共同开发新产品,进一步提升了其市场竞争力。特别是在亚洲市场,Globaltech凭借其高性价比的产品和快速的响应能力,迅速占据了大量市场份额。同时,公司还积极参与国际展会,与全球客户面对面交流,进一步提升了品牌知名度和影响力。

Gazelle Microcircuits Inc公司的发展小趣事
这个电压通常用于主板上的某些特定元件或模块,如某些类型的内存控制器或特定芯片。需要注意的是,+5.1V并不是所有主板都会有的标准电压输出,它的出现可能取决于主板的设计和需求。

问答坊 | AI 解惑

单身男女找缘份

看看你的缘份是谁,预定你后面的楼位,不要定从复了啊。 我先来定108号了。 不过要定位子先要发点东西 来啊。 …

查看全部问答>

红外发光二极管的接收头主要用什么?

红外发光二极管的接收头主要用什么?外发光二极管又是用什么样的二极管? [ 本帖最后由 冷枫yj 于 2009-5-15 10:37 编辑 ]…

查看全部问答>

桥式整流器

如何选桥式整流器   大于1A   600Vrrm的贴片封装…

查看全部问答>

【人生感悟转】做FPGA的出路在哪里?

已经而立之年,对30以后该以怎样的一个状态生活,也比以前思考的多些。 很多人都说,技术员(工程师)30以后要正确向领导(技术型领导)或者创业方面转,而不能继续去做技术。因为论精力,比不上新毕业的学生、论时间我们也没有他们多。面对技术更 ...…

查看全部问答>

创意改变生活,不知大家是否有同感?

这两天看到咱论坛zcgzanne 的帖子:https://bbs.eeworld.com.cn/thread-94882-1-3.html 感觉一个小小的想法,就可以将身边行将废弃的东西,发挥到自己应该发挥的地方; 再看西门的帖子:https://bbs.eeworld.com.cn/thread-95011-1-1.html 稍稍设 ...…

查看全部问答>

请问一下eboot与os有直接的关系么

比如用64/128M的flash是不是要用其指定的eboot,如果不指定的话,os是否会跑飞?…

查看全部问答>

想买一块嵌入式开发板,大家有什么好的建议?

请推荐一款嵌入式开发板子,可以移植uclinux,wince,arm 平台的,其他平台也ok了.基本的 usb device .LCD 触摸屏的最好 了,LAN interface.....大家有什么好介绍..…

查看全部问答>

请问QV2 D极为何会发黑,而且QV2零件还是好的

请教各位大侠以下问题:  以下图中QV2 N-MOS的D极在线路板上为何会有烧黑的痕迹,而且该MOS管用万用表量测还是好的, 这应该是个利用电感 升压的电路,输入是+12v ,输出为-52v左右,是共Voip电压使用的, 电感LV4=6.8uH +/-20% -4.5A ...…

查看全部问答>