IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32+UCOS温湿度显示 -> 正文阅读

[嵌入式]STM32+UCOS温湿度显示

STM32+UCOS温湿度显示

简介

使用UCOS管理OLED+DHT11温湿度任务 将DHT11读取到的温湿度在OLED上显示
OLED以及DHT11的头文件及源文件可参考之前的博文
DHT11模块:DHT11
OLED模块:OLED

main函数

#include "stm32f10x.h"
#include <stdio.h>
#include "includes.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "dht11.h"
#include "oled.h"


//初始创建任务控制块
OS_TCB Start_Task_TCB;
//任务优先级
#define START_TASK_PRIO		3
//任务函数
void Start_Task(void *parg);
//任务堆栈大小
#define START_STK_SIZE 	512
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];			//任务堆栈,大小为512字,也就是1024字节

//OLED任务控制块
OS_TCB OLED_Task_TCB;
//任务优先级
#define OLED_TASK_PRIO		7
//任务函数
void OLED_Task(void *parg);
//任务堆栈大小
#define OLED_STK_SIZE 	128
//任务堆栈
CPU_STK OLED_TASK_STK[OLED_STK_SIZE];			//任务堆栈,大小为512字,也就是512字节

//DHT11任务控制块
OS_TCB DHT11_Task_TCB;
//任务优先级
#define DHT11_TASK_PRIO		6
//任务函数
void DHT11_Task(void *parg);
//任务堆栈大小
#define DHT11_STK_SIZE 	128
//任务堆栈
CPU_STK DHT11_TASK_STK[DHT11_STK_SIZE];			//任务堆栈,大小为128字,也就是512字节


OS_MUTEX mutex_dht11;		//互斥锁对象
OS_MUTEX mutex_oled;		//互斥锁对象

int main(void)
{
	OS_ERR err;

	delay_init();       //延时初始化
	Usart_Init();    //串口波特率设置
	
	//OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
	OSInit(&err);
	
	//创建任务
	
	//创建开始任务
	OSTaskCreate((OS_TCB 	* )&Start_Task_TCB,		//任务控制块
				 (CPU_CHAR	* )"Start_Task", 		//任务名字
                 (OS_TASK_PTR )Start_Task, 			//任务函数
                 (void		* )0,					//传递给任务函数的参数
                 (OS_PRIO	  )START_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&START_TASK_STK[0],	//任务堆栈基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,	//任务堆栈深度限位
                 (CPU_STK_SIZE)START_STK_SIZE,		//任务堆栈大小
                 (OS_MSG_QTY  )0,					//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                 (OS_TICK	  )0,					//当使能时间片轮转时的时间片长度,为0时为默认长度,
                 (void   	* )0,					//用户补充的存储区
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
                 (OS_ERR 	* )&err	);				//存放该函数错误时的返回值
	
	//启动OS,进行任务调度
	OSStart(&err);
	
	//打印系统启动失败
	while(1)
	{
		printf("System Star Err!!!\r\n");
	}
	
}

//开始任务 函数
//用于初始化模块和启动初始功能
//无返回值
void Start_Task(void *parg)
{
	u8 re=0;
	OS_ERR err;	

	/* 对模块进行初始化 */
	
	//OLED初始化
	OLED_Init();	

	//温湿度初始化
	re=DHT11_Init();	
	
	if(re)
	{
		printf("DHT11 Init Err!\r\n");
	}else
	{
		printf("OLED DHT11 Init Success!!\r\n");
	}
		
	
	//创建dht11互斥锁
	OSMutexCreate ( &mutex_dht11,"mutex_dht11",&err);
	
	//创建oled互斥锁
	OSMutexCreate ( &mutex_oled,"mutex_oled",&err);
	
	
	/* 创建LED任务 */
	OSTaskCreate((OS_TCB 	* )&OLED_Task_TCB,		
				 (CPU_CHAR	* )"OLED_Task", 		
                 (OS_TASK_PTR )OLED_Task, 			
                 (void		* )0,					
                 (OS_PRIO	  )OLED_TASK_PRIO,     	
                 (CPU_STK   * )&OLED_TASK_STK[0],	
                 (CPU_STK_SIZE)OLED_STK_SIZE/10,	
                 (CPU_STK_SIZE)OLED_STK_SIZE,		
                 (OS_MSG_QTY  )0,					
                 (OS_TICK	  )0,					
                 (void   	* )0,				
                 (OS_OPT      )OS_OPT_TASK_NONE, 
                 (OS_ERR 	* )&err);	

	/* 创建DHT11任务 */
	OSTaskCreate((OS_TCB 	* )&DHT11_Task_TCB,		
				 (CPU_CHAR	* )"DHT11_Task", 		
                 (OS_TASK_PTR )DHT11_Task, 			
                 (void		* )0,					
                 (OS_PRIO	  )DHT11_TASK_PRIO,     	
                 (CPU_STK   * )&DHT11_TASK_STK[0],	
                 (CPU_STK_SIZE)DHT11_STK_SIZE/10,	
                 (CPU_STK_SIZE)DHT11_STK_SIZE,		
                 (OS_MSG_QTY  )0,					
                 (OS_TICK	  )0,					
                 (void   	* )0,				
                 (OS_OPT      )OS_OPT_TASK_NONE, 
                 (OS_ERR 	* )&err);	

	delay_ms(500);
				 
	OSTaskDel((OS_TCB*)0,&err);	//删除start_task任务自身
}

//OLED任务函数
//无返回值
void OLED_Task(void *parg)
{
	OS_ERR err;
	
	//定义CPU状态寄存器
	CPU_SR_ALLOC();
	
	while(1)
	{
		CPU_CRITICAL_ENTER();
		
		printf("OLED task run!\r\n");
	
		CPU_CRITICAL_EXIT(); 
		
		delay_ms(1000);
	}
}


//DHT11任务函数
//无返回值
void DHT11_Task(void *parg) 
{
	OS_ERR err;
	u8 humi=0;//湿度
	u8 temp=0;//温度
	u8 rt=0;
	
	
	while(1)
	{
		OSMutexPend(&mutex_dht11,0,OS_OPT_PEND_BLOCKING,NULL,&err);
		
		delay_ms(1000);
		rt = DHT11_Read_Data(&temp,&humi);
		printf("dht11 task run\r\n");
		if(!rt)
		{
			//oled显示温湿度
			OSMutexPend(&mutex_oled,0,OS_OPT_PEND_BLOCKING,NULL,&err);	//阻塞等待oled互斥锁
			
			OLED_ShowChinese(0,0,3,16,1);//温
			OLED_ShowChinese(16,0,4,16,1);//度
			OLED_ShowChar(32,0,':',16,1);//oled显示字符
			OLED_ShowNum(48,0,temp,2,16);//oled显示数字
			OLED_ShowChinese(0,16,5,16,1);//湿
			OLED_ShowChinese(16,16,4,16,1);//度
			OLED_ShowChar(32,16,':',16,1);//oled显示字符
			OLED_ShowNum(48,16,humi,2,16);//oled显示数字
			OLED_Refresh_Gram();

			OSMutexPost (&mutex_oled,OS_OPT_POST_NONE,&err);						//释放oled互斥锁

		}
		
		OSMutexPost (&mutex_dht11,OS_OPT_POST_NONE,&err);
		
		delay_ms(4000);

	}
}

实验结果

串口打印:

在这里插入图片描述
OLED显示:
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:17:11  更:2022-03-06 13:19:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:39:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码