STM32入门:STM32F103VET6通过DHT11温湿度传感器获取室内温度实验(附主要源代码)

STM32F103ZET6通过DHT11温湿度传感器获取室内温度实验

实验环境:正点原子 STM32F103ZET6 小型系统板
实验工具:STM32F103ZET6 芯片与 DHT11 温湿度传感器
数据交互:STM32 芯片通过 GPIO 输入输出引脚获取 DHT11 温湿度传感器的数据,然后通过串口 USART1 将数据提交至 PC 端的串口调试助手。
实验源码下载:stm32f103_dht11.zip
实验结果:STM32入门:STM32F103VET6通过DHT11温湿度传感器获取室内温度实验(附主要源代码)_第1张图片
以下为部分实验源码:

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;
}

学习分享,一起成长!以上为小编的实验分享,若存在不当之处,请批评指正!

你可能感兴趣的:(STM32学习,stm32,dht11)