想使用任务调度,来做一个温度和时钟的显示,现在只能显示正确的温度,而不能显示时间,请大神帮忙看看问题,谢谢了!代码如下:
#include <stm32f10x.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "includes.h"
#include "ds18b20.h"
#include "rtc.h"
#include "lcd.h"
/////////////////////////UCOSII任务设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
//RTC任务
//设置任务优先级
#define RTC_TASK_PRIO 7
//设置任务堆栈大小
#define RTC_STK_SIZE 64
//任务堆栈
OS_STK RTC_TASK_STK[RTC_STK_SIZE];
//任务函数
void rtc_task(void *pdata);
//LED1任务
//设置任务优先级
#define DS18B20_TASK_PRIO 6
//设置任务堆栈大小
#define DS18B20_STK_SIZE 64
//任务堆栈
OS_STK DS18B20_TASK_STK[DS18B20_STK_SIZE];
//任务函数
void ds18b20_task(void *pdata);
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init();
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(rtc_task,(void *)0,(OS_STK*)&RTC_TASK_STK[RTC_STK_SIZE-1],RTC_TASK_PRIO);
OSTaskCreate(ds18b20_task,(void *)0,(OS_STK*)&DS18B20_TASK_STK[DS18B20_STK_SIZE-1],DS18B20_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
//DS18B20任务
void ds18b20_task(void *pdata)
{
u8 t=0;
short temperature;
while(1)
{
delay_ms(100);
LCD_Clear(MAGENTA);
BACK_COLOR=MAGENTA;
POINT_COLOR=BLUE;//设置字体为蓝色
while(DS18B20_Init()) //DS18B20初始化
{
LCD_ShowString(60,130,200,16,16,"DS18B20 Error");
delay_ms(200);
LCD_Fill(60,130,239,130+16,WHITE);
delay_ms(200);
}
while(1)
{
if(t%10==0)//每100ms读取一次
{
temperature=DS18B20_Get_Temp();
if((temperature/10)>28.0)
{
LED1=1;
LED0=0;
}
else if((temperature/10)<28.0)
{
LED1=0;
LED0=1;
}
LCD_ShowString(60,30,200,16,16,"DS18B20");
LCD_ShowString(60,50,200,16,16,"Temp: . C");
if(temperature<0)
{
LCD_ShowChar(60+40,50,'-',16,0); //显示负号
temperature=-temperature; //转为正数
}else LCD_ShowChar(60+40,50,' ',16,0); //去掉负号
LCD_ShowNum(60+40+8,50,temperature/10,2,16); //显示正数部分
LCD_ShowNum(60+40+32,50,temperature%10,1,16); //显示小数部分
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
}
}
};
}
//RTC任务
void rtc_task(void *pdata)
{
u8 t;
while(1)
{
delay_ms(200);
LCD_Clear(MAGENTA);
BACK_COLOR=MAGENTA;
POINT_COLOR=BLUE;//设置字体为蓝色
while(RTC_Init()) //RTC初始化 ,一定要初始化成功
{
LCD_ShowString(60,130,200,16,16,"RTC ERROR! ");
delay_ms(800);
LCD_ShowString(60,130,200,16,16,"RTC Trying...");
}
//显示时间
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,200,16,16," - - ");
LCD_ShowString(60,162,200,16,16," : : ");
while(1)
{
if(t!=calendar.sec)
{
t=calendar.sec;
LCD_ShowNum(60,130,calendar.w_year,4,16);
LCD_ShowNum(100,130,calendar.w_month,2,16);
LCD_ShowNum(124,130,calendar.w_date,2,16);
switch(calendar.week)
{
case 0:
LCD_ShowString(60,148,200,16,16,"Sunday ");
break;
case 1:
LCD_ShowString(60,148,200,16,16,"Monday ");
break;
case 2:
LCD_ShowString(60,148,200,16,16,"Tuesday ");
break;
case 3:
LCD_ShowString(60,148,200,16,16,"Wednesday");
break;
case 4:
LCD_ShowString(60,148,200,16,16,"Thursday ");
break;
case 5:
LCD_ShowString(60,148,200,16,16,"Friday ");
break;
case 6:
LCD_ShowString(60,148,200,16,16,"Saturday ");
break;
}
LCD_ShowNum(60,162,calendar.hour,2,16);
LCD_ShowNum(84,162,calendar.min,2,16);
LCD_ShowNum(108,162,calendar.sec,2,16);
LED0=!LED0;
}
delay_ms(10);
};
};
}
|