仿真图:
芯片/模块的特点:
STM32F103简介:
高性能处理器:STM32F103系列采用ARM Cortex-M3内核,工作频率可达到72MHz,具有较高的计算能力和执行效率。
多种存储容量和类型:STM32F103系列提供了不同存储容量和类型的微控制器,包括Flash存储器和RAM存储器。Flash存储器容量范围从16KB到512KB不等,RAM存储器容量从10KB到64KB不等,可以根据应用需求选择适当的存储容量。
丰富的外设接口:STM32F103系列微控制器提供了多种外设接口,包括串行通信接口(如USART、SPI、I2C等)、通用定时器和计数器、模拟数字转换器(ADC)、PWM输出、以太网接口等,可满足各种应用的需求。
低功耗特性:STM32F103系列微控制器具有多种低功耗模式,以在不同的应用场景下降低系统功耗,并延长电池寿命。例如,它支持停机模式、待机模式和休眠模式等。
强大的软件生态系统:STM32F103系列微控制器支持意法半导体公司的STM32Cube软件开发生态系统,提供了一系列工具和软件库,简化了软件开发过程,同时还有广泛的开发社区支持。
安全性功能:STM32F103系列微控制器具有硬件加密和校验功能,可确保代码的安全性和完整性。
丰富的包装选项:STM32F103系列提供多种封装选项,包括LQFP、BGA、LFBGA等,方便了不同应用和布局要求的设计。
主程序:
#include "bsp_gpio.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "bsp_key.h"
#include "bsp_lcd1602.h"
#include "dht11.h"
#include "bsp_clkconfig.h"
#include "bsp_delay.h"
char dis0[16]; // 1602显示第一行
char dis1[16];
u16 tempMax = 40; //温度阈值
u16 hmMax = 60; //湿度阈值
u8 setIndex = 0;
u8 fanFlag1 = 0;
void KeyProcess(void);
int main(void)
{
HSI_SetSysClock(RCC_PLLMul_2);
uart_init(9600); // 串口初始化为9600
TIM3_Int_Init(49, 7199); // 50ms
// Adc_Init(); //ADC初始化
Key_GPIO_Config();
GPIO_Config();
LCD_GPIO_Init(); // 1602接口初始化
LCD_Init();
delay_ms(200);
sprintf(dis0, "Temp:%02d C DH:%02d%%", (u16)DHT11.Tem_H, (u16)DHT11.Hum_H); // 打印温湿度
LCD_DispStr(0, 0, dis0); // 初始化显示
LCD_DispOneChar(7, 0, 0xdf);
sprintf(dis0, "TH:%02d C DHH:%02d%%", (u16)tempMax, (u16)hmMax); // 打印温湿度阈值
LCD_DispStr(0, 1, dis0); // 初始化显示
LCD_DispOneChar(5, 1, 0xdf);
while (1)
{
if (refreshFlag == 1)
{
refreshFlag = 0;
if (DHT11_ReadData()) // 是否读取到温湿度
{
sprintf(dis0, "%02d", (u16)DHT11.Tem_H); // 打印温湿度
LCD_DispStr(5, 0, dis0); // 显示
sprintf(dis0, "%02d", (u16)DHT11.Hum_H); // 打印温湿度
LCD_DispStr(13, 0, dis0); // 显示
sprintf(dis0, "Temp:%02d'C DH:%02d%%", (u16)DHT11.Tem_H, (u16)DHT11.Hum_H); // 打印温湿度
printf(dis0); // 串口打印数据
printf("\r\n");
if (DHT11.Tem_H > tempMax) // 对比温度值
{
fanFlag1 = 1;
printf("Temperature High\r\n"); // 发送温度过高
}
else
{
fanFlag1 = 0;
printf("Temperature Normal\r\n"); // 温度正常
}
if (DHT11.Hum_H > hmMax) // 对比湿度值
{
printf("Humidity High\r\n"); // 发送湿度过高
}
else
{
printf("Humidity Normal\r\n"); // 湿度正常
}
if (DHT11.Tem_H > tempMax || DHT11.Hum_H > hmMax) //超过设定值
{
BUZZER_ON;
}
else
{
BUZZER_OFF;
}
if (fanFlag1 || fanFlag2)
{
printf("Fan On\r\n"); //风扇开
FAN_ON;
}
else
{
printf("Fan Off\r\n"); //风扇关
FAN_OFF;
}
}
}
KeyProcess();
}
}
void KeyProcess(void)
{
if (!KEY_SET) //按键加
{
delay_ms(20);
if (!KEY_SET)
{
setIndex++;
if (setIndex > 2)
{
setIndex = 1;
}
if (setIndex == 1)
{
LCD_DispOneChar(7, 1, '<');
LCD_DispOneChar(15, 1, ' ');
}
else if (setIndex == 2)
{
LCD_DispOneChar(7, 1, ' ');
LCD_DispOneChar(15, 1, '<');
}
else
{
LCD_DispOneChar(7, 1, ' ');
LCD_DispOneChar(15, 1, ' ');
}
}
while (!KEY_SET);
}
if (!KEY_ENTER) //按键加
{
delay_ms(20);
if (!KEY_ENTER)
{
setIndex = 0;
LCD_DispOneChar(7, 1, ' ');
LCD_DispOneChar(15, 1, ' ');
}
while (!KEY_ENTER);
}
if (!KEY_ADD) //按键加
{
delay_ms(180);
if (!KEY_ADD)
{
if (setIndex == 1)
{
tempMax++;
if (tempMax >= 100)
{
tempMax = 1;
}
}
if (setIndex == 2)
{
hmMax++;
if (hmMax >= 100)
{
hmMax = 1;
}
}
sprintf(dis0, "%02d", (u16)tempMax); // 打印温度阈值
LCD_DispStr(3, 1, dis0);
sprintf(dis0, "%02d", (u16)hmMax); // 打印温度阈值
LCD_DispStr(12, 1, dis0);
}
// while (!KEY_ADD);
}
if (!KEY_SUB) //按键减
{
delay_ms(180);
if (!KEY_SUB)
{
if (setIndex == 1)
{
tempMax--;
if (tempMax < 1)
{
tempMax = 99;
}
}
if (setIndex == 2)
{
hmMax--;
if (hmMax < 1)
{
hmMax = 99;
}
}
sprintf(dis0, "%02d", (u16)tempMax); // 打印温度阈值
LCD_DispStr(3, 1, dis0);
sprintf(dis0, "%02d", (u16)hmMax); // 打印温度阈值
LCD_DispStr(12, 1, dis0);
}
// while (!KEY_SUB);
}
}
设计文件: