基于51单片机的水温温度PID算法控制系统proteus仿真原理图PCB
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]); // huanyinwritecom(0x80 + 0x40);for (i = 0; i < 16; i++)writedata(str1[i]); // shumingdelay(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]); // shuminginit0 = 1;init1 = 0;init2 = 0;init3 = 0;init4 = 0;}lcdnumdisplays(0x80 + 0x40, (float)set_temp); // set_templcdnumdisplays(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/
基于51单片机的水温温度PID算法控制系统proteus仿真原理图PCB相关推荐
- 基于51单片机的智能饮水机烧水控制系统proteus仿真原理图PCB
功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和设定温度 2.当温度到达100℃时,蜂鸣器报警提醒水烧开了 3.按键可更改预设温度值,当温度低于设定温度5 ...
- 基于51单片机的智能蓝牙路灯街灯控制系统proteus仿真原理图PCB
功能: 0.本系统采用STC89C52作为单片机 1.液晶实时显示时间/环境光强/工作模式 2.每隔5s向蓝牙串口发送一次信息 3.支持路灯故障检测 4.工作时间18~24时,两个路灯同时点亮,24时 ...
- 基于51单片机声音噪声分贝检测采集显示proteus仿真原理图PCB程序设计
硬件设计 (末尾附文件) 功能说明: 1.基于STC89C51/52(与AT89S51/52.AT89C51/52通用)单片机作为主控制器 2.采用LCD1602液晶显示屏实时显示分贝值: 3.使用小 ...
- 基于51单片机的多路热电偶测温系统proteus仿真原理图PCB
功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前检测的温度值 2.循环显示多路热电偶检测值 3.当温度超过设定温度值一定范围以后,蜂鸣器报警,同时启动升温或降温装置 ...
- 基于51单片机的时钟闹钟温度计LCD1602显示proteus仿真原理图PCB
功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示时间/当前温度 2.按键可进行闹钟设置和温度上下限设置 3.到达闹钟时间或温度超过阈值范围,蜂鸣器报警 4.到达闹钟 ...
- 基于51单片机的教室照明灯人数计数系统proteus仿真原理图PCB
功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前时间/温度/教室人数 2.自动模式下,在工作时间内(1824时),当环境黑暗时,根据进入教室的人数开启14盏灯,其余 ...
- 基于51单片机的智能护眼台灯设计proteus仿真原理图PCB
功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前时间/环境光强/工作模式 2.当检测到人体距离灯光太近时,蜂鸣器报警提醒 3.当使用时间超过设定阈值时,蜂鸣器报 ...
- 基于51单片机电子秤称重系统10kg量程proteus仿真原理图PCB
功能: 1.本系统采用STC89C52作为单片机 2.本系统LCD1602液晶实时显示时间和当前重量 3.四个功能按键其中,按'设置'键进入时间设置,按'去皮'键实现去皮功能 4.系统设置有重量阈值, ...
- 基于51单片机太阳能风能太阳能风光互补路灯proteus仿真原理图PCB
功能: 0.本系统采用STC89C52作为单片机 1.手动模式下,由手动开关控制小灯的亮灭 2.自动模式下,由光强决定小灯的亮灭 3.本系统具备太阳能和风能两种方式给系统的锂电池充电,锂电池再经过升压 ...
最新文章
- 替换 RHEL5的yum源为CentOS5源,亲测线上系统可用
- JS window.open()属性
- c语言逻辑运算类指令,组成原理第二章——计算机指令
- 【CF526F】Pudding Monsters
- TCP/IP 某些最常见的错误原因码 (errno)列表
- WebService应用一例,带有安全验证
- Servlet的学习笔记
- 安卓开发工程师面试题!春招我借这份PDF的复习思路,不吃透都对不起自己
- cesium 取消光晕
- Maven学习总结(六)——Maven与Eclipse整合
- STM32F207时钟系统解析
- Mysql和Oracle实现序列自增
- 使用clusterProfiler进行KEGG富集分析
- 如何在页面上动态实现浮动窗口?
- 微信公众平台开发实战Java版之如何网页授权获取用户基本信息
- Cloudera搭建部署
- (翻译)网站品质与配色相关
- android设备打开5555远程连接端口
- 数据驱动分析实践四 客户留存分析
- emplace_back() 和 push_back 的区别