DHT11仿真(proteus8.15)代码,纯享版(好移植)

仿真软件:proteus8.15(特地强调一下,因为这个仿真软件感觉有点版本Bug)

仿真效果如下

仿真效果

DHT11驱动代码

DHT11.h

#ifndef __DHT11_H
#define __DHT11_H

//修改下面三个参数来进行引脚的修改(更加方便进行移植)
#define DHT11_PIN              GPIO_Pin_7
#define DHT11_RCC              RCC_APB2Periph_GPIOB
#define DHT11_GPIO_PORT        GPIOB

#define DHT11_LOGIC_HIGH       1
#define DHT11_LOGIC_LOW        0

#define DHT11_DATA_OUTPUT(a)  if (a) \
                                GPIO_SetBits(DHT11_GPIO_PORT, DHT11_PIN);\
                                else \
                                GPIO_ResetBits(DHT11_GPIO_PORT, DHT11_PIN)

#define DHT11_DATA_INPUT()     GPIO_ReadInputDataBit(DHT11_GPIO_PORT, DHT11_PIN)

typedef struct
{
    uint8_t humidity_integer;    //湿度的整数部分
    uint8_t humidity_decimal;    //湿度的小数部分
    uint8_t temperature_integer; //温度的整数部分
    uint8_t temperature_decimal; //温度的小数部分
    uint8_t checksum;            
} DHT11_Sensor_Data_TypeDef;

void DHT11_Sensor_GPIO_Configuration(void);
static void DHT11_Sensor_SetInputPullUpMode(void);
static void DHT11_Sensor_SetOutputPushPullMode(void);
uint8_t DHT11_ReadSensorData(DHT11_Sensor_Data_TypeDef *sensorData);
static uint8_t DHT11_ReadDataByte(void);

#endif

DHT11.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "DHT11.h"

void DHT11_Sensor_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE); 
    GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);

    GPIO_SetBits(DHT11_GPIO_PORT, DHT11_PIN);
}

static void DHT11_Sensor_SetInputPullUpMode(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
}

static void DHT11_Sensor_SetOutputPushPullMode(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = DHT11_PIN;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
}

static uint8_t DHT11_ReadDataByte(void)
{
    uint8_t i, temp = 0;

    for (i = 0; i < 8; i++)
    {
        while (DHT11_DATA_INPUT() == Bit_RESET);

        Delay_us(40);

        if (DHT11_DATA_INPUT() == Bit_SET)
        {
            while (DHT11_DATA_INPUT() == Bit_SET);

            temp |= (uint8_t)(0x01 << (7 - i));
        }
        else
        {
            temp &= (uint8_t) ~(0x01 << (7 - i));
        }
    }
    return temp;
}

uint8_t DHT11_ReadSensorData(DHT11_Sensor_Data_TypeDef *sensorData)
{
    DHT11_Sensor_SetOutputPushPullMode();
    DHT11_DATA_OUTPUT(DHT11_LOGIC_LOW);
    Delay_ms(18);

    DHT11_DATA_OUTPUT(DHT11_LOGIC_HIGH);

    Delay_us(30);

    DHT11_Sensor_SetInputPullUpMode();

    if (DHT11_DATA_INPUT() == Bit_RESET)
    {
        while (DHT11_DATA_INPUT() == Bit_RESET);

        while (DHT11_DATA_INPUT() == Bit_SET);

        sensorData->humidity_integer = DHT11_ReadDataByte();
        sensorData->humidity_decimal = DHT11_ReadDataByte();
        sensorData->temperature_integer = DHT11_ReadDataByte();
        sensorData->temperature_decimal = DHT11_ReadDataByte();
        sensorData->checksum = DHT11_ReadDataByte();

        DHT11_Sensor_SetOutputPushPullMode();
        DHT11_DATA_OUTPUT(DHT11_LOGIC_HIGH);

        if (sensorData->checksum == sensorData->humidity_integer + sensorData->humidity_decimal + sensorData->temperature_integer + sensorData->temperature_decimal)
            return SUCCESS;
        else
            return ERROR;
    }
    else
    {
        return ERROR;
    }
}

	 

main.c

给出main.c函数进行运行的参考,单独移植DHT11代码的话,就只用参考与其相关的代码即可

#include "stm32f10x.h"
#include  "OLED.h"  //OLED显示屏 
#include "PWM.h"    //PWM输出
#include "motor.h"  //直流电机
#include "Delay.h"
#include "DHT11.h"
#include "stdio.h"
			  
char dis1[16];	
DHT11_Sensor_Data_TypeDef DHT11_Data;

int8_t Speed = 0;

int main(void)
{ 
	uint8_t tem1;
	uint8_t hum1;
	OLED_Init();
	Motor_Init();
	DHT11_Sensor_GPIO_Configuration();
	
	OLED_ShowString(1, 1, "Speed:");
	OLED_ShowString(2, 1, "temp:");
	OLED_ShowString(3, 1, "humidity:");
	while(1){ 
		Motor_SetSpeed(Speed);
		OLED_ShowSignedNum(1, 7, Speed, 3);
		if(DHT11_ReadSensorData(&DHT11_Data) == SUCCESS)
		{
			OLED_ShowNum(2, 10, DHT11_Data.humidity_integer, 2);
			OLED_ShowString(2, 12, ".");
			OLED_ShowNum(2, 13, DHT11_Data.humidity_decimal, 2);
			
			OLED_ShowNum(3, 10, DHT11_Data.temperature_integer, 2);
			OLED_ShowString(3, 12, ".");
			OLED_ShowNum(3, 13, DHT11_Data.temperature_decimal, 1);
			
		}
		
		if((DHT11_Data.temperature_integer>30)&&(DHT11_Data.temperature_integer<35))
		{
			Speed=25;
		}else if((DHT11_Data.temperature_integer>=35)&&(DHT11_Data.temperature_integer<40))
		{
			Speed=50;
		}
		else if((DHT11_Data.temperature_integer>40)&&(DHT11_Data.temperature_integer<50))
		{
			Speed=100;
		}else if(DHT11_Data.temperature_integer<=30)
		{
			Speed=0;
		}
		 }
}

后续将对传感器专栏进行更新,致力于打造优质的传感器移植专栏,使传感器驱动更为便捷。

觉得不错的话,希望能够一键三连,多多关注!!!
 

### STM32F103C8T6与DHT11Proteus中的仿真 #### 一、硬件连接说明 为了实现STM32F103C8T6单片机DHT11温湿度传感器之间的通信,在Proteus中需按照如下方式进行元件间的连线: - 将DHT11的数据线(通常标记为OUT或DATA)连接到STM32的任意GPIO引脚上,这里假设选择PA0作为数据传输端口; - VCC和GND分别接到电源正负极即可完成基本电气连接[^1]。 ```plaintext +-----------+ +--------+ | | VCC ---| | | DHT11 | GND ---| | | | DATA---| PA0 | +-----------+ +--------+ STM32F103C8T6 ``` #### 二、软件配置指南 ##### (一)库函数初始化设置 对于使用HAL库的情况来说,需要先打开RCC时钟使能并配置对应IO口模式为输入浮空状态以便读取来自DHT11的状态信号;同时还需要定义全局变量用于存储获取到得温度值以及湿度值。 ```c // 开启APB2外设时钟, GPIOA __HAL_RCC_GPIOA_CLK_ENABLE(); // 初始化结构体 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 设置PA0为输入模式 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; // 浮空输入 HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); ``` ##### (二)驱动程序编写要点 针对DHT11这种类型的数字式温湿度传感设备而言,其工作原理较为特殊——主机发送起始条件后等待从机响应再接收有效位流。因此编程时要注意遵循这一流程来正确解析返回的信息包内容。 下面给出一段简单的测试代码片段用来验证两者间能否正常通讯交互: ```c #include "stm32f1xx_hal.h" uint8_t dht11_read_data(void){ uint8_t i,j,buf[5]; HAL_Delay(20); // 延迟一段时间稳定电压 /* Start signal */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, RESET); HAL_Delay(20); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, SET); while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==SET){};// wait for response low level start bit if((HAL_GetTick()-start)>10)return ERROR; for(i=0;i<5;i++){ buf[i]=0; for(j=0;j<8;j++){ while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0));//wait high delay_us(40);//delay a little time if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))buf[i]|=(1<<(7-j)); while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)); //wait until pin is LOW again. } } if(buf[4]==((buf[0]+buf[1]+buf[2]+buf[3])&0xFF)){ printf("Humidity=%d.%d\r\n",buf[0],buf[1]); printf("Temperature=%d.%d\r\n",buf[2],buf[3]); }else{ printf("Data Check Error!\r\n"); } return OK; } int main(){ ... dht11_read_data(); ... } ``` 上述代码实现了对DHT11传感器的基本操作,包括启动测量过程、处理应答脉冲序列以及校验最终收到的数据帧完整性等功能模块[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值