• 哈哈123455,,
    了解作者
  • C/C++
    开发工具
  • 118KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 1
    下载次数
  • 2020-03-25 22:03
    上传日期
该程序利用PID实现了简易的温度控制器设计,温度控制范围为30-60
温度控制器.zip
  • 温度控制器
  • list
  • lcd.lst
    6.5KB
  • delay_ms.lst
    1.1KB
  • project.m51
    33.7KB
  • STARTUP.lst
    13.8KB
  • ds18b20.lst
    7.1KB
  • PID.lst
    2.6KB
  • main.lst
    11.1KB
  • timer.lst
    2KB
  • src
  • main.c
    5.6KB
  • timer.c
    653B
  • delay_ms.c
    121B
  • lcd.c
    3.5KB
  • PID.c
    1.2KB
  • ds18b20.c
    3.9KB
  • output
  • project.build_log.htm
    982B
  • delay_ms.obj
    1.3KB
  • project.plg
    3.1KB
  • delay_ms.__i
    142B
  • main.__i
    130B
  • lcd.obj
    3.5KB
  • project.lnp
    191B
  • ds18b20.__i
    139B
  • project.hex
    11.4KB
  • main.obj
    19KB
  • STARTUP.obj
    813B
  • lcd.__i
    127B
  • ds18b20.obj
    5.7KB
  • PID.obj
    6.1KB
  • PID.__i
    127B
  • project
    33.9KB
  • head
  • main.h
    1.2KB
  • timer.h
    154B
  • delay_ms.h
    424B
  • PID.h
    597B
  • lcd.h
    965B
  • ds18b20.h
    549B
  • PID_project.uvproj
    15.2KB
  • project.plg
    2.8KB
  • STARTUP.A51
    6.2KB
  • project_uvproj.bak
    14.6KB
  • PID_project.uvgui_HP.bak
    69.7KB
  • PID_project.uvopt
    8.3KB
  • project.uvopt
    59.1KB
  • PID_project.uvgui.Calvin
    74.1KB
  • project.uvgui_Forrest.bak
    137.5KB
  • project.uvgui.Forrest
    137.6KB
  • PID_project.uvgui.HP
    71KB
  • project_uvopt.bak
    59.1KB
内容介绍
#include <main.h> extern unsigned char time_value; extern bit flag; int PWM=0; int PWM_I,PWM_P; unsigned char time_value=0; bit flag; uint temp_m1=0; int temp_m=0; //温度放大100倍后的中转值 int set_temp=0; //设置温度*100 int i; sbit jiare=P1^3; sbit leique=P1^5; sbit wushi=P1^6; sbit fensh=P2^3; uchar flag1=0; void InitTimer0(void)//定时器0初始化 { TMOD = 0x01; TH0 = 0xEC;//定时5MS TL0 = 0x78; EA = 1; ET0 = 1; TR0 = 1; } void main()//主函数 { init();//初始化函数 pid_init (&temp_PID);//PID初始化 InitTimer0(); //定时器初始化 temp_PID.Proportion =10;// Set PID Coefficients 比率 temp_PID.Integral =8; //积分 temp_PID.Derivative =6; //导数 while(1) { temp_control();//控制按键函数 if((temp_m-set_temp>200)&&(flag==1)) { fensh=1; } else { fensh=0; } // if(time_value<PWM)//定时器自增值 // { // heatting=1;//加热 // jiare=0; // } // else // { // heatting=0;//停止加热 // jiare=1; // } // if(time_value==5) // { for(i=0;i<10;i++) //循环10次 { temp_m1=get_temp(Ds18b20ReadTemp()); } // if(time_value==30||time_value==60||time_value==90) //每150ms显示当前温度 // { display_real_tenp(temp_m1);//当前温度显示函数 // } // if(time_value==30) //每300ms进行一次温度转换 temp_m=unnormal_proccessing(temp_m1);//温度转换函数*100 // if(time_value==60)//当等于500ms时 // { if(set_temp-temp_m>100)//设置温度比当前温度大2.5度,全速加热 { PWM=PWM_MAX;//100 } else { PWM_I=pid_calc(&temp_PID,temp_m); PWM =PWM_I; if(PWM>=100)PWM=100; else if(PWM<=PWM_MIN) PWM=PWM_MIN; } if(temp_m>set_temp) { PWM=PWM_MIN; } // } if(time_value==60)//每600ms刷新一次PID显示 { PWM_P=PWM/2; LcdWriteCom(0x80+0X40+0x0C); LcdWriteData('0'+PWM_P/100); LcdWriteCom(0x80+0X40+0x0D); LcdWriteData('0'+PWM_P%100/10); LcdWriteCom(0x80+0X40+0x0E); LcdWriteData('0'+PWM_P%10); } } } void init()//初始化函数 { uint i,j; //函数初始化 LcdInit();//LCD初始化函数 Ds18b20Init(); //I/O口初始化 heatting=0;//不制热 //LCD初始化显示 LcdWriteCom(0x80);//第一行显示 j=strlen(num1); for(i=0; i<j; i++) { LcdWriteData(num1[i]); delay_ms(1); } LcdWriteCom(0x80+0x40);//第二行显示 j=strlen(num2); for(i=0; i<j; i++) { LcdWriteData(num2[i]); delay_ms(1); } LcdWriteCom(0x04); //关闭写一个指针加1 } uint get_temp(uint temp)//计算温度函数 { float tp; tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 return temp; } void display_real_tenp(uint temp)//实时温度显示函数 { uchar datas[] = {0, 0, 0, 0}; //定义数组 datas[0] = temp % 10000 / 1000; datas[1] = temp % 1000 / 100; datas[2] = temp % 100 / 10; datas[3] = temp % 10; LcdWriteCom(0x80+0x0a); //写地址 80表示初始地址 LcdWriteData('0'+datas[0]); //十位 LcdWriteCom(0x80+0x0b); //写地址 80表示初始地址 LcdWriteData('0'+datas[1]); //个位 LcdWriteCom(0x80+0x0d); //写地址 80表示初始地址 LcdWriteData('0'+datas[2]); //显示小数点 LcdWriteCom(0x80+0x0e); //写地址 80表示初始地址 LcdWriteData('0'+datas[3]); //显示小数点 } void temp_control()//控制温度上下限函数 { if(limit_choise==0)//选择按键 { delay_ms(5); if(limit_choise==0) { while(!limit_choise); flag1++; if(flag1>=2) { flag1=0; } } } // if(limit_choise_num==0)//正常显示 // { // LcdWriteCom(0x0c);//关闭光标 // // } // if(limit_choise_num==1)//调节上限温度 // { // LcdWriteCom(0x80+0X40+2); // LcdWriteCom(0x0f);//开启光标 if(increase_temperature==0)//增加温度 { delay_ms(5); if(increase_temperature==0) { while(!increase_temperature); up_limit_temp++; if(up_limit_temp>=100) { up_limit_temp=0; } //写入新数据 LcdWriteCom(0x80+0X40+0x03); LcdWriteData('0'+up_limit_temp/10); LcdWriteCom(0x80+0X40+0x04); LcdWriteData('0'+up_limit_temp%10); LcdWriteCom(0x80+0X40+2);//光标回写 } } if(reduce_temperature==0)//减少温度 { delay_ms(5); if(reduce_temperature==0) { while(!reduce_temperature); up_limit_temp--; if(up_limit_temp<0) { up_limit_temp=99; } //写入新数据 LcdWriteCom(0x80+0X40+0x03); LcdWriteData('0'+up_limit_temp/10); LcdWriteCom(0x80+0X40+0x04); LcdWriteData('0'+up_limit_temp%10); LcdWriteCom(0x80+0X40+2);//光标回写 } } // } set_temp=up_limit_temp*100;//设置时间扩大一百倍 temp_PID.SetPoint =set_temp; } int unnormal_proccessing(uint temp)//温度转换函数 { uchar datas[] = {0, 0, 0, 0}; //定义数组 int temp1=0; datas[0] = temp % 10000 / 1000; datas[1] = temp % 1000 / 100; datas[2] = temp % 100 / 10; datas[3] = temp % 10; temp1=datas[0]*1000+datas[1]*100+datas[2]*10+datas[3];//实际的温度乘以100 return temp1; } void Timer0Interrupt(void) interrupt 1 { TH0 = 0xEC;//定时5MS TL0 = 0x78; time_value++; //计数值+1 if(time_value<PWM)//定时器自增值 { heatting=1;//加热 jiare=0; } else { heatting=0;//停止加热 jiare=1; } if(time_value==100) //加到50次即1秒 { time_value=0; } // if(time_value==10) // { // temp_m1=get_temp(Ds18b20ReadTemp()); // } }
评论
    相关推荐
    • PID恒温控制器.rar
      制作一个简易的恒温控制器学习PID。 使用到ds18b20 5V加热器(TB有卖) 场效应管IRF 640N用于开通和关断加热器。 设置预设值,通过PID不断矫正加热器输出,达到预设温度
    • 模糊PID温度控制.zip
      基于STM32F103的PID温度控制,未调整PID值
    • 基于PID温度控制手册
      基于温度控制PID算法,涉及到pid控制算法在温度控制的应用,有具体的手册分析,讲解比较清楚,个人认为还不错,来与大家分享一下!
    • pid控制器代码matlab-ArduinoThermoControlWeb:通过Arduino在Web上进行温度控制
      pid控制器代码matlab ArduinoThermoControlWeb 一个烧瓶服务器,应简化我们的温度控制的日志记录。 该网站假定Arduino通过串行设备连接。 目前,我们必须具备以下能力: 添加一些arduinos。 在概述中给出设定点和...
    • PID控制器_温度仿真控制_Delphi.rar
      采用Delphi编写的一个PID(比例、积分、微分)温度仿真控制器程序,程序建立了温控系统的开环模型,可以手动控制加热,也可以采用PID自动控制温度PID参数可以设置。
    • 温度控制器
      利用C语言描写,关于温度控制器,其中涉及PID算法的内容
    • 基于调压模块的PID温度控制器设计
      本文件包含了Proteus仿真原理图,以及protel原理图及PCB板,同时包括了用keil编写c语言实现代码,内容详细,丰富。
    • PID温度控制。.zip
      任务:利用单片机和可控硅电路实现水温控制系统,将测量温度值显示于四位数码管上,通过可控硅控制加热器件,并且能够设置温度值的功能。 要求:(1)查阅相关文献,熟悉课题背景、任务; (2)深入学习51系列单片机...
    • 温度控制系统设计.rar
      通过温度控制系统能够实现对炉温的控制,代码详实,注释充足。
    • Proteus7.12.rar
      Proteus7.12完美破解版.rar电路仿真软件很好用可以仿真单片数字模拟电路