基于AT89C51的冰柜温度控制系统的串联型PID算法程序
时间: 2023-08-24 09:07:28 浏览: 96
下面是基于AT89C51的冰柜温度控制系统串联型PID算法程序的示例代码:
```
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit EN=P3^2; //制冷机开关控制引脚
sbit K1=P3^0; //温度调节按键
sbit K2=P3^1; //温度调节按键
uint target_temp = 20; //目标温度
uint current_temp = 0; //当前温度
uint Kp = 10; //比例系数
uint Ki = 2; //积分系数
uint Kd = 0; //微分系数
uint last_error = 0; //上一次误差
uint integral = 0; //积分值
void InitTimer0(); //定时器0初始化
void InitADC(); //ADC初始化
void DisplayTemp(); //温度显示函数
void main()
{
InitTimer0(); //初始化定时器0
InitADC(); //初始化ADC
while(1)
{
if(K1 == 0) //调节目标温度
{
target_temp++;
if(target_temp > 30) target_temp = 30;
while(!K1);
}
if(K2 == 0)
{
target_temp--;
if(target_temp < 0) target_temp = 0;
while(!K2);
}
current_temp = ADC; //读取当前温度
uint error = target_temp - current_temp; //计算误差
integral += error; //积分
uint derivative = error - last_error; //微分
last_error = error;
uint output = Kp * error + Ki * integral + Kd * derivative; //PID计算
if(output > 100) output = 100; //限制输出在0~100之间
if(output < 0) output = 0;
if(current_temp < target_temp) //制冷机开关控制
EN = 1;
else
EN = 0;
if(output > current_temp) //制冷机PWM控制
EN = 1;
else
EN = 0;
DisplayTemp(); //温度显示
}
}
void InitTimer0()
{
TMOD |= 0x01; //定时器0工作在模式1
TH0 = 0xFC; //定时器0初值
TL0 = 0x67;
ET0 = 1; //允许定时器0中断
EA = 1; //开启总中断
TR0 = 1; //启动定时器0
}
void InitADC()
{
ADC_CONTR = 0x80; //使能ADC
ADC_CONTR |= 0x0F; //选择ADC0通道
ADC_RES = 0; //清零ADC结果寄存器
ADC_RESL = 0;
}
void DisplayTemp()
{
uchar tempstr[4];
tempstr[0] = current_temp / 100 + '0'; //百位数字
tempstr[1] = current_temp % 100 / 10 + '0'; //十位数字
tempstr[2] = current_temp % 10 + '0'; //个位数字
tempstr[3] = '\0'; //字符串结束符
//在LCD上显示温度
}
void Timer0_ISR() interrupt 1 //定时器0中断服务程序
{
TH0 = 0xFC; //重新赋初值
TL0 = 0x67;
DisplayTemp(); //温度显示
}
```
在这个程序中,串联型PID算法的实现主要在主函数中完成,具体包括目标温度的调节、当前温度的读取、误差计算、积分、微分、PID计算和制冷机的开关控制和PWM控制。此外,还需要使用定时器0和ADC来实现温度的周期性检测和读取,以及LCD显示温度值。
阅读全文