基于STM32单片机的智能粮仓温湿度检测控制仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

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);
    }
}

设计文件:

链接:https://pan.baidu.com/s/1xA4tai60NRI4ZAHnlE4BfA?pwd=npkz

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于ARM嵌入式温度检测系统的显示和数据处理代码的示例: ```c #include "stm32f10x.h" #include "stdio.h" #define ADC1_DR_Address ((uint32_t)0x4001244C) void ADC1_Init(void); void USART1_Init(void); void USART1_SendChar(char c); void USART1_SendString(char* s); void delay_ms(uint32_t ms); int main(void) { float temperature; char buffer[20]; ADC1_Init(); USART1_Init(); while(1) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); temperature = (ADC_GetConversionValue(ADC1) * 0.0805664) - 40.0; sprintf(buffer, "%.2f\r\n", temperature); USART1_SendString(buffer); delay_ms(500); } } void ADC1_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1, ENABLE); } void USART1_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void USART1_SendChar(char c) { while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, c); } void USART1_SendString(char* s) { while(*s) { USART1_SendChar(*s++); } } void delay_ms(uint32_t ms) { volatile uint32_t nCount; RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks); nCount = (RCC_Clocks.HCLK_Frequency / 10000) * ms; for(; nCount != 0; nCount--); } ``` 上述代码假设使用的是STM32F103C8T6开发板,温度传感器的输出电压通过ADC转换为数字信号,然后通过USART1串口发送到外部设备上。在主循环中,获取转换值并将其转换为温度值,然后通过串口发送。函数`delay_ms`用于延迟,以便使温度值能够适当地刷新。 注意,此代码仅供参考,可能需要根据具体硬件和应用程序进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值