STM32F103C8T6最小核心板+DHT11显示在0.96寸OLED的简单项目及代码分享

文章讲述了作者在使用STM32F103C8T6核心板、DHT11温湿度传感器和0.96寸OLED显示模块时遇到的问题,包括供电问题、单片机输出电压不稳导致的显示异常,以及GPIO配置注意事项。作者分享了主函数和DHT11传感器的代码示例,并提供了资源链接。
摘要由CSDN通过智能技术生成

1,本期使用的硬件有如下三个

STM32F103C8T6最小核心板,也就是哔哩哔哩up主江协科技用的那一款

DHT11温湿度传感器三针脚版本

0.96寸OLED四针脚版本

2,本期硬件的注意事项及发现的问题

STM32F103C8T6:最小核心板有很多拆机片,买来之后建议先用mico usb进行供电,然后用万用表测试一下5v 和3.3v输出,博主在第一次实验时OLED和DHT11经常出现乱码,甚至闪烁,后来才发现是单片机3.3v输出仅仅是2.2v,甚至继电器都没办法正常吸合了,百度查下居然是单片机的问题,这一点我是真的无语了,立马找商家退货了。

0.96寸OLED:这个也是有很多不同的版本的一定注意正负极,而且在.c的代码修改上一定要看看GPIO的参数,代码上总共有四个地方需要改,才能成功修改单片机和显示屏的连线。

3,代码部分

main.c主函数部分

有一些代码被注释掉了,大家看注释应该能看懂的,

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "jdq.h"
#include "stm32f10x.h"  // Device header
#include	"oled.h"
#include "OLED.h"
#include "DHT11.h"
#include "key.h"
/*
工作日志
======================================、
目前这个版本OLED可以正常显示,继电器也可以正常工作,修改代码之前一定不要修改其他的数据
DHT11

//			OLED_ShowNum(1,1,2,1);       //显示屏测试
//			JDQ1_on();
//			LED1_ON();
//			Delay_ms(2000);
//			JDQ2_off();
//			LED1_OFF();
//			Delay_ms(2000);

//			OLED_ShowString(1, 8, ".");
//			OLED_ShowNum(1, 9, DHT11_Data.temp_deci, 1);

//			OLED_ShowString(2, 12, ".");
//			OLED_ShowNum(2, 13, DHT11_Data.humi_deci, 2);  


四个按键分别连接在P9 -8 -7 6 -5    分别对应四个按键
key1-PB8
key2-PB7
key3-PB6
key4-PB5
目前PB9也是空闲的
LED连接的PB9
*/

 int main(void)
 {	
	 //延时函数初始化	  
	LED_Init();		  	//初始化与LED连接的硬件接口
 	JDQ_init();
	OLED_Init();
	Key_Init();
	 
	OLED_Init();									//显示器初始化
	DHT11_GPIO_Config();							//传感器gpioa
	OLED_ShowChinese(1,1,"温度");       			//第七个是空空白
	OLED_ShowChinese(2,1,"湿度");
//	OLED_ShowString(1,7,"℃");
//	OLED_ShowString(2,7,"%");符号没法正常显示

    OLED_ShowString(1,9,"|");
	OLED_ShowString(2,9,"|");
	OLED_ShowString(1,7,".");
	OLED_ShowString(2,7,".");



	 
	while(1)
	{
            OLED_ShowNum(1, 5, DHT11_Data.temp_int, 2);    		 		//温度
			OLED_ShowNum(1, 8, DHT11_Data.temp_deci, 1);    			//目前并不需要温度的小数部分,第六个是一个小数点
			OLED_ShowNum(1, 12, temphingt, 2);     						 //温度阈值
			OLED_ShowNum(2, 12, humihingt, 2);							 //	湿度阈值	
			OLED_ShowNum(2, 5, DHT11_Data.humi_int, 2);					 //	湿度	
			OLED_ShowNum(2, 8, DHT11_Data.humi_deci, 1);	
			Delay_ms(100);                       

				
           
		}
	}
 

DHT11温湿度传感器.c文件

在这个库函数中修改端口需要在.h中改

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

//#define DHT11_Out_Pin		GPIO_Pin_8
//#define DHT11_Out_RCC		RCC_APB2Periph_GPIOA
//#define DHT11		GPIOA

void DHT11_GPIO_Config(void)
{		
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(DHT11_Out_RCC, ENABLE); 
  	GPIO_InitStructure.GPIO_Pin = DHT11_Out_Pin;	
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  	GPIO_Init(DHT11, &GPIO_InitStructure);		  

	GPIO_SetBits(DHT11, DHT11_Out_Pin);	 
}

static void DHT11_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;
	  GPIO_InitStructure.GPIO_Pin = DHT11_Out_Pin;
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; 
	  GPIO_Init(DHT11, &GPIO_InitStructure);	 
}

static void DHT11_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;

  	GPIO_InitStructure.GPIO_Pin = DHT11_Out_Pin;	

  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  	GPIO_Init(DHT11, &GPIO_InitStructure);	 	 
}

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

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

		Delay_us(40);    	  

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

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

uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
{  
	DHT11_Mode_Out_PP();
	DHT11_DATA_OUT(LOW);
	Delay_ms(18);

	DHT11_DATA_OUT(HIGH); 

	Delay_us(30);  

	DHT11_Mode_IPU();

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

		while(DHT11_DATA_IN() == Bit_SET);

		DHT11_Data -> humi_int = Read_Byte();

		DHT11_Data -> humi_deci = Read_Byte();

		DHT11_Data -> temp_int = Read_Byte();

		DHT11_Data -> temp_deci = Read_Byte();

		DHT11_Data -> check_sum= Read_Byte();


		DHT11_Mode_Out_PP();
		DHT11_DATA_OUT(HIGH);

		if (DHT11_Data -> check_sum == DHT11_Data -> humi_int + DHT11_Data -> humi_deci + DHT11_Data -> temp_int + DHT11_Data -> temp_deci)
			return SUCCESS;
		else 
			return ERROR;
	}
	else
	{		
		return ERROR;
	}   
} 

DHT11的.h文件

可能对于初学者这个.h文件修改DHT11和核心板的连接口比较困难,不过没关系,大家可以直接复制这个代码发给CHAT -GPT

要将代码中的引脚修改为PA9,您需要进行以下更改:

  1. DHT11_Out_Pin宏定义更改为GPIO_Pin_9,即将GPIO引脚更改为PA9。
  2. DHT11_Out_RCC宏定义更改为RCC_APB2Periph_GPIOA,确保正确设置GPIOA外设时钟使能。
  3. DHT11宏定义更改为GPIOA,以便与所选的GPIO端口一致。

完成这些更改后,重新编译和上传代码,以确保代码正确使用了新的引脚PA9。请注意,在修改硬件连接之前,仔细检查电路图和硬件规格,确保将传感器正确连接到所需的GPIO引脚。

#ifndef _DHT11_H
#define __DHT11_H

#define DHT11_Out_Pin		GPIO_Pin_8                           //改这个数和下面这个GPIOA即可,两个都得改,可以测试测试
#define DHT11_Out_RCC		RCC_APB2Periph_GPIOA                
#define DHT11		GPIOA

#define HIGH  1
#define LOW   0

#define DHT11_DATA_OUT(a)	if (a)	\
					GPIO_SetBits(DHT11, DHT11_Out_Pin);\
					else		\
					GPIO_ResetBits(DHT11, DHT11_Out_Pin)
					
#define  DHT11_DATA_IN()	   GPIO_ReadInputDataBit(DHT11, DHT11_Out_Pin)

typedef struct
{
	uint8_t  humi_int;		//湿度的整数部分
	uint8_t  humi_deci;	 	//湿度的小数部分
	uint8_t  temp_int;	 	//温度的整数部分
	uint8_t  temp_deci;	 	//温度的小数部分
	uint8_t  check_sum;	 	//校验和
		                 
}DHT11_Data_TypeDef;

void DHT11_GPIO_Config(void);
static void DHT11_Mode_IPU(void);
static void DHT11_Mode_Out_PP(void);
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data);
static uint8_t Read_Byte(void);

#endif

后续的OLED显示函数我就不放了,大家可以直接在我分享的连接里面去下载。就是用的江科大的,汉字的取模我后续还会再发一下,大家也可以去别人博主那里找找看看。

鸣谢:OLED显示屏库函数的提供者江协科技(原名:江科大自动化协)我目前的课程也都是从他那里学习的,DHT11库函数也是从网络上找的,感谢,希望我今天分享的资源对大家有所帮助。

资源连接(永久有效):阿里云盘分享icon-default.png?t=N7T8https://www.aliyundrive.com/s/CLyerqN1etV

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值