STM32F103ZET6通过DHT11温湿度传感器获取室内温度实验
实验环境:正点原子 STM32F103ZET6 小型系统板
实验工具:STM32F103ZET6 芯片与 DHT11 温湿度传感器
数据交互:STM32 芯片通过 GPIO 输入输出引脚获取 DHT11 温湿度传感器的数据,然后通过串口 USART1 将数据提交至 PC 端的串口调试助手。
实验源码下载:stm32f103_dht11.zip 实验结果:
以下为部分实验源码:
dht11.c
#include "dht11.h"
u8 DHT11_DATA[40];
extern GPIO_InitTypeDef GPIO_Initure;
void DHT11_Init() { //初始化外设 DHT11
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_Initure.GPIO_Pin = GPIO_Pin_4; //PA4
GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOA, &GPIO_Initure);
DHT_DATA_OUT = 1;//数据线保持高电平
}
u8 DHT11_Start() { //开始向 DHT11 发送请求信号
u8 time = 0;
DHT_DATA_OUT = 1; //数据线保持高电平
delay_ms(1000); //DHT11 上电后要等待 1s 以越过不稳定状态在此期间不能发送任何指令
DHT_DATA_OUT = 0; //主机输入低电平,发起数据请求
delay_ms(20); //保持 20ms
DHT_DATA_OUT = 1; //主机输入高电平,释放总线
while(DHT_DATA_IN);//等待低电平响应信号
while(!DHT_DATA_IN) { //等待低电平响应信号结束,time 值约 40us
delay_us(1);
time ++;
}
if(time < 1 || time > 100) { //判断是否存在响应与响应是否超时
return 0;
}
while(DHT_DATA_IN) { //等待高电平响应间隔信号结束,time 值约 40 - 41us
delay_us(1);
}
return 1;
}
void DHT11_ReadData() { //读取 DHT11 传递来的上一次温湿度数据
u8 time, i = 0;
for(; i < 40; i ++) {
time = 0; //将时长置 0,防止它对二次及以上的时长产生影响
while(!DHT_DATA_IN); //略过低电平间隔信号
while(DHT_DATA_IN) { //等待高电平结束,根据时长获取有效数据
delay_us(1);
time ++;
}
DHT11_DATA[i] = time > 25 ? 1 : 0; //根据高电平时长判断数据位为 0 还是为 1
}
}
void DHT11_End(void) { //等待 DHT11 数据传递的结束
while(!DHT_DATA_IN); //等待低电平信号变高,数据发送完成
delay_us(56); //等待 DHT11 温湿度传感器释放总线
}
dht DHT11_CheckData(u8 *data) {
u8 temp[5] = { 0x00 }, i, j;
dht dht_data;
for(i = 0; i < 5; i ++) { //将二进制数组转换为 8 位数据
for(j = 0; j < 8; j ++) {
temp[i] <<= 1;
temp[i] = data[j + i * 8] == 0 ? temp[i] : temp[i] + 1;
}
}
if((temp[0] + temp[1] + temp[2] + temp[3]) % 256 == temp[4]){ //数据校验,temp[3]) % 256 略过最高位,因为第四个数据的最高位是 1 的时候,温度值为负,由于条件原因,未能测试零下温度,如果存在错误,请干掉取余操作
//获取湿度数据
dht_data.humidity = temp[0];//湿度小数部分为0,即data[1] = 0,故小数位可忽略不计
//获取温度数据
dht_data.tempurature = 1;
if((0x80 & temp[3]) != 0){ //温度低8位的最高位为 1,数据值为负
dht_data.tempurature *= -1;
temp[3] &= 0x7f; //重新计算data[3]的值
}
dht_data.tempurature *= ((double)temp[2] + temp[3] * 0.1);
}
else{
dht_data.humidity = dht_data.tempurature = -1;
}
return dht_data;
}
学习分享,一起成长!以上为小编的实验分享,若存在不当之处,请批评指正!