基于uc/OS-II的温度采集系统

1.功能概述

按键按下后,触发外部中断,由外部中断服务子函数发送信号量,温度采集任务接收到信号量后,通过DS18B20采集温度。温度采集完成后,以消息邮箱发送给串口显示。
设计一个LED灯任务,监视系统的运行情况。

2.主要代码

2.1 系统的初始化

OS_EVENT * keySem;//定义信号量
OS_EVENT* Temp_MBOX;	    //定义消息邮箱

#define START_TASK_PRIO 4     //开始任务优先级
#define START_STK_SIZE 64     //开始任务堆栈大小
static OS_STK 	START_TASK_STK[START_STK_SIZE];	  //定义开始任务的堆栈


#define TempRead_TASK_PRIO 6     //
#define TempRead_STK_SIZE 100     //
static OS_STK 	TempRead_TASK_STK[TempRead_STK_SIZE];	  //


#define Disp_TASK_PRIO 8     //
#define Disp_STK_SIZE 100     //
static OS_STK 	Disp_TASK_STK[Disp_STK_SIZE];	  //


#define LED_TASK_PRIO 10     //
#define LED_STK_SIZE 64     //
static OS_STK 	LED_TASK_STK[LED_STK_SIZE];	  //

int main()
{

	RCC_Init();
	
	LED_Init();
	exti_init();
	printf_init();	 //printf³õʼ»¯
	ds18b20_init();	 //DS18B20³õʼ»¯
	
	Delay_Init();
	OSInit();  //³õʼ»¯UCOS²Ù×÷ϵͳ
	
	keySem=OSSemCreate(0);
	Temp_MBOX=OSMboxCreate((void *)0);    //½¨Á¢ÏûÏ¢ÓÊÏä
	
	OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);  //´´½¨ÆðʼÈÎÎñ
	OSStart();   //Æô¶¯ucos²Ù×÷ϵͳ			
}

开始任务如下

void start_task(void *pdata)    //¿ªÊ¼ÈÎÎñ
{
	OS_CPU_SR cpu_sr=0;
	pdata=pdata;
	OSStatInit();  //初始化统计任务
	OS_ENTER_CRITICAL();  //关中断
	OSTaskCreate(LED_task,(void *)0,(OS_STK *)&LED_TASK_STK[LED_STK_SIZE-1]	,LED_TASK_PRIO);//LED灯任务
	OSTaskCreate(TempRead_task,(void *)0,(OS_STK *)&TempRead_TASK_STK[TempRead_STK_SIZE-1]	,TempRead_TASK_PRIO);//温度读取
	OSTaskCreate(Disp_task,(void *)0,(OS_STK *)&Disp_TASK_STK[Disp_STK_SIZE-1]	,Disp_TASK_PRIO);//串口显示
	

	OSTaskSuspend(START_TASK_PRIO);   //挂起开始任务
	OS_EXIT_CRITICAL();  //开中断
}

2.2 LED灯任务

void LED_task(void *pdata)	 //ÈÎÎñ1 led
{	
	pdata=pdata;

	while(1)
	{
//	OSSemPend(ledSem,0,&err);	
	
	GPIO_ResetBits(GPIOB,LED); //IO¿ÚÊä³öµÍµçƽ
	delay_ms(1000);
		
	GPIO_SetBits(GPIOB,LED);	 //IO¿ÚÊä³ö¸ßµçƽ
	delay_ms(1000);//ÑÓʱԼΪ1s
	}	
}

2.3 温度采集任务

void TempRead_task(void *pdata)	 //ÈÎÎñ1 TempRead_task
{	
	double data;	
	INT8U err;
	INT8U  i=4;
	pdata=pdata;
	while(1)
	{

		OSSemPend(keySem,0,&err);
		OSSchedLock();	
		data=readtemp();
		printf("当前温度值为:%f ℃/r/n",data);
		printf("i=%d\r\n",i++);//测试代码
		//delay_ms(500);
       OSMboxPost(Temp_MBOX,(void *)&data);//发送消息邮箱
		OSSchedUnlock();
	}	
}

2.4 串口显示任务

void Disp_task(void *pdata) //ÈÎÎñ1 led
{
u8 err,i=0;
double msg;

pdata=pdata;

while(1)
{
msg=*(double *)OSMboxPend(Temp_MBOX,0,&err); //接收消息邮箱

if(err==OS_ERR_NONE)
	{
		printf("成功接收消息r\n");
		printf"当前温度值为:%f ℃/r/n",msg);
			printf("     \r\n");
	}
}

}

发布了8 篇原创文章 · 获赞 3 · 访问量 845

猜你喜欢

转载自blog.csdn.net/qq_42982824/article/details/104372722