基于51单片机的水温温度PID算法控制系统proteus仿真原理图PCB

基于51单片机PID温控算法仿真 51单片机水温PID控制 阅读详情

1.本系统采用STC89C52作为单片机
2.采用液晶LCD1602液晶实时显示相关数据
3.采用矩阵键盘可设置PID相关参数
4.采用L298驱动功率电阻模拟加热过程
5.当温度超过设定值的一定范围启动声光报警系统
6.DC002直接5V电源输入
7.支持按键和旋钮两种温度设定模式,设定范围30~80℃;通过滑动变阻器旋钮可无极设置温度值
8.采用NTC电阻实时测量温度变化

原理图:
在这里插入图片描述

PCB:
在这里插入图片描述

主程序:

#include "reg51.h"
#include "math.h"

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define T25 (273.15+25) //T25
#define Bx (4050.0) //B值
#define Ka (273.15) //绝对零度
#define Rp (10000.0) //ntc串联电阻
#define ntcR25 (10000.0) //25度时电阻
//#define RA (0.00335)
//#define RB (0.000259)
//#define RC (0.00000305)
//#define RD (-0.000000272)
//#define RE (-0.0000000648)

/*****************引脚定义*********************************/
// l298n
sbit RELAY_HEAT = P1^4;
sbit RELAY_COOL = P1^5;
sbit ENA = P1^6;
/********************************/
// AD芯片
sbit CLOCK = P1^0;
sbit D_IN  = P1^1;
sbit D_OUT = P1^2;
sbit _CS   = P1^3;
/********************************/
// lcd液晶
sbit LCD_RS = P3^5;
sbit LCD_EN = P3^6;
/********************************/

//蜂鸣器
sbit SPEAKER = P3^7;

/*****************变量定义(声明)*********************************/
int freq = 500, pwm = 0;
uchar setflag = 0, pageflag = 0, ok = 0;
float set_temp = 0;
float KP = 10, KI = 1, KD = 0;
uint pul_count = 0;
float ek = 0, ek1 = 0, ek2 = 0;
float keytemp = 0;

uchar code str[16] = "    welcome!    ";
uchar code str1[16] = " temperature PID";
uchar code str2[16] = "set-T     now-T ";
uchar code str3[16] = "P:     I:     D:";
uchar code str4[16] = "set-P:       ";
uchar code str5[16] = "set-I:       ";
uchar code str6[16] = "set-D:       ";
void Init(void);
uint adcread(uchar port);
float ReadTemp(void);
void delay(uint n);
void writecom(uchar com);
void writedata(uchar date);
void initlcd();
float keyscan(void);
//uchar keyscans(void);
void lcdnumdisplay(uchar pos, double f);
void lcdnumdisplays(uchar pos, double f);
//uint read_pul();
void mypid(float Kp, float Ki, float Kd, uint count, uint point);

void main()
{
	uchar i;
	float scantemp;
	float adnum0 = 0;
	float adnum1 = 0;
	bit init0, init1, init2, init3, init4;
	Init();
	initlcd();
	writecom(0x80);
	for (i = 0; i < 16; i++)
		writedata(str[i]); // huanyin
	writecom(0x80 + 0x40);
	for (i = 0; i < 16; i++)
		writedata(str1[i]); // shuming
	delay(2000);
	ENA = 1;

	//	RELAY_HEAT=1;RELAY_COOL=0;
	//	while(1);
	while (1)
	{
		set_temp = 460 * (float)(adnum0) / 4095;
		// pwm=set_temp;
		mypid(KP, KI, KD, adnum1, set_temp);
		scantemp = keyscan();
		if (adnum1 >= set_temp - 1.5 && adnum1 <= set_temp + 1.5)
		{
			SPEAKER = 1;
		}
		else
		{
			SPEAKER = 0;
		}
		if (setflag == 0)
		{
			adnum0 = adcread(1);
			adnum1 = ReadTemp();
			if (init0 == 0)
			{
				initlcd();
				writecom(0x80);
				for (i = 0; i < 16; i++)
					writedata(str2[i]); // shuming
				init0 = 1;
				init1 = 0;
				init2 = 0;
				init3 = 0;
				init4 = 0;
			}
			lcdnumdisplays(0x80 + 0x40, (float)set_temp); // set_temp
			lcdnumdisplays(0x80 + 0x4a, (float)adnum1);
		}

		if (setflag != 0 && pageflag == 0)
		{
			if (init1 == 0)
			{
				initlcd();
				writecom(0x80);
				for (i = 0; i < 16; i++)
					writedata(str3[i]);
				init0 = 0;
				init1 = 1;
				init2 = 0;
				init3 = 0;
				init4 = 0;
			}
			lcdnumdisplays(0x80 + 0x40, KP);
			lcdnumdisplays(0x80 + 0x46, KI);
			lcdnumdisplays(0x80 + 0x4D, KD);
		}
		if (setflag != 0 && pageflag == 1)
		{
			if (init2 == 0)
			{
				initlcd();
				writecom(0x80);
				for (i = 0; i < 16; i++)
					writedata(str4[i]);
				init0 = 0;
				init1 = 0;
				init2 = 1;
				init3 = 0;
				init4 = 0;
			}
			lcdnumdisplays(0x80 + 0x40, scantemp);
			if (ok == 1)
			{
				KP = scantemp;
				ok = 0;
			}
		}
		if (setflag != 0 && pageflag == 2)
		{
			if (init3 == 0)
			{
				initlcd();
				writecom(0x80);
				for (i = 0; i < 16; i++)
					writedata(str5[i]);
				init0 = 0;
				init1 = 0;
				init2 = 0;
				init3 = 1;
				init4 = 0;
			}
			lcdnumdisplays(0x80 + 0x40, scantemp);
			if (ok == 1)
			{
				KI = scantemp;
				ok = 0;
			}
		}
		if (setflag != 0 && pageflag == 3)
		{
			if (init4 == 0)
			{
				initlcd();
				writecom(0x80);
				for (i = 0; i < 16; i++)
					writedata(str6[i]);
				init0 = 0;
				init1 = 0;
				init2 = 0;
				init3 = 0;
				init4 = 1;
			}
			lcdnumdisplays(0x80 + 0x40, scantemp);
			if (ok == 1)
			{
				KD = scantemp;
				ok = 0;
			}
		}
	}
}

float ReadTemp(void)
{
    float current = 0;
    float Rt = 0;
    float f_tempVolt = 0;    //温度对应电压
    float f_temp = 0;
    
    f_tempVolt = 5 * (float)adcread(0) / 4096; //读取电压
    current = (5 - f_tempVolt) / Rp; //计算电流值
    Rt = f_tempVolt / current; //计算电阻值
    
    f_temp = ((Bx * T25) / (T25 * (log(Rt) - log(ntcR25)) + Bx)) - Ka;

    delay(5);
    return f_temp;
}

void mypid(float Kp, float Ki, float Kd, uint count, uint point)
{
	static float Uk;
	ek = point - count;
	//   if(ek>=5&&ek<=-5)   //积分分离
	{
		Uk = Kp * (ek - ek1) + Ki * ek + Kd * (ek - 2 * ek1 + ek2);
	}
	//   else
	//   Uk=Kp*ek;
	pwm = Uk;
	// lcdnumdisplays(0x80+0x4a,(float)pwm);
	if (pwm > freq)
		pwm = freq;
	if (pwm <= 0)
	{
		pwm = 0;
		RELAY_HEAT = 0;
		RELAY_COOL = 1;
	}
	if (pwm > 0)
	{
		RELAY_HEAT = 1;
		RELAY_COOL = 0;
	}
	ek2 = ek1;
	ek1 = ek;
}
//uint read_pul()
//{
//	uint t1, th1, th2;
//	uint val;
//	while (1)
//	{
//		th1 = TH1;
//		t1 = TL1;
//		th2 = TH1;
//		if (th1 == th2)
//			break;
//	}
//	val = th1 * 256 + t1;
//	return val;
//}

void delay(uint n)
{
	uint i, j;
	for (i = n; i > 0; i--)
		for (j = 1; j > 0; j--)
			;
}

void Init(void) //初始化函数
{
	TMOD = 0x51;
	TH0 = (65536 - 10) / 256;
	TL0 = (65536 - 10) % 256;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
	TH1 = 0;
	TL1 = 0;
	TR1 = 1;
}

仿真演示视频:
https://www.bilibili.com/video/BV1me4y187np/
实物演示视频:
https://www.bilibili.com/video/BV1rG4y1z7yc/

单片机毕业设计-02:PID恒温算法之温控器及原理讲解 PID算法,温控器,加热,制冷,恒温原理,毕业设计 阅读详情

相关推荐

单片机管理PID

在本例中,我们定义了一个PID结构体,并初始化了一些参数,例如设定值(setpoint)、比例系数(Kp)、积分系数(Ki)和微分系数(Kd)。然后,使用while循环读取输入值(input),并计算出误差(err),以及比例、积分和微分部分的输出。总之,在单片机中实现PID算法并不是一件容易的事情,需要对PID算法有深入的理解和高超的编程技巧。但是,在单片机中,我们需要自己设计实现PID的管理。当然,这只是一个简单的例子,实际的PID算法还需要根据具体的被控对象进行调整和优化。

qq_37934722的博客 390

基于51单片机PID水温控制系统(含Keil程序和Proteus文件)

1.使用LCD1602显示屏显示温度温度阈值。2使用按键进行温度阈值的设置,可以直接控制温度阈值的增加和减少。3.当检测到温度低于温度阈值后加热棒就会工作,绿灯就会亮起代表正在进行加热。4.当检测到温度高于温度阈值后冷却棒就会工作,红灯就会亮起代表正在进行冷却。

XCHardware的博客 1973

STC单片机恒温箱开发包:Keil工程+Proteus仿真+PCB文件+开题报告全套

一套面向教学与实践的恒温箱控制系统开发资料,主控采用STC系列单片机(兼容AT89C52/STC89C52),包含可直接编译下载的Keil uVision4工程(含sw.c等源文件,带完整中文注释),Proteus 7.8仿真项目(LCD1602显示、DS18B20温度采集、继电器加热控制、阈值或简易PID逻辑),Protel99SE格式的原理图(yuanlitu.ddb)与PCB文件(支持打样),以及多份开题报告参考文档(含宠物恒温箱、水温控制器等不同侧重点版本),配套元件清单、单片机最小系统说明、DS1

nut55的博客 165

9、基于51单片机PID算法温度控制系统设计(程序+Proteus仿真+原理图+PCB源文件+参考论文+开题报告+任务书等)

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

ENGLISH_HHZ的专栏 6992

51单片机温度控制系统设计:从Proteus仿真PID算法实战

温度控制系统是嵌入式开发中的经典应用,其核心在于通过传感器采集环境数据,并基于控制算法驱动执行机构,实现对物理量的精确调节。PID(比例-积分-微分)算法作为闭环控制的基础,通过计算偏差的比例、积分和微分项来输出控制信号,能有效提升系统的稳定性与响应速度。在工程实践中,结合Proteus仿真进行前期验证,可以大幅降低开发风险与成本。本文以51单片机热水器温控项目为例,详细剖析了从系统需求分析、硬件电路设计(包括最小系统与传感器接口)、到软件算法实现与调试的全过程,为嵌入式初学者和工程师提供了一个完整的、可复

weixin_33670713的博客 385

基于51单片机温度控制系统设计:从DS18B20到Proteus仿真全解析

温度控制是嵌入式系统与物联网应用中的基础技术,其核心在于通过传感器实时采集环境数据,并由微控制器根据预设逻辑驱动执行机构,从而实现对物理量的精准调节。这一闭环控制原理广泛应用于智能家居、工业自动化等领域,其技术价值在于将抽象的算法转化为稳定可靠的物理控制。本文聚焦于一个经典的教学与实践项目——热水器温度控制系统,详细阐述了如何利用51单片机(如STC89C52)作为控制核心,结合数字温度传感器DS18B20进行高精度数据采集,并通过LCD1602显示屏实现人机交互。项目在Proteus仿真平台中完成了从原理

weixin_30627341的博客 332

51单片机热水器温控系统设计:从仿真到闭环控制实践

嵌入式系统开发是物联网与智能硬件的基础,其核心在于通过微控制器(如单片机)采集传感器数据,并驱动执行器完成特定任务,形成一个完整的闭环控制系统。这种系统的工作原理是实时监测被控对象的状态,与设定目标进行比较,并根据算法决策输出控制信号,从而实现自动调节。其技术价值在于将抽象的控制理论转化为可运行的实体,广泛应用于工业自动化、智能家居等领域。以温度控制为例,它是最经典的控制应用场景之一,涉及传感器技术、执行器驱动和人机交互等关键技术模块。本文以热水器温度控制为具体案例,详细解析了如何使用经典的51单片机(如S

weixin_33924770的博客 498

【毕业设计51单片机PID水温控制系统

1.使用LCD1602显示屏显示温度温度阈值。2使用按键进行温度阈值的设置,可以直接控制温度阈值的增加和减少。3.当检测到温度低于温度阈值后加热棒就会工作,绿灯就会亮起代表正在进行加热。4.当检测到温度高于温度阈值后冷却棒就会工作,红灯就会亮起代表正在进行冷却。

2301_79003325的博客 491

基于51单片机水温PID控制系统protues仿真

硬件设计 (末尾附文件) 代码设计 #include"reg51.h" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long /*****************引脚定义*********************************/ //l298n sbit output=P2^5; sbit in1=P2^3; sbit in2=P2^4; /**********************

weixin_44116175的博客 4177

单片机PID算法

单片机PID算法简介1.直接计算法和增量算法2.基本偏差e(t)3.累计偏差4.基本偏差的相对偏差:e(t)-e(t-1)5.三个基本参数:Kp,Ki,Kd.6.标准的直接计算法公式实际应用位置式:增量式: 简介 1.直接计算法和增量算法 这里的所谓增量算法就是相对于标准算法的相邻两次运算之差,得到的结果是增量,也就是说,在上一次的控制量的基础上需要增加(负值意味着减少)控制量,例如对于可控硅电机调速系统,就是可控硅的触发相位还需要提前(或迟后)的量,对于温度控制就是需要增加(或减少)加热比例,根据具体的

宁静致远的博客 1万+

51单片机PID水温控制器设计

PID水温控制器主要以51单片机系统进行温度采集与控制;温度信号由数字温度传感器DS18B20采集,主控器主动获取传感器温度值,通过PID算法,与设置温度进行计算,输出继电器的控制状态,并在LCD显示屏进行显示。

m0_60790717的博客 4541

带死区的PID控制算法仿真

在计算机控制系统中,某些系统为了避免控制作用过于频繁,消除由于频繁动作所引起的振荡,可采用带死区的PID控制算法.

学习不好的电气仔的博客 5778

基于51单片机的四路温温控制系统(pt100铂热电阻、PID、PWM)

基于51单片机的四路温度控制系统可以使用PT100铂热电阻作为温度传感器,PID算法进行温度控制,PWM信号输出控制加热器。下面是一个简单的概述:这只是一个基本的框架,你可以根据具体需求和硬件情况进行调整和扩展。实际的设计中可能还需要考虑温度传感器的放大电路、ADC的精度和采样率、PID参数的调整和调试等问题。

qq_52387508的博客 2099

PID算法:增量式PID & 位置式PID

一般而言,计算机实现PID算法的时候,在采样周期很小的时候,积分部分可以用对误差求和的方式代替,微分部分可以用差商的方式代替,从而实现将连续的PID算法的差分方程进行离散化,能够通过计算机实现。数字PID:指的是PID控制算法的实现是通过计算机软件程序实现的,计算机需要对输入的连续信号进行采集,然后通过量化作为控制器的输入参数,从而经过算法的调节实现目标对象的控制。图中的模拟调节器的意思就是控制规律的方案是通过模拟硬件的方式来实现的,如果想要调整系统的控制规律就需要修改调节器的硬件。

weixin_43866583的博客 1万+

57、基于51单片机PID算法温度控制系统设计 (程序+Proteus仿真+原理图+PCB图+参考论文+开题报告+任务书等)

5.按键可以设置报警值,当温度超过设定的上限或低于下限时,相应的指示灯亮,同时相应的继电器吸合,继电器可以驱动负载(风扇、制冷片、加热管等);1. 单片机型号:STC89C52/51、AT89C52/51、AT89S52/51 都可通用。2.产品自带单片机上电复位电路、手动复位电路(复位按键)、晶振电路(给单片机提供时钟周期)。3.采用LCD 1602液晶显示当前温度值(带单位),温度上限和温度下限;本项目包含的所有文件都可以点击下面的名片,发送 “51单片机+最小系统+LCD1602液晶+按键+

2301_78172491的博客 665

PID 温控设计(基于 STC51

基于最小STC51温控系统设计PID温控算法

张火火的博客 3122

51 温度PID经典算法

#include #include #include #include struct PID { unsigned int SetPoint; // 设定目标 Desired Value unsigned int Proportion; // 比例常数 Proportional Const unsigned int Integral; // 积分

w6028819321的专栏 5974

PID算法C语言程序STM32单片机控制水温实验(一、位置型PID

一、概述 实验所用器材均为容易买到的设备,主要有STM32F103C8T6最小系统板、DS18B20温度传感器、继电器模块、TM1638显示模块、电加热棒(12V/80W)、直流电源适配器(12V/10A),再找一个小一些的玻璃杯(水250ml),所有设备如下图。 二、系统功能 由于采用普通继电器控制加热棒,继电器不允许频繁启停,因此将控制周期设为1min,即每1min计算一次当前1min内电加热棒需要开启的时间(占周期的百分比),通过控制每一个控制周期内电加热棒的开启时间,使水温在设定温度附近恒定;因温

wanglong3713的博客。 1万+
上一篇: 基于51单片机及NB-IoT的水箱水位监测系统原理图PCB
下一篇: 基于51单片机的数字音乐彩灯电子琴proteus仿真原理图PCB
极寒钛科技
博客等级 码龄6年 826粉丝 · 161原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值