基于STM32单片机智能热电偶工业锅炉温度控制恒温箱


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

基于STM32单片机智能热电偶工业锅炉温度控制恒温箱是一种集成了先进技术的温度控制系统,主要用于工业锅炉的恒温控制。以下是对该系统的详细介绍:

该系统以STM32单片机为核心控制单元,结合热电偶温度传感器,实现对工业锅炉温度的实时监测与精准控制。系统旨在确保锅炉内温度恒定在预设的范围内,以满足生产工艺的需求,并提升能源利用效率。

功能介绍

STM32单片机智能热电偶工业锅炉温度控制恒温箱16
本系统由STM32F103C8T6单片机核心板、热电偶模块、LCD1602液晶显示、按键、继电器组成。
1、液晶实时显示温度和温度的上下限。
2、通过按键可以设置温度的上下限,上下限具有自动保存,掉电不丢失功能。
3、如果温度低于下限,则继电器闭合,如果温度高于上限,则继电器断开。
4、通过热电偶检测温度范围0-600度。
注意:热电偶两根线接入模块分正负。

设计程序

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include "lcd1602.h"
#include "MAX6675.h"
#include "stmflash.h"  

#define FLASH_SAVE_ADDR  0X08010000 	// 注意不同芯片 扇区flash地址不一样 设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
//stm32f103R8T6 flash地址范围 0x8010000-0x801FFFF
//stm32f103C8T6 flash地址范围 0x8000000-0x807FFFF

#define SIZE 10	 	//数组长度
unsigned char  setFlashBuf[10];//存储数据

char tab0[16]; //暂存数组
char tab1[16]; //暂存数组
unsigned char i;//中间变量i

unsigned char setFlag  = 0;//设置标志
unsigned int setH =  45;//设置上限
unsigned int setL =  35;//设置下限

unsigned int tempA = 0;//当前 温度
unsigned int readMid;//中间变量
unsigned char lineA = 0;//	是否接入了传感器

void disLCDfun(void);//函数声明
void CheckKey(void);

unsigned char initFlagData;	//初始化数据存读取
/******************把数据保存到单片机内部eepom中******************/
void write_FlashBuf(void)
{
	setFlashBuf[0] = initFlagData;
	setFlashBuf[1] =  setH / 256;  //重新写入值
	setFlashBuf[2] =  setH % 256; 
	setFlashBuf[3] =  setL / 256; 
	setFlashBuf[4] =  setL % 256; 
	STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)setFlashBuf,SIZE);		//读取数据	
	
}

/******************把数据从单片机内部eepom中读出来*****************/
void read_FlashBuf(void)
{
	STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)setFlashBuf,SIZE); //读取flash值

	initFlagData = setFlashBuf[0]; //数据初始化读取	
	setH  = setFlashBuf[1];	//读取高字节
	setH <<= 8;
	setH  |= setFlashBuf[2];	 //读取低字节 并合并
	setL   = setFlashBuf[3];
	setL <<= 8;
	setL   |= setFlashBuf[4];
}

/**************开机初始化保存的数据*****************/
void init_FlashBuf(void)
{
	read_FlashBuf(); //读取flash值
	if(initFlagData != 0x55)		//新的单片机初始单片机内问eeprom 如果不是0x55重新写入
	{
		setH =  45;//设置上限
		setL =  35;//设置下限
		initFlagData = 0x55;   //修改值
		delay_ms(20);
		write_FlashBuf();		//读取数据
	}	
}

int main(void)
 { 
	delay_init();	    	 //延时函数初始化	  
	uart_init(9600);	 	//串口初始化为115200
//	uart2_init(9600)	;
  TIM3_Int_Init(499,7199);//50ms 
	 
	LED_Init();		  		//初始化与LED连接的硬件接口
	KEY_Init(); 
	intiMax6675();//初始化 热电偶芯片

	init_FlashBuf();//初始化读取存储数据
	 
	Lcd_GPIO_init();  //初始化lcd引脚
	Lcd_Init();		  //初始化lcd屏幕
	relay = 1; // 打开继电器
	delay_ms(200);	 	 
	relay = 0; // 关闭 继电器
	
	while(1)
	{
		CheckKey();  //按键设置
		if(disFlag==1)					//显示
		{
			disFlag = 0;	
			readMid=MAX6675_ReadReg_A();//读取 间隔不应低于200ms

			if( (readMid&0x04) >> 2 ) 	//MAX6675是否在线	 	//读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,该位为0表示连接
			{lineA = 1;}
			else
			{lineA = 0;}//在线

			readMid = readMid<<1;					   	//读出来的数据的D3~D14是温度值
			readMid = readMid>>4;
			tempA = readMid/4;				//测得的温度单位是0.25,所以要乘以0.25(即除以4)才能得到以度为单位的温度值
			if(tempA > 999)
			{tempA = 999 ; }

			disLCDfun();
			if(lineA == 0)//接上设备
			{
				sprintf(tab1,"nowT:%03d'C    ",tempA);
			}
			else
			{
				sprintf(tab1,"nowT:xxx'C    ");
			}			
			Lcd_Puts(0,0,(unsigned char *)tab1);	//初始化显示 
	 		
			if(tempA < setL)//过低 
			{
				relay = 1; // 打开继电器
			}
			else if(tempA > setH)//过高
			{	 	 
				relay = 0; // 关闭 继电器						
			}
			
		}
	}											    
}	


void disLCDfun(void)
{
		sprintf(tab0," %03d- %03d  ",setL,setH);
		Lcd_Puts(0,1,(unsigned char *)tab0);	//初始化显示 
		
		if(setFlag == 0)//按键设置标志
		{
			Lcd_1Put(0,1,' ');Lcd_1Put(5,1,' ');//更新显示标志
		}
		else if(setFlag == 1)//按键设置标志
		{
			Lcd_1Put(0,1,'s');Lcd_1Put(5,1,' ');//更新显示标志
		}			
		else if(setFlag == 2)//按键设置标志
		{
			Lcd_1Put(0,1,' ');Lcd_1Put(5,1,'s');//更新显示标志
		}	
}


void CheckKey(void)
{ 
	static unsigned  char rekey =0;
	if((key1==0)||(key2==0)||(key3==0))		 //检测到按键按下
	{
		delay_ms(10);   //小抖动
		if(rekey==0)
		{
			if(key1==0)    //检测是否按下
			{
				rekey=1;
				setFlag++;//设置标志
				if(setFlag >= 3) setFlag = 0;
			}	
			else if(key2==0)//设置值键
			{
				rekey=1;
				if(setFlag==1)      //处于设置1
				{
					if(setL > 0 )
					{setL=setL-1;}
				}
				else if(setFlag==2)//处于设置2
				{
					if(setH > 0)
					{setH=setH-1;}
				}				
			}
			else if(key3==0)//设置值键
			{
				rekey=1;
				if(setFlag==1)      //处于设置1
				{
					if(setL < 999 )
					{setL=setL+1;}
				}
				else if(setFlag==2)//处于设置2
				{
					if(setH < 999 )
					{setH=setH+1;}
				}			
			}
			write_FlashBuf();//存储数据
		}
	}
	else
	{
	rekey=0;    //防止重复检测到按键
	}
}







具体实现截图

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值