将DHT11源程序移植入UCOSIII系统中,DHT11不能正常工作。

2019-07-21 03:02发布

刷新界面后时间等示数可以正常跳转,但温湿度却不会改变


/*********************************************************************
*                                                                    *
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                                                                    *
**********************************************************************
*                                                                    *
* C-file generated by:                                               *
*                                                                    *
*        GUI_Builder for emWin version 5.30                          *
*        Compiled Jul  1 2015, 10:50:32                              *
*        (c) 2015 Segger Microcontroller GmbH & Co. KG               *
*                                                                    *
**********************************************************************
*                                                                    *
*        Internet: www.segger.com  Support: support@segger.com       *
*                                                                    *
**********************************************************************
*/

// USER START (Optionally insert additional includes)
// USER END
#include    "apphj.h"
#include "DIALOG.h"
#include    "WindowDLG.h"
#include "EmWinHZFont.h"
#include "rtc.h"
#include "tftlcd.h"
#include "ap3216c.h"
#include "dht11.h"
#include "pcf8574.h"
/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_WINDOW_0    (GUI_ID_USER + 0x014)
#define ID_TEXT_0    (GUI_ID_USER + 0x015)
#define ID_TEXT_1    (GUI_ID_USER + 0x016)
#define ID_TEXT_2    (GUI_ID_USER + 0x017)
#define ID_TEXT_3    (GUI_ID_USER + 0x018)
#define ID_TEXT_4    (GUI_ID_USER + 0x019)
#define ID_TEXT_5    (GUI_ID_USER + 0x01B)
#define ID_TEXT_6    (GUI_ID_USER + 0x01C)
#define ID_BUTTON_0    (GUI_ID_USER + 0x01A)

    u8 temperature;         
    u8 humidity;
// USER START (Optionally insert additional defines)
// USER END

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/

// USER START (Optionally insert additional static data)
// USER END

/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate3[] = {
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 320, 240, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_0, 20, 30, 80, 20, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_1, 20, 60, 80, 20, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_2, 30, 90, 80, 20, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_3, 30, 120, 80, 20, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_4, 30, 150, 80, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Text", ID_TEXT_5, 140, 30, 80, 20, 0, 0x0, 0 },
      { TEXT_CreateIndirect, "Text", ID_TEXT_6, 140, 60, 80, 20, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 220, 200, 80, 20, 0, 0x0, 0 },
  // USER START (Optionally insert additional widgets)
  // USER END
};

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/

// USER START (Optionally insert additional static code)
// USER END

/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog3(WM_MESSAGE * pMsg) {
    RTC_TimeTypeDef RTC_TimeStruct;
    RTC_DateTypeDef RTC_DateStruct;
   WM_HWIN hItem;
    int NCode;
    int Id;
    u16 ir,als,ps;  
    char text[30];
     u8 tbuf[40];


  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
                   case WM_PAINT:
         GUI_SetBkColor(GUI_LIGHTGREEN);
        GUI_Clear();
        GUI_SetColor(GUI_RED);
        GUI_SetFont(GUI_FONT_20_ASCII);
                 //显示日期
        HAL_RTC_GetDate(&RTC_Handler,&RTC_DateStruct,RTC_FORMAT_BIN);//获取日期
        sprintf((char*)tbuf,"20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);
        GUI_DispStringAt((const char*)tbuf,200,30);//显示日期
               
                 //显示时间
        HAL_RTC_GetTime(&RTC_Handler,&RTC_TimeStruct,RTC_FORMAT_BIN);//获取时间
        sprintf((char*)tbuf,"%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
        GUI_DispStringAt((const char*)tbuf,80,30);//显示时间
               
               //显示光强度
                AP3216C_ReadData(&ir,&ps,&als);    //读取数据
                sprintf(text,"%d",ir);
                GUI_DispStringAt(text,110,120);//显示红外强度
                sprintf(text,"%d",als);               
                GUI_DispStringAt(text,110,90);//显示环境光强度
               
                PCF8574_ReadBit(BEEP_IO);
                DHT11_Read_Data(&temperature,&humidity);                //读取温湿度值
                sprintf(text,"%d",temperature);
                GUI_DispStringAt(text,90,60);//显示温度
                GUI_DispStringAt("C",115,60);//显示温度单位
                sprintf(text,"%d",humidity);
                GUI_DispStringAt(text,220,60);//显示湿度
                GUI_DispStringAt("%",245,60);//显示湿度单位

         break;
     case WM_INIT_DIALOG:
               //初始化BUTTONO
        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
        BUTTON_SetFont(hItem,&GUI_FontHZ16);
        BUTTON_SetText(hItem,"返回");

            //初始化TEXT
        hItem=WM_GetDialogItem(pMsg->hWin,ID_TEXT_0);
        TEXT_SetTextAlign(hItem,GUI_TA_HCENTER|GUI_TA_VCENTER);
        TEXT_SetFont(hItem,GUI_FONT_16_ASCII);
        TEXT_SetFont(hItem,&GUI_FontHZ12);
        TEXT_SetTextColor(hItem,GUI_BLACK);
        TEXT_SetText(hItem, "时间:");
        //初始化TEXT
        hItem=WM_GetDialogItem(pMsg->hWin,ID_TEXT_1);
        TEXT_SetTextAlign(hItem,GUI_TA_HCENTER|GUI_TA_VCENTER);
        TEXT_SetFont(hItem,GUI_FONT_16_ASCII);
        TEXT_SetFont(hItem,&GUI_FontHZ12);
        TEXT_SetTextColor(hItem,GUI_BLACK);
        TEXT_SetText(hItem, "温度:");
                           //初始化TEXT
        hItem=WM_GetDialogItem(pMsg->hWin,ID_TEXT_2);
        TEXT_SetTextAlign(hItem,GUI_TA_HCENTER|GUI_TA_VCENTER);
        TEXT_SetFont(hItem,GUI_FONT_16_ASCII);
        TEXT_SetFont(hItem,&GUI_FontHZ12);
        TEXT_SetTextColor(hItem,GUI_BLACK);
        TEXT_SetText(hItem, "环境光强度:");
                           //初始化TEXT
        hItem=WM_GetDialogItem(pMsg->hWin,ID_TEXT_3);
        TEXT_SetTextAlign(hItem,GUI_TA_HCENTER|GUI_TA_VCENTER);
        TEXT_SetFont(hItem,GUI_FONT_16_ASCII);
        TEXT_SetFont(hItem,&GUI_FontHZ12);
        TEXT_SetTextColor(hItem,GUI_BLACK);
        TEXT_SetText(hItem, "红外线强度:");
                           //初始化TEXT
        hItem=WM_GetDialogItem(pMsg->hWin,ID_TEXT_4);
        TEXT_SetTextAlign(hItem,GUI_TA_HCENTER|GUI_TA_VCENTER);
        TEXT_SetFont(hItem,GUI_FONT_16_ASCII);
        TEXT_SetFont(hItem,&GUI_FontHZ12);
        TEXT_SetTextColor(hItem,GUI_BLACK);
        TEXT_SetText(hItem, "短信");
                                   //初始化TEXT
        hItem=WM_GetDialogItem(pMsg->hWin,ID_TEXT_5);
        TEXT_SetTextAlign(hItem,GUI_TA_HCENTER|GUI_TA_VCENTER);
        TEXT_SetFont(hItem,GUI_FONT_16_ASCII);
        TEXT_SetFont(hItem,&GUI_FontHZ12);
        TEXT_SetTextColor(hItem,GUI_BLACK);
        TEXT_SetText(hItem, "日期:");
        
                                   //初始化TEXT
        hItem=WM_GetDialogItem(pMsg->hWin,ID_TEXT_6);
        TEXT_SetTextAlign(hItem,GUI_TA_HCENTER|GUI_TA_VCENTER);
        TEXT_SetFont(hItem,GUI_FONT_16_ASCII);
        TEXT_SetFont(hItem,&GUI_FontHZ12);
        TEXT_SetTextColor(hItem,GUI_BLACK);
        TEXT_SetText(hItem, "湿度:");
        
        


                  

            break;               
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_BUTTON_0: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
          CreateWindow();
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    // USER START (Optionally insert additional code for further Ids)
    // USER END
    }
    break;
  // USER START (Optionally insert additional message handling)
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateWindow
*/
//背景窗口WM_HBKWIN回调函数
static void _cbBkWindow(WM_MESSAGE* pMsg)
{
    switch(pMsg->MsgId)
    {
        case WM_PAINT:
            GUI_SetBkColor(GUI_BLUE);
            GUI_Clear();
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}

WM_HWIN CreateWindow3(void);
WM_HWIN CreateWindow3(void) {
  WM_HWIN hWin;
    u8 tbuf[40];
    WM_SetCallback(WM_HBKWIN,_cbBkWindow);//设置背景窗口回调函数
  hWin = GUI_CreateDialogBox(_aDialogCreate3, GUI_COUNTOF(_aDialogCreate3), _cbDialog3, WM_HBKWIN, 0, 0);
       while(1)
    {
        GUI_Delay(200);
        WM_InvalidateWindow(hWin); //对话框窗口无效

    }
  return hWin;
}

// USER START (Optionally insert additional public code)
// USER END

/*************************** End of file ****************************/



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
472643309
1楼-- · 2019-07-21 04:00
主程序
int main(void)
{

    OS_ERR err;
        CPU_SR_ALLOC();
   
    Write_Through();                //Cahce强制透写
    MPU_Memory_Protection();        //保护相关存储区域
    Cache_Enable();                 //打开L1-Cache
      
        Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
        HAL_Init();                                        //初始化HAL库
    delay_init(216);                //延时初始化
        uart_init(115200);                        //串口初始化
    KEY_Init();                     //按键初始化
        PCF8574_Init();                 //初始化PCF8574
    LED_Init();                     //初始化LED
    SDRAM_Init();                   //SDRAM初始化
        TFTLCD_Init();                  //初始化LCD
    TP_Init();                                        //触摸屏初始化
        TIM3_PWM_Init(500-1,108-1);     //108M/108=1M的计数频率,自动重装载为500,那么PWM频率为1M/500=2kHZ
         RTC_Init();                     //初始化RTC
        while(AP3216C_Init());                //检测不到AP3216C
        PCF8574_ReadBit(BEEP_IO);       //由于DHT11和PCF8574的中断引脚共用一个IO,
        while(DHT11_Init());        //DHT11初始化       


    my_mem_init(SRAMIN);                    //初始化内部内存池
        my_mem_init(SRAMEX);                    //初始化外部内存池
        my_mem_init(SRAMDTCM);                    //初始化DTCM内存池
   
    exfuns_init();                                //为fatfs相关变量申请内存                                 
          f_mount(fs[0],"0:",1);                     //挂载SD卡
    f_mount(fs[1],"1:",1);                 //挂载FLASH.       
    f_mount(fs[2],"2:",1);                     //挂载NAND FLASH.
   
    while(font_init())                //初始化字库
        {
                LCD_ShowString(30,70,200,16,16,"Font Error!");
                while(SD_Init())        //检测SD卡
                {
                        LCD_ShowString(30,90,200,16,16,"SD Card Failed!");
                        delay_ms(200);
                        LCD_Fill(30,90,200+30,70+16,WHITE);
                        delay_ms(200);                    
                }
                update_font(30,90,16,"0:");        //如果字库不存在就更新字库
                delay_ms(2000);
                LCD_Clear(WHITE);        //清屏
                break;
        }
   
    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时钟
        //WM_SetCreateFlags(WM_CF_MEMDEV); //启动所有窗口的存储设备
        GUI_Init();                          //STemWin初始化
        WM_MULTIBUF_Enable(1);  //开启STemWin多缓冲,RGB屏可能会用到
        OS_CRITICAL_ENTER();        //进入临界区
        //STemWin Demo任务       
        OSTaskCreate((OS_TCB*     )&EmwindemoTaskTCB,               
                                 (CPU_CHAR*   )"Emwindemo task",                
                 (OS_TASK_PTR )emwindemo_task,                        
                 (void*       )0,                                       
                 (OS_PRIO          )EMWINDEMO_TASK_PRIO,     
                 (CPU_STK*    )&EMWINDEMO_TASK_STK[0],       
                 (CPU_STK_SIZE)EMWINDEMO_STK_SIZE/10,       
                 (CPU_STK_SIZE)EMWINDEMO_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);
        //触摸屏任务
        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);       
        //字库更新任务
        OSTaskCreate((OS_TCB*     )&FontupdataTaskTCB,               
                                 (CPU_CHAR*   )"Fontupdata task",                
                 (OS_TASK_PTR )fontupdata_task,                        
                 (void*       )0,                                       
                 (OS_PRIO          )FONTUPDATA_TASK_PRIO,     
                 (CPU_STK*    )&FONTUPDATA_TASK_STK[0],       
                 (CPU_STK_SIZE)FONTUPDATA_STK_SIZE/10,       
                 (CPU_STK_SIZE)FONTUPDATA_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();        //退出临界区
}

//EMWINDEMO任务
void emwindemo_task(void *p_arg)
{
        GUI_CURSOR_Show();
        CreateWindow();
   // HZFontDemo();
        while(1)
        {
                        GUI_Delay(100);
        }
}

//字库更新任务
//KEY_UP键长按2s更新字库
void fontupdata_task(void *pdata)
{
        OS_ERR err;
        while(1)
        {
                if(WK_UP == 1)                                //KEY_UP键按下
                {
                        OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);//延时2s
                        if(WK_UP == 1)                        //还是KEY_UP键
                        {
                HzFontupdataCreate();   //升级字库
                        }
                }
                OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);//延时10ms
        }
}

//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_Toggle;
                OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err);//延时500ms
        }
}

一周热门 更多>