【合泰HT32F52352+oled温湿度显示】
合泰HT32F52352+oled温湿度显示
实验效果图
本实验中oled和dht11的代码是移值之前stm32中的大部分都是一样 只是在进行引脚初始化和相关时钟初始化有点区别
oled.h
#ifndef __OLED_H
#define __OLED_H
#include "ht32f5xxxx_gpio.h"
#include "stdlib.h" #define OLED_MODE 0
#define SIZE 8
#define XLevelL 0x00
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
//-----------------OLED IIC端口定义---------------- /*************进行代码移值头文件只修改了下面这几条语句*************/
#define GPIO_PIN_SDA GPIO_PIN_11
#define GPIO_PIN_SCL GPIO_PIN_12
#define OLED_SCLK_Clr() GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_SCL,RESET)//CLK拉低
#define OLED_SCLK_Set() GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_SCL,SET)//拉高
#define OLED_SDIN_Clr() GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_SDA,RESET)//DIN
#define OLED_SDIN_Set() GPIO_WriteOutBits(HT_GPIOC, GPIO_PIN_SDA,SET)
/*************************************************/#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据#define IIC_SLAVE_ADDR 0x78 //IIC slave device address//OLED控制用函数
void OLED_WR_Byte(unsigned dat,unsigned cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Init(void);
void OLED_Clear(unsigned dat);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(u8 x,u8 y,u8 no);
void OLED_ShowCHinese_TWO(u8 x,u8 y,u8 no);
void OLED_ShowCHinese_Three(u8 x,u8 y,u8 no);
void OLED_P8x16String(u8 x,u8 y,u8 ch[]);
void OLED_ShowCHinese_six(u8 x,u8 y,u8 no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
void Delay_50ms(unsigned int Del_50ms);
void Delay_1ms(unsigned int Del_1ms);
void fill_picture(unsigned char fill_Data);
void Picture(void);
void IIC_Start(void);
void IIC_Stop(void);
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
void IIC_Wait_Ack(void);
#endif
dht11.h
#ifndef _DHT11_H_
#define _DHT11_H_#include "ht32.h"
#include "delay.h"
#include "ht32_board.h"
#include "ht32_board_config.h"//定义与DHT11通信使用的引脚
#define dou_dht11_GPIOx GPIO_PA
#define dou_dht11_HT_GPIOx HT_GPIOA
#define dou_dht11_GPIO_PIN GPIO_PIN_0// dou_dht11 API **************************************************************
//数据定义:
extern uint8_t T_H; //温度高8位
extern uint8_t T_L; //温度低8位
extern uint8_t H_H; //湿度高8位
extern uint8_t H_L; //湿度低8位void dou_dht11_init(void); //初始化函数
void dou_dht11_get_data(void); //更新数据函数
//void dou_dht11_test(void); //测试函数(死循环)
#endif
dht11.c
#include "dht11.h"
#include "adc.h"uint8_t T_H,T_L,H_H,H_L; //分别为温度和湿度的高8位 低八位
uint8_t temp_H,temp_L,humi_H,humi_L,checkdata;//设置通信引脚为输出
static void dou_dht11_pinset_out(void)
{GPIO_DirectionConfig(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN, GPIO_DIR_OUT); //设置方向为输出GPIO_OpenDrainConfig(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN, DISABLE); //输出模式设置为推挽输出//GPIO_DriveConfig(dou_dht11_HT_GPIOx,dou_dht11_GPIO_PIN,GPIO_DIR_OUT,GPIO_DV_16MA); //设置输出驱动电流能力
}//设置通信引脚为输入
static void dou_dht11_pinset_in(void)
{GPIO_DirectionConfig(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN, GPIO_DIR_IN); //设置方向为输入//GPIO_PullResistorConfig(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN, GPIO_PR_DISABLE); //除能上下拉电阻GPIO_PullResistorConfig(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN, GPIO_PR_UP);GPIO_InputConfig(dou_dht11_HT_GPIOx,dou_dht11_GPIO_PIN,ENABLE);
}//初始化函数
void dou_dht11_init(void)
{CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};if (dou_dht11_GPIOx == GPIO_PA){CKCUClock.Bit.PA = 1;}else if (dou_dht11_GPIOx == GPIO_PB){CKCUClock.Bit.PB = 1;}else if (dou_dht11_GPIOx == GPIO_PC){CKCUClock.Bit.PC = 1;}else if (dou_dht11_GPIOx == GPIO_PD){CKCUClock.Bit.PD = 1;}CKCUClock.Bit.AFIO = 1;CKCU_PeripClockConfig(CKCUClock, ENABLE);AFIO_GPxConfig(dou_dht11_GPIOx, dou_dht11_GPIO_PIN, AFIO_MODE_1); //配置引脚工作模式dou_dht11_pinset_out();GPIO_WriteOutBits(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN, SET);
}//获取引脚状态
bool dou_dht11_get_databit(void)
{if (GPIO_ReadInBit(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN) != RESET){return TRUE;}else{return FALSE;}
}//设置引脚输出
void dou_dht11_set_databit(bool level)
{if (level != FALSE){GPIO_WriteOutBits(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN, SET);}else{GPIO_WriteOutBits(dou_dht11_HT_GPIOx, dou_dht11_GPIO_PIN, RESET);}
}//读取一字节数据
static uint8_t dou_dht11_read_byte(void)
{uint8_t i;uint8_t data = 0;for (i = 0; i < 8; i++){data <<= 1;while ((!dou_dht11_get_databit()));delay_us(30);if (dou_dht11_get_databit()){data |= 0x1;while(dou_dht11_get_databit());}else{}}return data;
}static bool dou_dht11_start_sampling(void)
{dou_dht11_pinset_out();//主机拉低18ms? ?dou_dht11_set_databit(FALSE);delay_ms(18);dou_dht11_set_databit(TRUE);//总线由上拉电阻拉高 主机延时10usdelay_us(20);//主机设为输入 判断从机响应信号 dou_dht11_pinset_in();//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行?? ? ?if (dou_dht11_get_databit() == FALSE) //T !?? ? ?{//判断从机是否发出 80us 的低电平响应信号是否结束?? ? while (dou_dht11_get_databit() == FALSE);//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态while (dou_dht11_get_databit() != FALSE);return TRUE;}return FALSE;
}void dou_dht11_get_data(void)
{uint8_t temp;if (dou_dht11_start_sampling()){//printf("DHT11 is ready to transmit data\r\n");//数据接收状态 humi_H = dou_dht11_read_byte(); //接收湿度高八位humi_L = dou_dht11_read_byte(); //接收湿度低八位temp_H = dou_dht11_read_byte();//接收温度高八位temp_L = dou_dht11_read_byte();//接收温度低八位checkdata = dou_dht11_read_byte(); //接收效验位/* Data transmission finishes, pull the bus high */dou_dht11_pinset_out();dou_dht11_set_databit(TRUE);//数据校验 temp = (temp_H + temp_L + humi_H + humi_L);if (temp == checkdata){H_H = humi_H; // 湿度整数部分H_L = humi_L; //湿度小数部分T_H = temp_H; //温度整数部分T_L = temp_L; //温度小数部分}} }
main.c
#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "uart.h"
#include "dht11.h"
#include "oled.h"/**********************TH32 oled显示温湿度**********************
Author:小殷Date:2022-4-22
******************************************************/
uint8_t data = 0;
uint8_t sendbuf[128] = {0};int main()
{Led_Init();USARTx_Init();OLED_Init();Usart_SendStr(HT_USART1,(uint8_t *)"------HT32 oled TEST-------\r\n");//循环发送字符串,测试用OLED_Clear(0);OLED_ShowString(20,1,"ht32 oled",8);OLED_ShowString(20,3,(unsigned char *)"C_T:",3); // Current_Temperature 当前温度OLED_ShowCHinese_Three(80,3,11); //COLED_ShowString(20,5,(unsigned char *)"C_H:",3); // Current_Humidity 当前湿度OLED_ShowCHinese_Three(80,5,13); //.while(1){// dou_dht11_get_data();//获取温度数据
// sprintf((char *)sendbuf,"当前温度:%2d 当前湿度:%2d\n",dou_dht11_temperature_data_h ,dou_dht11_humidity_data_h);
// Usart_SendStr(HT_USART1,sendbuf);
// delay_ms(500);dou_dht11_get_data();//获取温度数据 OLED_ShowNum(50,3,T_H/10,3,3);OLED_ShowNum(60,3,T_L%10,3,3);OLED_ShowNum(50,5,H_H/10,3,3);OLED_ShowNum(60,5,H_L%10,3,3); }
}
工程链接需要自取https://github.com/FDForerver/HT32F52352.git
【合泰HT32F52352+oled温湿度显示】相关推荐
- 基于SPI的OLED温湿度显示
本文首先会简单介绍SPI通信协议,然后后面的实验分为两个板块,一个是OLED屏的使用,另一个是在此基础上,结合上次实验(结尾会附上链接),用OLED屏显示温湿度信息. 实验器材:STM32F103C8 ...
- lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度
OLED模块介绍 OLED显示屏是指有机电激发光二极管(Organic Light-Emitting Diode,OLED),具备自发光,所以不需背光源,对比度高,厚度薄,视角广,反应速度快等特性,被 ...
- STM32分别实现温湿度的采集和OLED显示屏显示数据
目录 一.温湿度的采集 1.1了解I2C总线协议 1.2实现AHT20采集程序 二.OLED显示屏显示数据 2.1了解SPI 2.2使用OLED显示 2.2.1实验题目: 2.2.2实验过程 三.总结 ...
- STM32小项目之dht11在oled上显示温湿度
前言: 实现一个简单的功能,最终多个功能合起来,就是一个大项目,也叫模块化编程:本篇文章不在讲述oled的用法和代码,因为代码太多了,粘不过来,需要的可以去看我另一篇文章专门讲解oled的. 本文牵扯 ...
- 第八章 STM32+SGP气体传感器+DHT11温湿度传感器+OLED模块显示室内温湿度、二氧化碳和甲醛浓度
在智能家居相关的物联网毕设中,少不了室内气体检测功能,比如检测烟雾,检测一氧化碳,检测甲醛等有害气体浓度,别人有的,我们也要有!所以本章给大家介绍一款气体传感器--SGP气体传感器,这款气体传感器能够 ...
- 用STM32F103达成基于I2C协议的AHT20温湿度传感器和OLED屏显示汉字
目录 一 I2C协议简介 硬件I2C与软件I2C 二 代码和ATH20芯片实现温湿度的串口显示 三 用stm32f103芯片的SPI和IIC接口接上OLED屏显示中文姓名温湿度 1 先用文字字模生成器 ...
- 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据
目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...
- STM32的0.96寸OLED显示屏显示数据
目录 一.SPI 1.简介 2.工作模式 3.通讯引脚 二.用0.96OLED显示数据 1.OLED原理简介 三.OLED显示实验 (1).实验目的 (2).实验实现 1.显示学号和姓名 2.显示AH ...
- 51单片机 DHT11+LCD12864温湿度显示 + Proteus仿真
51单片机 DHT11+LCD12864温湿度显示 + Proteus仿真 采用的接线方式是IIC接口,在Proteus里面仿真太慢了,不知道是电脑古老问题还是怎么,看图像就知道了,有多卡,感觉电脑运 ...
最新文章
- javascript 事件对象
- 今天上班的乐趣是......
- LINUX设置固定IP上网方法
- zabbix mysql设置中文乱码_解决zabbix监控因php问题导致图形界面中文乱码方法
- 神经网络加载数据 自建数据集 官方数据集 pytorch 显示数据集
- redis核心技术与实战(四)高可用高扩展篇
- mysql使用between..and 查询日期范围注意事项
- 佛山高新区构建大数据产业新生态
- 盈利模型的内容都有哪些?
- 苹果紧急修复远程漏洞,影响数十亿设备
- Binwalk 后门(固件)分析利器
- socket 异常类型
- MP4Box切割mp4视频文件
- 实验中常用光纤接头型号
- 计算机显卡驱动全部卸载,显卡驱动如何卸载重装?NVIDIA独立显卡驱动卸载重装的方法...
- win10自带计算机应用恢复,win10重置电脑后怎么恢复应用_win10重置后恢复软件的方法...
- 在html中进行表单设计,谈谈网页中的表单设计
- 飞桨《百度构架师手把手教深度学习》结营体验
- realsense moveit生成octomap错误:‘Client [/move_group] wants topic /camera/color/image_raw to have dataty
- sass、vue(v-model、v-text、v-html、v-for、v-if、v-show、v-on、修饰符)