DHT11是一款温湿度传感器,也是使用一根总线来驱动,使用方法和ds18b20温度传感器很类似。
供电电压 3.3~5.5V DC
测量范围 湿度5% ~ 95%RH, 温度-20℃ ~ +60℃
测量精度 湿度±5%RH, 温度±2℃
分 辨 率 湿度1%RH, 温度0.1℃
实物图如下所示
引脚顺序从左到右,依次为1、2、3、4,引脚功能如下:
典型应用电路如下:
由于单总线在通信时空闲状态下,电平为高电平,所以外部在2脚上要接一个上拉电阻电阻,这样当总线上没有数据传输时,就会被外部上拉电阻将数据引脚的电平强制设置为高电平。
通过单总线读取数据时,分为三个步骤:
主机发送请求指令
从机返回相应指令
主机开始从从机读取数据
1.请求指令:
主机发送求请求指令时,需要将总线至少拉低18ms,然后再释放总线40us。
2.响应指令
当传感器检测到主机的请求指令后,它会给主机发送一个响应指令,告诉主机,通信已经成功了。传感器返回的响应指令为 54us低电平,80us高电平。
3.读取数据
当传感器发送完响应指令后,会紧跟着发送40bit的数据,8个bit为一位数据,总共五个数据,包含当前的温度和湿度数据。前两个数据是湿度数据的整数部分和小数部分。紧跟着的两个数据是温度数据的整数部分和小数部分。最后一个数据是前面四个数据的校验和。
数据的整体格式为“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和”
在数据传输的时候,通过高低电平的时间长短来代表发送的数据是“0”还是“1”。
Bit ‘0’ : ~54uS 低电平 和 ~24uS 高电平
Bit ‘1’ : ~54uS 低电平 和 ~70uS 高电平
结束标志:
当数据传输完成后,传感器会将总线拉低54us,然后释放总线,代表数据传输结束,此时传感器进入睡眠模式,等待下一次的请求信号才会重新唤醒。
完整的一次读取数据时序图如下所示:
首先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口输出高低电平来模拟单总线的时序,这样就可以将温度和湿度的数据读出来了。
上一篇:STM8单片机ADC单次采样模式
下一篇:STM8单片机读取18B20温度传感器
推荐帖子
- 开关电源输出电压偏低
- 刚买了一款带+12V和-12v两对独立的开关电源输出,但是空载时,+12V普遍偏低,想做一款DCtoDC的方案给输出稳定到+12V,要求输出电流需要4-5A求一款类似的电源IC\或者有别的解决方案开关电源输出电压偏低不知道你买的开关电源是哪一种。很多模块式开关电源输出是可以微调输出电压的。打开盖子后在电路板上可以见到一个小电位器,调节这个电位器即可稍微改变输出电压。如果你买的开关电源是这种可调输出的,那么可以调节这个电位器使输出达到你需要的数值。另外,你可
- fangfang120 模拟电子
- NTC负温度系数热敏电阻[概念,计算方法,应用场合]
- NTC负温度系数热敏电阻NTC热敏电阻是指具有负温度系数的热敏电阻。是使用单一高纯度材料、具有接近理论密度结构的高性能陶瓷。因此,在实现小型化的同时,还具有电阻值、温度特性波动小、对各种温度变化响应快的特点,可进行高灵敏度、高精度的检测。本公司提供各种形状、特性的小型、高可靠性产品,可满足广大客户的应用需求。NTC负温度系数热敏电阻工作原理NTC是NegativeTemperatureCoefficient的缩写,意思是负的温度系数,泛指负温度系数很大的半导体材料
- 安_然 模拟电子
- 《MCU工程师炼成记》错别字9
- P222,倒数第8行 《MCU工程师炼成记》错别字9
- qinkaiabc 微控制器 MCU
- 摩托罗拉电子设计大赛优秀作品(二)
- 本帖最后由paulhyde于2014-9-1508:55编辑摩托罗拉电子设计大赛优秀作品(二)知识永远不过时,加油!!!!!!!!!!!!!!!
- clark 电子竞赛
- 想找些液晶显示的资料,帮帮我!
- 想找些液晶显示的资料,帮帮我!SWEIEQU20HGWEIEQU21HFZHIEQU30HXHUANEQU80HSTART:MOVFZHI,#00HHERE:MOVXHUAN,#05HLOOP1:MOVR1,#0AHLOOP2:MOVA,FZHIMOVB,#0AHDIVABMOVSWEI,AMOVGWEI,BMOVDPTR,#LEDMAPMOVA,SWEIMOVCA,@A+DPTRMOVP1,ASETBP3.0
- 曾富貌 单片机
- STM32 UCOS SDIO FATFS
- 我在STM32红牛开发板上运行了sdio+fatfs读取文件名成功显示然后把它移植到ucos上结果就死在读取文件名的函数里TestStatusReadSDFile(void){FILINFOfinfo;DIRdirs;inti_name=0;charpath={\"\"};disk_initialize(0);f_mount(0,&fs);res=f_opendir(&dirs,path);if(res==FR_OK)
- hua19900322 stm32/stm8
设计资源 培训 开发板 精华推荐
- 睿瀚医疗万斌:“脑机接口+AI+机器人”是康复赛道的未来
- 希润医疗孟铭强:手功能软体机器人,让脑卒中患者重获新生
- 柔灵科技陈涵:将小型、柔性的脑机接口睡眠设备,做到千家万户
- 微灵医疗李骁健:脑机接口技术正在开启意识与AI融合的新纪元
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- 景昱医疗耿东:脑机接口DBS治疗技术已实现国产替代
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度