基于STM32单片机的温度控制系统(Proteus仿真+Keil源码+设计文档)DS18B20 附下载链接!

提供对应的Proteus仿真电路图,Keil程序源码(C语言)+设计文档等电子资料参考学习,附全部资料的下载链接

1)项目完整资料获取链接:下载链接

2)Keil、Proteus各个版本安装包: 下载链接

01设计要求

设计一个基于STM32单片机的温度控制系统:

  1. DS18B20监测环境温度,显示在LCD1602上
  2. 可以设置温度上下限
  3. 可以控制加热或者降温
  4. 超过限制温度用LED或者蜂鸣器进行提示

02Proteus仿真在这里插入图片描述

03示例代码

#include "main.h"
#include "bsp-lcd1602.h"
#include "ds18b20.h"
#include "delay.h"

int main(void)
{
    /* USER CODE BEGIN 1 */
    u8 state = 0, i = 0, j = 0;
    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    /* USER CODE BEGIN 2 */
    LCD1602_Init();
    DS18B20_Init();//DS18B20初始化
    HAL_Delay(10);  //延时一段时间

    LCD1602_ShowStr(2, 0, "Temp Alarm", 11);
    LCD1602_ShowStr(0, 1, "detection system", 16);

    HAL_Delay(1000);//延时1S

    LCD1602_WriteCmd(0x01);//清屏

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        switch (state)
        {
            case 0:
                display_temperature(0, 0);//获取温度值并在LCD1602上显示,当前温度值与阈值进行比较并报警
                if (key == KEY2_PRESS)
                {
                    key = 0;
                    LCD1602_WriteCmd(0x01);  //清屏
                    state = 1;
                }
                if (key == KEY3_PRESS)
                {
                    key = 0;
                    i = ~i;
                    LCD1602_WriteCmd(0x01);  //清屏
                    state = 3;
                }
                if (key == KEY4_PRESS)
                {
                    key = 0;
                    j = ~j;
                    LCD1602_WriteCmd(0x01);  //清屏
                    state = 4;
                }
                break;
            case 1:
                LCD1602_ShowStr(0, 0, "SetHighTemp:", 12);
                LCD1602_ShowStr(0, 1, "HTemp =", 7);
                LCD1602_ShowNum(8, 1, Hight_Temp_Value / 100);
                LCD1602_ShowNum(9, 1, Hight_Temp_Value % 100 / 10);
                if (key == KEY0_PRESS)
                {
                    key = 0;
                    Hight_Temp_Value = Hight_Temp_Value + 10;
                    if (Hight_Temp_Value > 1000)
                        Hight_Temp_Value = 0;
                }
                else if (key == KEY1_PRESS)
                {
                    key = 0;
                    Hight_Temp_Value = Hight_Temp_Value - 10;
                    if (Hight_Temp_Value < 1)
                        Hight_Temp_Value = 0;
                }
                else if (key == KEY2_PRESS)
                {
                    key = 0;
                    LCD1602_WriteCmd(0x01);  //清屏
                    state = 2;
                }
                break;
            case 2:
                LCD1602_ShowStr(0, 0, "SetLowTemp:", 11);
                LCD1602_ShowStr(0, 1, "LTemp =", 7);
                LCD1602_ShowNum(8, 1, Low_Temp_Value / 100);
                LCD1602_ShowNum(9, 1, Low_Temp_Value % 100 / 10);
                if (key == KEY0_PRESS)
                {
                    key = 0;
                    Low_Temp_Value = Low_Temp_Value + 10;
                    if (Low_Temp_Value > Hight_Temp_Value)
                        Low_Temp_Value = Hight_Temp_Value - 10;
                }
                else if (key == KEY1_PRESS)
                {
                    key = 0;
                    Low_Temp_Value = Low_Temp_Value - 10;
                    if (Low_Temp_Value < 1)
                        Low_Temp_Value = 0;
                }
                else if (key == KEY2_PRESS)
                {
                    key = 0;
                    LCD1602_WriteCmd(0x01);  //清屏
                    state = 0;
                }
                break;
            case 3:
                //每按一下,改变升温电机的状态
                if (i)
                    HAL_GPIO_WritePin(Heat_OUT_GPIO_Port, Heat_OUT_Pin, GPIO_PIN_SET);
                else
                    HAL_GPIO_WritePin(Heat_OUT_GPIO_Port, Heat_OUT_Pin, GPIO_PIN_RESET);
                state = 0;
                break;
            case 4:
                //每按一下,改变降温风机的状态
                if (j)
                    HAL_GPIO_WritePin(Cold_OUT_GPIO_Port, Cold_OUT_Pin, GPIO_PIN_SET);
                else
                    HAL_GPIO_WritePin(Cold_OUT_GPIO_Port, Cold_OUT_Pin, GPIO_PIN_RESET);
                state = 0;
                break;
            default:
                break;
        }
        /* USER CODE END 3 */
    }
}

注:

  1. 源码使用Keil4或Keil5打开

  2. 仿真使用的是Proteus8.13及以上版本,版本过低可能会打不开。

04资料获取

1)项目完整资料获取链接:下载链接

2)Keil、Proteus各个版本安装包: 下载链接

posted @ 2026-07-01 11:05  _Passion  阅读(27)  评论(0)    收藏  举报