合泰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温湿度显示】相关推荐

  1. 基于SPI的OLED温湿度显示

    本文首先会简单介绍SPI通信协议,然后后面的实验分为两个板块,一个是OLED屏的使用,另一个是在此基础上,结合上次实验(结尾会附上链接),用OLED屏显示温湿度信息. 实验器材:STM32F103C8 ...

  2. lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度

    OLED模块介绍 OLED显示屏是指有机电激发光二极管(Organic Light-Emitting Diode,OLED),具备自发光,所以不需背光源,对比度高,厚度薄,视角广,反应速度快等特性,被 ...

  3. STM32分别实现温湿度的采集和OLED显示屏显示数据

    目录 一.温湿度的采集 1.1了解I2C总线协议 1.2实现AHT20采集程序 二.OLED显示屏显示数据 2.1了解SPI 2.2使用OLED显示 2.2.1实验题目: 2.2.2实验过程 三.总结 ...

  4. STM32小项目之dht11在oled上显示温湿度

    前言: 实现一个简单的功能,最终多个功能合起来,就是一个大项目,也叫模块化编程:本篇文章不在讲述oled的用法和代码,因为代码太多了,粘不过来,需要的可以去看我另一篇文章专门讲解oled的. 本文牵扯 ...

  5. 第八章 STM32+SGP气体传感器+DHT11温湿度传感器+OLED模块显示室内温湿度、二氧化碳和甲醛浓度

    在智能家居相关的物联网毕设中,少不了室内气体检测功能,比如检测烟雾,检测一氧化碳,检测甲醛等有害气体浓度,别人有的,我们也要有!所以本章给大家介绍一款气体传感器--SGP气体传感器,这款气体传感器能够 ...

  6. 用STM32F103达成基于I2C协议的AHT20温湿度传感器和OLED屏显示汉字

    目录 一 I2C协议简介 硬件I2C与软件I2C 二 代码和ATH20芯片实现温湿度的串口显示 三 用stm32f103芯片的SPI和IIC接口接上OLED屏显示中文姓名温湿度 1 先用文字字模生成器 ...

  7. 基于STM32的0.96寸OLED显示屏显示固定数据、滑动数据、温湿度数据

    目录 OLED显示原理 一.实验工具 二.OLED显示固定数据 1.显示数据相关函数 2.main函数 3.总显示函数 4.取字模 5.实现效果如下: 三.OLED实现滑动显示数据 1.添加滑动命令 ...

  8. STM32的0.96寸OLED显示屏显示数据

    目录 一.SPI 1.简介 2.工作模式 3.通讯引脚 二.用0.96OLED显示数据 1.OLED原理简介 三.OLED显示实验 (1).实验目的 (2).实验实现 1.显示学号和姓名 2.显示AH ...

  9. 51单片机 DHT11+LCD12864温湿度显示 + Proteus仿真

    51单片机 DHT11+LCD12864温湿度显示 + Proteus仿真 采用的接线方式是IIC接口,在Proteus里面仿真太慢了,不知道是电脑古老问题还是怎么,看图像就知道了,有多卡,感觉电脑运 ...

最新文章

  1. javascript 事件对象
  2. 今天上班的乐趣是......
  3. LINUX设置固定IP上网方法
  4. zabbix mysql设置中文乱码_解决zabbix监控因php问题导致图形界面中文乱码方法
  5. 神经网络加载数据 自建数据集 官方数据集 pytorch 显示数据集
  6. redis核心技术与实战(四)高可用高扩展篇
  7. mysql使用between..and 查询日期范围注意事项
  8. 佛山高新区构建大数据产业新生态
  9. 盈利模型的内容都有哪些?
  10. 苹果紧急修复远程漏洞,影响数十亿设备
  11. Binwalk 后门(固件)分析利器
  12. socket 异常类型
  13. MP4Box切割mp4视频文件
  14. 实验中常用光纤接头型号
  15. 计算机显卡驱动全部卸载,显卡驱动如何卸载重装?NVIDIA独立显卡驱动卸载重装的方法...
  16. win10自带计算机应用恢复,win10重置电脑后怎么恢复应用_win10重置后恢复软件的方法...
  17. 在html中进行表单设计,谈谈网页中的表单设计
  18. 飞桨《百度构架师手把手教深度学习》结营体验
  19. realsense moveit生成octomap错误:‘Client [/move_group] wants topic /camera/color/image_raw to have dataty
  20. sass、vue(v-model、v-text、v-html、v-for、v-if、v-show、v-on、修饰符)

热门文章

  1. 47: 监控概述 、 Zabbix基础 、 Zabbix监控服 、 总结和答疑
  2. oracle触发器输出信息,插入后oracle触发器打印
  3. 2016年 第二届美亚杯全国电子数据取证大赛个人赛write up
  4. 综合布线工程测试技术
  5. 在 LCD 上显示 jpeg 图像
  6. Betaflight连接飞控相关问题
  7. 提取u-boot fw_env环境变量生成工具
  8. rhel5-rhel6安装oracle11g
  9. Cisco实验-VTP基本使用
  10. 【CSS】单边阴影、双边阴影、三边阴影