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相关推荐

  1. 基于51单片机的智能饮水机烧水控制系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和设定温度 2.当温度到达100℃时,蜂鸣器报警提醒水烧开了 3.按键可更改预设温度值,当温度低于设定温度5 ...

  2. 基于51单片机的智能蓝牙路灯街灯控制系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.液晶实时显示时间/环境光强/工作模式 2.每隔5s向蓝牙串口发送一次信息 3.支持路灯故障检测 4.工作时间18~24时,两个路灯同时点亮,24时 ...

  3. 基于51单片机声音噪声分贝检测采集显示proteus仿真原理图PCB程序设计

    硬件设计 (末尾附文件) 功能说明: 1.基于STC89C51/52(与AT89S51/52.AT89C51/52通用)单片机作为主控制器 2.采用LCD1602液晶显示屏实时显示分贝值: 3.使用小 ...

  4. 基于51单片机的多路热电偶测温系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前检测的温度值 2.循环显示多路热电偶检测值 3.当温度超过设定温度值一定范围以后,蜂鸣器报警,同时启动升温或降温装置 ...

  5. 基于51单片机的时钟闹钟温度计LCD1602显示proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示时间/当前温度 2.按键可进行闹钟设置和温度上下限设置 3.到达闹钟时间或温度超过阈值范围,蜂鸣器报警 4.到达闹钟 ...

  6. 基于51单片机的教室照明灯人数计数系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前时间/温度/教室人数 2.自动模式下,在工作时间内(1824时),当环境黑暗时,根据进入教室的人数开启14盏灯,其余 ...

  7. 基于51单片机的智能护眼台灯设计proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前时间/环境光强/工作模式 2.当检测到人体距离灯光太近时,蜂鸣器报警提醒 3.当使用时间超过设定阈值时,蜂鸣器报 ...

  8. 基于51单片机电子秤称重系统10kg量程proteus仿真原理图PCB

    功能: 1.本系统采用STC89C52作为单片机 2.本系统LCD1602液晶实时显示时间和当前重量 3.四个功能按键其中,按'设置'键进入时间设置,按'去皮'键实现去皮功能 4.系统设置有重量阈值, ...

  9. 基于51单片机太阳能风能太阳能风光互补路灯proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.手动模式下,由手动开关控制小灯的亮灭 2.自动模式下,由光强决定小灯的亮灭 3.本系统具备太阳能和风能两种方式给系统的锂电池充电,锂电池再经过升压 ...

最新文章

  1. 替换 RHEL5的yum源为CentOS5源,亲测线上系统可用
  2. JS window.open()属性
  3. c语言逻辑运算类指令,组成原理第二章——计算机指令
  4. 【CF526F】Pudding Monsters
  5. TCP/IP 某些最常见的错误原因码 (errno)列表
  6. WebService应用一例,带有安全验证
  7. Servlet的学习笔记
  8. 安卓开发工程师面试题!春招我借这份PDF的复习思路,不吃透都对不起自己
  9. cesium 取消光晕
  10. Maven学习总结(六)——Maven与Eclipse整合
  11. STM32F207时钟系统解析
  12. Mysql和Oracle实现序列自增
  13. 使用clusterProfiler进行KEGG富集分析
  14. 如何在页面上动态实现浮动窗口?
  15. 微信公众平台开发实战Java版之如何网页授权获取用户基本信息
  16. Cloudera搭建部署
  17. (翻译)网站品质与配色相关
  18. android设备打开5555远程连接端口
  19. 数据驱动分析实践四 客户留存分析
  20. emplace_back() 和 push_back 的区别

热门文章

  1. 2021年 PAT(乙级)
  2. 性能分析系列——小命令保证大性能
  3. JavaScript字符串方法汇总
  4. 很有仙气超有创意的单网页视差效果直接可以使用id1091
  5. php微信公众号开发之网页授权
  6. Linux常用命令-文件操作 网络命令 性能命令
  7. Docker工具之Daocloud的使用
  8. java 监听器作用_浅谈java监听器的作用
  9. windows安装CUDA11.1,搭建PaddlePaddle和PaddleHub
  10. demoireing