芯片为STM32F407,利用仿真完成设计,末尾为仿真图。
线程一通过DS18B20自动测量温度,当温度大于30℃或小于20℃时通过使能PC6串口使LED1灯发光进行 警;
线程二通过RTC时钟获取现实时间,每天的凌晨24点自动投食,通过使能PC7串口控制LED2灯发光0.5s;
LCD实时显示当前温度与学生姓名及学 内容;
用EMWIN取模软件将汉字取模并通过LCD显示;
通过RT-THREAD多线程控制,线程一控制温度的相关内容,线程二控制RTC时钟及LCD显示屏内容。
移植时需要注意对于外设串口的配置
下述为thread线程的代码。
#include “threads.h”
#include “stm32f4xx_hal.h”
#include “gpio.h”
/* USER CODE BEGIN Includes */
#include “ILI9341B8.H”
#include “DS18B20.H”
RTC_DateTypeDef SDATE;
RTC_TimeTypeDef STIME;
extern uint8_t data[5];
extern int16_t TEMP;
uint8_t date[2];
//extern uint16_t HUM,TEM;
static char *s;
void SystemClock_Config(void);
//??3ìthread1
void led1()
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);
}
void led2()
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET);
}
void thread1(void* parameter)
{
//μ÷?è?÷??,??è?áù????
rt_enter_critical();
LCD_Inital();//à???μ??óê±òa??3é2ù×÷?μí3μ??óê±
LCD_Clear(BLACK);
//í?3?áù????
rt_exit_critical();
while(1)
{
ds18_start();
rt_sprintf(s,”%3d”,TEMP);
disstr(10,10,s,BLUE);
if(TEMP>30||TEMP {
led1();
}
else
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_RESET);
}
rt_thread_delay(50);
}
}
//??3ìthread2
void thread2(void* parameter)
{
while(1)
{
char *w;
//μ÷?è?÷??,??è?áù????
rt_enter_critical();
rt_exit_critical();
HAL_RTC_GetDate(&hrtc,&SDATE,RTC_FORMAT_BIN);
switch(SDATE.WeekDay)
{
case 1_w=”Monday”;break;
case 2_w=”Tuesday”;break;
case 3_w=”Wednesday”;break;
case 4_w=”Thursday”;break;
case 5_w=”Friday”;break;
case 6_w=”Saturday”;break;
case 0_w=”Sunday”;break;
}
date[0]=SDATE.WeekDay;
if(date[1]!=date[0])
{
date[1]=date[0];
led2();
rt_thread_delay(500);
}
else
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET);
}
rt_thread_delay(50);
}
}
//??3ìthread3
void thread3(void* parameter)
{
}
仿真图

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!