基于STM32的温度控制系统

提示:记录毕设

文章目录

  • 前言
  • 一、任务书
        • 1.1设计(研究)目标:
        • 1.2设计(研究)内容:
  • 二、代码思路
  • 三、硬件
  • 四、联系我们
  • 五、设计
  • 六、框图代码等资料
  • 喜欢请点赞哦!

前言

基于STM32的温度控制系统,主控使用STM32F103ZET6,在正点原子的精英板上开发(本人也在野火板子上测试成功)。


一、任务书

1.1设计(研究)目标:

我们研究一种基于STM32的智能温度控制系统。该系统以STM32F103作为主控芯片﹐配备了PTC加热器、测温模块﹑等一系列模块。本文设计的温度控制系统主要目标是实现温度的设定值显示、实际值实时测量及显示,通过单片机连接的温度调节装置由软件与硬件电路配合来实现温度实时控制 ;显示可由软件控制在 LCD1602 中实现 ;比较采集温度与设定阈值的大小,然后进行循环控制调控,做出降温或升温处理 ;同时也可根据判断发出警报,用以提高系统的安全性。同时,单片机通过esp8266无线传输到手机上,以便管理人员查看。

1.2设计(研究)内容:

1、题目的意义;
2、各种传感器及设备的一般技术和特殊技术的学习:
3、通信以及控制器的技术要求;
4、总体方案的选型设计;
5、STM32单片机及其外围设备的软硬件系统的技术开发:
6、系统的调试和总体运行原理
7、其他设计内容;具体要求:
1、硬件要求1张1号以上的大图:
2、软件以流程图方式表示:
3、有调试的说明。

二、代码思路

打开定时器4,作为系统运行时间;
为了保证通讯:ESP8266每1S刷新一次;

基于STM32的温度控制系统_第1张图片

三、硬件

  • ESP826601s
  • PTC模块
  • OLED
  • 按键
  • 蜂鸣器(板子自带)
  • DS18B20测温模块

四、联系我们

  • 承接stm32单片机、STC系列单片机设计、嵌入式。问题咨询联系QQ:2424644692
  • 我们在某宝有店铺噢~,搜店铺名:“晖亿科创”

五、设计

  • 主控制器
    主控制模块是由 STM32F103单片机最小系统构成,该控制器具有高性能、低成本、低功耗等特点,采用性能较高的ARMCortex-M3 的 32 位的 RISC 内核,工作频率是 72MHz,内部有高速存储器 ( 高达 128K 字节的闪存和 20K 字节的 SRAM),丰富的增强型 I/O 端口和联接到两条 APB 总线的外设。
  • 数字温度测量模块
    模拟信号在远距离传输过程中,由于所需引线较长,系统会产生误差补偿、多点切换及放大电路的零点误差等问题。此外,考虑到测量现场的电磁环境十分不确定,干扰信号可能比较强,模拟信号易受到干扰因素导致产生测量误差,影响测量的精度。因此,本系统采用一种抗干扰能力较强的新型数字温度传感器 DS18B20 来避免发生上述问题
  • 温度显示模块
    显示模块主要用于显示状态以及温度值,本设计选用简单易用的 LCD1602。它是一种专门用来显示英文字母、阿拉伯数字、标点符号等的点阵型液晶模块,由 2*16 个 5X7 点阵字符位组成,每个点阵块都可以显示一个字符,每位点阵块之间有一个点距的间隔,两行之间也有间隔,起到了字符间距和行间距的作用。由于 LCD1602 所需电压为 5V,因此它与3.3V 的单片机连接需要将 STM32 设置为开漏输出,且连接 5V的上拉电阻提高电平
  • 温度控制模块
    温度控制模块是由 TC4427A、PTC 热敏电阻、半导体制冷片以及 N 沟道 MOS 管构成。TC4437A 的功能是电平转换,用以控制 N 沟道 MOS 管是否通断。当单片机给出 3.3V 高电平,TC4427A 输出端会转换为 12V 高电平,然后连接到场效应管的栅极,此时场效应管处于导通状态,漏极会和源极接地连接并且连接到接线端子,与其 12V 的电压形成一个完整通路,则器件启动。反之当单片机给出 0V 低电平,TC4427A输出端也为 0V 低电平,然后连接到场效应管的栅极上,于是场效应管处于断开状态(漏极和源极断开),此时接线端子的12V 电压和场效应管的漏极不能形成完整通路,则器件关闭
  • 电源模块
    由于单片机供电电压为 3.3V,而 LCD1602 为 5V,其余器件所需电压皆为 12V,故而电源模块主要是有适配器输出 12V的电压,然后通过 7805 转换的 5V 电压以及 AMS1117 转换的3.3V 电压

六、框图代码等资料

基于STM32的温度控制系统_第2张图片

  • DS18B20的测温代码
#include "ds18b20.h"
#include "delay.h"

//复位DS18B20
void DS18B20_Rst(void)	   
{                 
	DS18B20_IO_OUT();   //设置为输出
  DS18B20_DQ_OUT=0;  //拉低DQ
  delay_us(750);      //拉低750us
  DS18B20_DQ_OUT=1;  //DQ=1 
	delay_us(15);       //15US
}

//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void) 	   
{   
	u8 retry=0;
	DS18B20_IO_IN();    //设置为输入
    while (DS18B20_DQ_IN&&retry<200)
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=200)return 1;
	else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
	{
		retry++;
		delay_us(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}

//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) 
{
  u8 data;
	DS18B20_IO_OUT();   //设置为输出
  DS18B20_DQ_OUT=0; 
	delay_us(2);
  DS18B20_DQ_OUT=1; 
	DS18B20_IO_IN();    //设置为输入
	delay_us(12);
	if(DS18B20_DQ_IN)data=1;
  else data=0;	 
  delay_us(50);           
  return data;
}

//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)   
{        
  u8 i,j,dat;
  dat=0;
	for (i=1;i<=8;i++) 
	{
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }						    
  return dat;
}

//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)     
 {             
    u8 j;
    u8 testb;
    DS18B20_IO_OUT();     //设置为输出
    for (j=1;j<=8;j++) 
	{
        testb=dat&0x01;
        dat=dat>>1;
        if(testb)       // 写1
        {
            DS18B20_DQ_OUT=0;
            delay_us(2);                            
            DS18B20_DQ_OUT=1;
            delay_us(60);             
        }
        else            //写0
        {
            DS18B20_DQ_OUT=0;
            delay_us(60);             
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}
 
//开始温度转换
void DS18B20_Start(void)
{   						               
    DS18B20_Rst();	   
    DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
}

//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在    	 
u8 DS18B20_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIOB时钟
	
    GPIO_Initure.Pin=GPIO_PIN_12;           //PB12
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //初始化
 
 	  DS18B20_Rst();
	  return DS18B20_Check();
}

//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
    short tem;
    DS18B20_Start ();           //开始转换
    DS18B20_Rst();
    DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);   // skip rom
    DS18B20_Write_Byte(0xbe);   // convert	    
    TL=DS18B20_Read_Byte();     // LSB   
    TH=DS18B20_Read_Byte();     // MSB   
    if(TH>7)
    {
        TH=~TH;
        TL=~TL; 
        temp=0;//温度为负  
    }else temp=1;//温度为正	  	  
    tem=TH; //获得高八位
    tem<<=8;    
    tem+=TL;//获得底八位
    tem=(double)tem*0.625;//转换     
	if(temp)return tem; //返回温度值
	else return -tem;    
}


喜欢请点赞哦!

在这里插入图片描述

你可能感兴趣的:(毕业设计,单片机,stm32,嵌入式硬件)