OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 535|回复: 11

设计背景图片,之后在图片上显示DS18B20传感器所测温度

[复制链接]

  离线 

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-5-18
在线时间
16 小时
发表于 2017-6-16 17:34:59 | 显示全部楼层 |阅读模式
1金钱
我是在BUILDER的模板上自己设计了一个背景,只贴了图片,没有贴其他的控件,之后生成了.C文件,在EMWIN_DEMO里把下面的文件夹改了,之后在HARDWARE添加了ds18b20.c,pcf8574.c,头文件路径也加了,主函数如下:因为第一次自己动手改程序,现在完全不知道该怎么办,视频,教程也都看了,每个模块单独改我还是会的,但是如果需要两个功能合并到一起就不知道该怎么改,希望麻烦大神提点一二!
板子是阿波罗F429,触摸屏是7寸RGB TFTLCD.
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "tftlcd.h"
#include "timer.h"
#include "sdram.h"
#include "malloc.h"
#include "touch.h"
#include "GUI.h"
#include "WM.h"
#include "FramewinDLG.h"
#include "includes.h"
#include "DIALOG.h"
#include "pcf8574.h"
#include "ds18b20.h"
/************************************************
ALIENTEK STM32开发板STemWin实验
STemWin GUIBulider使用

UCOSIII中以下优先级用户程序不能使用,ALIENTEK
将这些优先级分配给了UCOSIII的5个系统内部任务
优先级0:中断服务服务管理任务 OS_IntQTask()
优先级1:时钟节拍任务 OS_TickTask()
优先级2:定时任务 OS_TmrTask()
优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com  
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/
//任务优先级
#define START_TASK_PRIO    3
//任务堆栈大小
#define START_STK_SIZE     128
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);
//TOUCH任务
//设置任务优先级
#define TOUCH_TASK_PRIO    4
//任务堆栈大小
#define TOUCH_STK_SIZE    128
//任务控制块
OS_TCB TouchTaskTCB;
//任务堆栈
CPU_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
//touch任务
void touch_task(void *p_arg);
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO     5
//任务堆栈大小
#define LED0_STK_SIZE    128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
//led0任务
void led0_task(void *p_arg);
//FRAMEWIN任务
//设置任务优先级
#define FRAMEWIN_TASK_PRIO   6
//任务堆栈大小
#define FRAMEWIN_STK_SIZE   512
//任务控制块
OS_TCB FRAMEWINTaskTCB;
//任务堆栈
CPU_STK FRAMEWIN_TASK_STK[FRAMEWIN_STK_SIZE];
//mijikaofang_task任务
void FRAMEWIN_task(void *p_arg);
//DS18B20任务
//设置任务优先级
#define DS18B20_TASK_PRIO   7
//任务堆栈大小
#define DS18B20_STK_SIZE   512
//任务控制块
OS_TCB DS18B20TaskTCB;
//任务堆栈
CPU_STK DS18B20_TASK_STK[DS18B20_STK_SIZE];
//emwindemo_task任务
void DS18B20_task(void *p_arg);

int main(void)
{
    OS_ERR err;
   CPU_SR_ALLOC();
   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz   
    HAL_Init();                     //初始化HAL库
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //SDRAM初始化
    TFTLCD_Init();                //LCD初始化
    TP_Init();                  //触摸屏初始化
    my_mem_init(SRAMIN);          //初始化内部内存池
   my_mem_init(SRAMEX);          //初始化外部内存池
   my_mem_init(SRAMCCM);          //初始化CCM内存池
   
    OSInit(&err);              //初始化UCOSIII
   OS_CRITICAL_ENTER();            //进入临界区
  //创建开始任务
   OSTaskCreate((OS_TCB  * )&StartTaskTCB,       //任务控制块
             (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_CRITICAL_EXIT();                          //退出临界区  
     OSStart(&err);                                //开启UCOSIII
    while(1);
}
     //开始任务函数
     void start_task(void *p_arg)
     {
     OS_ERR err;
     CPU_SR_ALLOC();
     p_arg = p_arg;
     CPU_Init();
      #if OS_CFG_STAT_TASK_EN > 0u
          OSStatTaskCPUUsageInit(&err);   //统计任务               
      #endif

      #ifdef CPU_CFG_INT_DIS_MEAS_EN  //如果使能了测量中断关闭时间
             CPU_IntDisMeasMaxCurReset();
      #endif
      #if OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
                                      //使能时间片轮转调度功能,设置默认的时间片长度
      OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
      #endif  
     __HAL_RCC_CRC_CLK_ENABLE();  //使能CRC时钟
     GUI_Init();     //STemWin初始化
     WM_MULTIBUF_Enable(1);  //开启STemWin多缓冲,RGB屏可能会用到
     OS_CRITICAL_ENTER(); //进入临界区

//触摸屏任务
    OSTaskCreate((OS_TCB*     )&TouchTaskTCB,  
             (CPU_CHAR*   )"Touch task",   
                 (OS_TASK_PTR )touch_task,   
                 (void*       )0,     
                 (OS_PRIO   )TOUCH_TASK_PRIO,     
                 (CPU_STK*    )&TOUCH_TASK_STK[0],
                 (CPU_STK_SIZE)TOUCH_STK_SIZE/10,
                 (CPU_STK_SIZE)TOUCH_STK_SIZE,  
                 (OS_MSG_QTY  )0,     
                 (OS_TICK   )0,      
                 (void*       )0,     
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);   
//LED0任务
    OSTaskCreate((OS_TCB*     )&Led0TaskTCB,  
             (CPU_CHAR*   )"Led0 task",   
                 (OS_TASK_PTR )led0_task,   
                 (void*       )0,     
                 (OS_PRIO   )LED0_TASK_PRIO,     
                 (CPU_STK*    )&LED0_TASK_STK[0],
                 (CPU_STK_SIZE)LED0_STK_SIZE/10,
                 (CPU_STK_SIZE)LED0_STK_SIZE,  
                 (OS_MSG_QTY  )0,     
                 (OS_TICK   )0,      
                 (void*       )0,     
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);         
//DS18B20任务
    OSTaskCreate((OS_TCB*     )&DS18B20TaskTCB,  
             (CPU_CHAR*   )"DS18B20 task",   
                 (OS_TASK_PTR )DS18B20_task,   
                 (void*       )0,     
                 (OS_PRIO   )DS18B20_TASK_PRIO,     
                 (CPU_STK*    )&DS18B20_TASK_STK[0],
                 (CPU_STK_SIZE)DS18B20_STK_SIZE/10,
                 (CPU_STK_SIZE)DS18B20_STK_SIZE,  
                 (OS_MSG_QTY  )0,     
                 (OS_TICK   )0,      
                 (void*       )0,     
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);        
         
  //STemWin Demo任务
    OSTaskCreate((OS_TCB*     )&FRAMEWINTaskTCB,  
             (CPU_CHAR*   )"FRAMEWIN task",   
                 (OS_TASK_PTR )FRAMEWIN_task,   
                 (void*       )0,     
                 (OS_PRIO   )FRAMEWIN_TASK_PRIO,     
                 (CPU_STK*    )&FRAMEWIN_TASK_STK[0],
                 (CPU_STK_SIZE)FRAMEWIN_STK_SIZE/10,
                 (CPU_STK_SIZE)FRAMEWIN_STK_SIZE,  
                 (OS_MSG_QTY  )0,     
                 (OS_TICK   )0,      
                 (void*       )0,     
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR*     )&err);
         
OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);  //挂起开始任务   
OS_CRITICAL_EXIT(); //退出临界区
}
  //FRAMEWIN任务
     void FRAMEWIN_task(void *p_arg)
{  
//更换皮肤
    BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
    CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
    DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
    FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
    HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
    MENU_SetDefaultSkin(MENU_SKIN_FLEX);
    MULTIPAGE_SetDefaultSkin(MULTIPAGE_SKIN_FLEX);
    PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
    RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
    SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
    SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
    SPINBOX_SetDefaultSkin(SPINBOX_SKIN_FLEX);
    CreateFRAMEWIN();
while(1)
{
  GUI_Delay(100);
}
}
//TOUCH任务
void touch_task(void *p_arg)
{
OS_ERR err;
while(1)
{
  GUI_TOUCH_Exec();
  OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_PERIODIC,&err);//延时5ms
}
}
//LED0任务
void led0_task(void *p_arg)
{
OS_ERR err;
while(1)
{
  LED0 = !LED0;
  OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err);//延时500ms
}
}
//DS18B20任务
void DS18B20_task(void *p_arg)
{
    u8 t=0;      
   short temperature;  
   HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM
    LCD_Init();                     //初始化LCD
    PCF8574_Init();                 //初始化PCF8574
    POINT_COLOR=RED;

    PCF8574_ReadBit(BEEP_IO);       //由于DS18B20和PCF8574的中断引脚共用一个IO,
                                    //所以在初始化DS18B20之前要先读取一次PCF8574的任意一个IO,
                                    //使其释放掉中断引脚所占用的IO(PB12引脚),否则初始化DS18B20会出问题
while(DS18B20_Init())         //DS18B20初始化
{
  LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
  delay_ms(200);
  LCD_Fill(30,130,239,130+16,BLACK);
  delay_ms(200);
}   
LCD_ShowString(30,130,200,16,16,"DS18B20 OK");
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(30,150,200,16,16,"Temp:   . C");  
while(1)
{         
  if(t%10==0)//每100ms读取一次
  {  
   PCF8574_ReadBit(BEEP_IO);   //读取一次PCF8574的任意一个IO,使其释放掉PB12引脚,否则读取DS18B20可能会出问题
      temperature=DS18B20_Get_Temp();
   if(temperature<0)
   {
    LCD_ShowChar(30+40,150,'-',16,0);   //显示负号
    temperature=-temperature;     //转为正数
   }else LCD_ShowChar(30+40,150,' ',16,0);   //去掉负号
   LCD_ShowNum(30+40+8,150,temperature/10,2,16); //显示正数部分     
   LCD_ShowNum(30+40+32,150,temperature%10,1,16); //显示小数部分      
  }      
  delay_ms(10);
  t++;
  if(t==20)
  {
   t=0;
   LED0=!LED0;
  }
}         
}




1.png
2.png
回复

使用道具 举报

  离线 

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-5-18
在线时间
16 小时
 楼主| 发表于 2017-6-16 17:42:29 | 显示全部楼层
回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117143
金钱
117143
注册时间
2010-12-1
在线时间
898 小时
发表于 2017-6-18 19:15:15 | 显示全部楼层
帮顶
回复

使用道具 举报

  离线 

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-5-18
在线时间
16 小时
 楼主| 发表于 2017-6-21 13:39:27 | 显示全部楼层
自顶,求大神帮忙看看该怎么办,还是不会
回复

使用道具 举报

  离线 

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2017-4-21
在线时间
37 小时
发表于 2017-7-6 22:30:04 | 显示全部楼层
帮顶,最近也碰到了这个问题,不知楼主解决了吗?
回复

使用道具 举报

  离线 

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-5-18
在线时间
16 小时
 楼主| 发表于 2017-7-7 14:38:39 | 显示全部楼层
没有解决,已经过了很久了。。。根本没人回答嘛
回复

使用道具 举报

  离线 

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-5-18
在线时间
16 小时
 楼主| 发表于 2017-7-7 14:38:56 | 显示全部楼层
chengnnan 发表于 2017-7-6 22:30
帮顶,最近也碰到了这个问题,不知楼主解决了吗?

没有解决,已经过了很久了。。。根本没人回答嘛
回复

使用道具 举报

  离线 

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2017-4-21
在线时间
37 小时
发表于 2017-7-7 22:55:33 | 显示全部楼层
有人说用GUI_SetTextMode()来设置显示模式可以,但这个还没接触过,我也不知道怎么弄
回复

使用道具 举报

  离线 

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-5-18
在线时间
16 小时
 楼主| 发表于 2017-7-9 09:03:35 | 显示全部楼层
chengnnan 发表于 2017-7-7 22:55
有人说用GUI_SetTextMode()来设置显示模式可以,但这个还没接触过,我也不知道怎么弄

不知道啊不知道
回复

使用道具 举报

  离线 

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-5-18
在线时间
16 小时
 楼主| 发表于 2017-7-24 11:41:19 | 显示全部楼层
自顶自顶自顶
回复

使用道具 举报

  离线 

56

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2017-7-12
在线时间
59 小时
发表于 2017-9-25 18:28:40 | 显示全部楼层
我这俩天也在做这个,温度显示异常,一直为0
回复

使用道具 举报

  离线 

1

主题

9

帖子

0

精华

新手上路

Rank: 1

积分
27
金钱
27
注册时间
2017-11-1
在线时间
4 小时
发表于 2017-11-2 09:27:33 | 显示全部楼层
我前段时间也在搞这个,而且温度传感器用的是总线形式的,我觉得你可以先去掉emwin,用ucos先调试成功,因为时序还是有影响的,才会导致温度传感器失效
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-20 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */