温度控制器程序

合集下载

单片机温控程序

单片机温控程序

单片机温控程序
单片机温控程序是一种用于控制温度的程序,它可以实现对温度的监测和控制。

通过使用单片机及其相关的传感器和执行器,可以实现对温度的精确控制,从而满足不同场景下的温度需求。

在温控程序中,首先需要使用温度传感器来检测当前的环境温度。

传感器将实时采集到的温度值转换成数字信号,并通过单片机进行处理。

单片机会根据预设的温度范围,判断当前温度是否处于合理范围内。

当温度超过预设范围时,单片机将启动执行器,通过控制电磁阀或者风扇等设备,调节环境温度。

当温度下降到合理范围内时,单片机会停止执行器的工作,从而实现温度的控制。

在温控程序中,关键是确定合理的温度范围和控制策略。

温度范围的确定需要根据具体的场景和需求来进行调整,以确保温度的稳定性和安全性。

控制策略的选择也很重要,可以根据不同的情况采用开环控制或闭环控制等不同的方式。

除了温度控制外,温控程序还可以实现其他功能,如温度显示、报警等。

通过在单片机上添加合适的显示模块和报警器,可以实现对温度的实时显示和异常温度的报警功能,从而提高温度监测的效果和准确性。

单片机温控程序是一种重要的技术应用,可以广泛应用于各种领域,
如家庭、工业、医疗等。

通过合理的温度控制,可以提高生活和工作环境的舒适度和安全性,为人们的生活和工作带来便利和保障。

回流焊128段程序温度控制器使用说明

回流焊128段程序温度控制器使用说明

回流焊128段程序温度控制器使用说明一.安装:1.在电烤箱后箱板中间部分分左右中开三个热电偶感温头安装孔,注意需要离内部烤架保持30~45mm高度,以免触碰到需要焊接的元件,上下热电偶离中间烤架距离也应当一致,并且注意使左右孔离左右边缘保持45到70mm,以便测量监督烤箱内部温度的均匀度。

2.安装热电偶感温头,理顺热电偶导线,勿使其交叉,因为热电偶导线会互相干扰,影响温度测量的准确。

3.把电烤箱插头插入温度控制器输出插座,输入电源插座线接220V电源,检查无误,既可开机。

二.运行加热温度控制方式操作步骤:按电源按键开机===》选择曲线号===》运行(开始加热温度控制)。

(注意:开机选择控制曲线以后,当需要改换其它曲线,需要关机,再重新开机,然后选择新曲线。

)三.温度曲线调整设置操作步骤:按电源按键开机==》选择曲线号==》设置==》调整温度与秒间隔==》保存退出。

1.选择D+,D-移动到需要设置的温度段;2.按上下三角℃+,℃-调整温度高低,按S+,S-调整秒间隔,这样设置好的曲线线.3秒间隔与4秒间隔是通用的.烤箱速度快的就用 3秒间隔,一般速度的用4秒间隔,不需要重新设置曲线总温度控制流程时间=128* S秒间隔,秒间隔最小值1秒,总控制流程最小时间128秒。

秒间隔最大值240秒,总控制流程最大时间30720秒。

3.按恢复默认键,恢复默认的温度曲线,默认的秒间隔4.刷新,作用是在调整温度高低时(℃+,℃-),去掉调整过程的竖线柱,使曲线清晰显示。

5.保存退出。

保存设置好的温度曲线。

(注意:在设置模式时,不按保存退出键,无法按下开始键)四.注意事项1.热电偶分正负极,拆卸安装注意查看机盒后面热电偶插座标签标字。

2.热电偶对感应敏感,注意理顺热电偶的导线,并保持一定间隔,不要使其交叉,否则温度值会显示异常,3.内部继电器的控制电压输出为220V,电流为10A,如果所控制电器功率过大超过额定值,可用内部控制电源输出外接更大的继电器进行控制。

DS18B20智能温度控制器(附软件程序)

DS18B20智能温度控制器(附软件程序)

DS18B20智能温度控制器DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。

一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

DS18B20、 DS1822 “一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。

DS1822的精度较差为± 2°C 。

现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。

适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。

与前一代产品不同,新的产品支持3V~5.5V 的电压范围,使系统设计更灵活、方便。

而且新一代产品更便宜,体积更小。

DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。

可选更小的封装方式,更宽的电压适用范围。

分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。

DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。

省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。

继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。

DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。

DS18B20的内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

温度控制的PID算法的C语言程序

温度控制的PID算法的C语言程序

我的题目是:基于PID算法的温度控制系统89C51单片机,通过键盘输入预设值,与DS18B20测得的实际值做比较,然后驱动制冷或加热电路。

用keil C语言来实现PID的控制。

最佳答案//PID算法温控C语言2008-08-17 18:58#include<reg51.h>#include<intrins.h>#include<math.h>#include<string.h>struct PID {unsigned int SetPoint; // 设定目标 Desired Valueunsigned int Proportion; // 比例常数 Proportional Constunsigned int Integral; // 积分常数 Integral Constunsigned int Derivative; // 微分常数 Derivative Constunsigned int LastError; // Error[-1]unsigned int PrevError; // Error[-2]unsigned int SumError; // Sums of Errors};struct PID spid; // PID Control Structureunsigned int rout; // PID Response (Output)unsigned int rin; // PID Feedback (Input)sbit data1=P1^0;sbit clk=P1^1;sbit plus=P2^0;sbit subs=P2^1;sbit stop=P2^2;sbit output=P3^4;sbit DQ=P3^3;unsigned char flag,flag_1=0;unsigned char high_time,low_time,count=0;//占空比调节参数unsigned char set_temper=35;unsigned char temper;unsigned char i;unsigned char j=0;unsigned int s;/*********************************************************** 延时子程序,延时时间以12M晶振为准,延时时间为30us×time***********************************************************/ void delay(unsigned char time){unsigned char m,n;for(n=0;n<time;n++)for(m=0;m<2;m++){}}/*********************************************************** 写一位数据子程序***********************************************************/ void write_bit(unsigned char bitval){EA=0;DQ=0; /*拉低DQ以开始一个写时序*/if(bitval==1){_nop_();DQ=1; /*如要写1,则将总线置高*/}delay(5); /*延时90us供DA18B20采样*/DQ=1; /*释放DQ总线*/_nop_();_nop_();EA=1;}/*********************************************************** 写一字节数据子程序***********************************************************/ void write_byte(unsigned char val){unsigned char i;unsigned char temp;EA=0; /*关中断*/TR0=0;for(i=0;i<8;i++) /*写一字节数据,一次写一位*/{temp=val>>i; /*移位操作,将本次要写的位移到最低位*/temp=temp&1;write_bit(temp); /*向总线写该位*/}delay(7); /*延时120us后*/// TR0=1;EA=1; /*开中断*/}/*********************************************************** 读一位数据子程序***********************************************************/ unsigned char read_bit(){unsigned char i,value_bit;EA=0;DQ=0; /*拉低DQ,开始读时序*/_nop_();_nop_();DQ=1; /*释放总线*/for(i=0;i<2;i++){}value_bit=DQ;EA=1;return(value_bit);}/*********************************************************** 读一字节数据子程序***********************************************************/ unsigned char read_byte(){unsigned char i,value=0;EA=0;for(i=0;i<8;i++){if(read_bit()) /*读一字节数据,一个时序中读一次,并作移位处理*/ value|=0x01<<i;delay(4); /*延时80us以完成此次都时序,之后再读下一数据*/}EA=1;return(value);}/***********************************************************复位子程序***********************************************************/ unsigned char reset(){unsigned char presence;EA=0;DQ=0; /*拉低DQ总线开始复位*/delay(30); /*保持低电平480us*/DQ=1; /*释放总线*/delay(3);presence=DQ; /*获取应答信号*/delay(28); /*延时以完成整个时序*/EA=1;return(presence); /*返回应答信号,有芯片应答返回0,无芯片则返回1*/ }/***********************************************************获取温度子程序***********************************************************/void get_temper(){unsigned char i,j;do{i=reset(); /*复位*/}while(i!=0); /*1为无反馈信号*/ i=0xcc; /*发送设备定位命令*/ write_byte(i);i=0x44; /*发送开始转换命令*/ write_byte(i);delay(180); /*延时*/do{i=reset(); /*复位*/}while(i!=0);i=0xcc; /*设备定位*/write_byte(i);i=0xbe; /*读出缓冲区内容*/write_byte(i);j=read_byte();i=read_byte();i=(i<<4)&0x7f;s=(unsigned int)(j&0x0f);s=(s*100)/16;j=j>>4;temper=i|j; /*获取的温度放在temper中*/}/*================================================================= ===================================Initialize PID Structure=================================================================== ==================================*/void PIDInit (struct PID *pp){memset ( pp,0,sizeof(struct PID));}/*================================================================= ===================================PID计算部分=================================================================== ==================================*/unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ){unsigned int dError,Error;Error = pp->SetPoint - NextPoint; // 偏差pp->SumError += Error; // 积分dError = pp->LastError - pp->PrevError; // 当前微分pp->PrevError = pp->LastError;pp->LastError = Error;return (pp->Proportion * Error//比例+ pp->Integral * pp->SumError //积分项+ pp->Derivative * dError); // 微分项}/***********************************************************温度比较处理子程序***********************************************************/ compare_temper(){unsigned char i;if(set_temper>temper){if(set_temper-temper>1){high_time=100;low_time=0;}else{for(i=0;i<10;i++){ get_temper();rin = s; // Read Inputrout = PIDCalc ( &spid,rin ); // Perform PID Interation}if (high_time<=100)high_time=(unsigned char)(rout/800); elsehigh_time=100;low_time= (100-high_time);}}else if(set_temper<=temper){if(temper-set_temper>0){high_time=0;low_time=100;}else{for(i=0;i<10;i++){ get_temper();rin = s; // Read Inputrout = PIDCalc ( &spid,rin ); // Perform PID Interation }if (high_time<100)high_time=(unsigned char)(rout/10000);elsehigh_time=0;low_time= (100-high_time);}}// else// {}}/***************************************************** T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期******************************************************/ void serve_T0() interrupt 1 using 1{if(++count<=(high_time))output=1;else if(count<=100){output=0;}elsecount=0;TH0=0x2f;TL0=0xe0;}/***************************************************** 串行口中断服务程序,用于上位机通讯******************************************************/void serve_sio() interrupt 4 using 2 {/* EA=0;RI=0;i=SBUF;if(i==2){while(RI==0){}RI=0;set_temper=SBUF;SBUF=0x02;while(TI==0){}TI=0;}else if(i==3){TI=0;SBUF=temper;while(TI==0){}TI=0;}EA=1; */}void disp_1(unsigned char disp_num1[6]) {unsigned char n,a,m;for(n=0;n<6;n++){// k=disp_num1[n];for(a=0;a<8;a++){clk=0;m=(disp_num1[n]&1);disp_num1[n]=disp_num1[n]>>1;if(m==1)data1=1;elsedata1=0;_nop_();clk=1;_nop_();}}}/***************************************************** 显示子程序功能:将占空比温度转化为单个字符,显示占空比和测得到的温度******************************************************/ void display(){unsigned char codenumber[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};unsigned char disp_num[6];unsigned int k,k1;k=high_time;k=k%1000;k1=k/100;if(k1==0)disp_num[0]=0;elsedisp_num[0]=0x60;k=k%100;disp_num[1]=number[k/10];disp_num[2]=number[k%10];k=temper;k=k%100;disp_num[3]=number[k/10];disp_num[4]=number[k%10]+1;disp_num[5]=number[s/10];disp_1(disp_num);}/*********************************************************** 主程序***********************************************************/ main(){unsigned char z;unsigned char a,b,flag_2=1,count1=0;unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2};TMOD=0x21;TH0=0x2f;TL0=0x40;SCON=0x50;PCON=0x00;TH1=0xfd;TL1=0xfd;PS=1;EA=1;EX1=0;ET0=1;ES=1;TR0=1;TR1=1;high_time=50;low_time=50;PIDInit ( &spid ); // Initialize Structure spid.Proportion = 10; // Set PID Coefficients spid.Integral = 8;spid.Derivative =6;spid.SetPoint = 100; // Set PID Setpoint while(1){if(plus==0){EA=0;for(a=0;a<5;a++)for(b=0;b<102;b++){} if(plus==0){set_temper++;flag=0;}}else if(subs==0) {for(a=0;a<5;a++)for(b=0;a<102;b++){} if(subs==0){set_temper--;flag=0;}}else if(stop==0) {for(a=0;a<5;a++)for(b=0;b<102;b++){} if(stop==0){flag=0;break;}EA=1;}get_temper();b=temper;if(flag_2==1)a=b;if((abs(a-b))>5) temper=a;elsetemper=b;a=temper;flag_2=0;if(++count1>30) {display();count1=0;}compare_temper(); }TR0=0;z=1;while(1){EA=0;if(stop==0){for(a=0;a<5;a++)for(b=0;b<102;b++){} if(stop==0)disp_1(phil);// break;}EA=1;}}//DS18b20 子程序#include <REG52.H>sbit DQ=P2^1; //定义端口typedef unsigned char byte;typedef unsigned int word;//延时void delay(word useconds){for(;useconds>0;useconds--);}//复位byte ow_reset(void){byte presence;DQ=0; //DQ低电平delay(29); //480us DQ=1; //DQ高电平delay(3); //等待presence=DQ; //presence信号delay(25);return(presence);} //0允许,1禁止//从1-wire 总线上读取一个字节byte read_byte(viod){byte i;byte value=0;for (i=8;i>0;i--){value>>=1;DQ=0;DQ=1;delay(1);if(DQ)value|=0x80;delay(6);}return(value);}//向1-wire总线上写一个字节void write_byte(char val){byte i;for (i=8;i>0;i--) //一次写一个字节{DQ=0;DQ=val&0x01;delay(5);DQ=1;val=val/2;}delay(5);}//读取温度char Read_Temperature(void) {union{byte c[2];int x;}temp;ow_reset();write_byte(0xcc);write_byte(0xBE);temp.c[1]=read_byte(); temp.c[0]=read_byte();ow_reset();write_byte(0xCC);write_byte(0x44);return temp.x/2;}参考资料:你把这两个程序组合就可以了图1 模拟PID 控制系统原理图PID 控制器的控制规律可以描述为:(1)比例(P)控制能迅速反应误差,从而减小稳态误差。

C语言编写PID温度控制器程序

C语言编写PID温度控制器程序

C语言编写PID温度控制器程序姓名:况武(07421236)班级:自二系别:通控系#include <stdio.h>#include<math.h>struct _pid {int pv; /*integer that contains the process value*/int sp; /*integer that contains the set point*/float integral;float pgain;float igain;float dgain;int deadband;int last_error;};struct _pid warm,*pid;int process_point, set_point,dead_band;float p_gain, i_gain, d_gain, integral_val,new_integ;;/*------------------------------------------------------------------------pid_initDESCRIPTION This function initializes the pointers in the _pid structureto the process variable and the setpoint. *pv and *sp areinteger pointers.------------------------------------------------------------------------*/void pid_init(struct _pid *warm, int process_point, int set_point){struct _pid *pid;pid = warm;pid->pv = process_point;pid->sp = set_point;}/*------------------------------------------------------------------------pid_tuneDESCRIPTION Sets the proportional gain (p_gain), integral gain (i_gain),derivitive gain (d_gain), and the dead band (dead_band) ofa pid control structure _pid.------------------------------------------------------------------------*/void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band){pid->pgain = p_gain;pid->igain = i_gain;pid->dgain = d_gain;pid->deadband = dead_band;pid->integral= integral_val;pid->last_error=0;}/*------------------------------------------------------------------------pid_setintegDESCRIPTION Set a new value for the integral term of the pid equation.This is useful for setting the initial output of thepid controller at start up.------------------------------------------------------------------------*/void pid_setinteg(struct _pid *pid,float new_integ){pid->integral = new_integ;pid->last_error = 0;}/*------------------------------------------------------------------------pid_bumplessDESCRIPTION Bumpless transfer algorithim. When suddenly changingsetpoints, or when restarting the PID equation after anextended pause, the derivative of the equation can causea bump in the controller output. This function will helpsmooth out that bump. The process value in *pv shouldbe the updated just before this function is used.温度PID控制的C语言程序?------------------------------------------------------------------------*/void pid_bumpless(struct _pid *pid){pid->last_error = (pid->sp)-(pid->pv);}/*------------------------------------------------------------------------pid_calcDESCRIPTION Performs PID calculations for the _pid structure *a. This function uses the positional form of the pid equation, and incorporates an integral windup prevention algorithim. Rectangular integration is used, so this function must be repeated on a consistent time basis for accurate control.RETURN V ALUE The new output value for the pid loop.USAGE #include "control.h"*/float pid_calc(struct _pid *pid){int err;float pterm, dterm, result, ferror;err = (pid->sp) - (pid->pv);if (abs(err) > pid->deadband){ferror = (float) err; /*do integer to float conversion only once*/pterm = pid->pgain * ferror;if (pterm > 100 || pterm < -100){pid->integral = 0.0;}else{pid->integral += pid->igain * ferror;if (pid->integral > 100.0){pid->integral = 100.0;}else if (pid->integral < 0.0) pid->integral = 0.0;}dterm = ((float)(err - pid->last_error)) * pid->dgain;result = pterm + pid->integral + dterm;}else result = pid->integral;pid->last_error = err;return (result);}void main(void){float display_value;int count=0;pid = &warm;// printf("Enter the values of Process point, Set point, P gain, I gain, D gain \n");// scanf("%d%d%f%f%f", &process_point, &set_point, &p_gain, &i_gain, &d_gain);process_point = 30;set_point = 40;p_gain = (float)(5.2);i_gain = (float)(0.77);d_gain = (float)(0.18);dead_band = 2;integral_val =(float)(0.01);printf("The values of Process point, Set point, P gain, I gain, D gain \n");printf(" %6d %6d %4f %4f %4f\n", process_point, set_point, p_gain, i_gain, d_gain);printf("Enter the values of Process point\n");while(count<=20){scanf("%d",&process_point);pid_init(&warm, process_point, set_point);pid_tune(&warm, p_gain,i_gain,d_gain,dead_band);pid_setinteg(&warm,0.0); //pid_setinteg(&warm,30.0);//Get input value for process pointpid_bumpless(&warm);// how to display outputdisplay_value = pid_calc(&warm);printf("%f\n", display_value);//printf("\n%f%f%f%f",warm.pv,warm.sp,warm.igain,warm.dgain); count++;}}。

PID温度控制的PLC程序设计

PID温度控制的PLC程序设计

PID温度控制的PLC程序设计PID(比例-积分-微分)温度控制是一种常用的控制方法,可以通过PLC(可编程逻辑控制器)实现。

本文将详细介绍PID温度控制的PLC程序设计过程。

1.确定控制系统需求:首先要确定所需的控制系统的基本要求,包括控制温度范围、精度要求、控制方式等。

2.确定传感器和执行机构:选择合适的温度传感器和执行机构,例如热电偶或热电阻作为温度传感器,控制阀门或加热器作为执行机构。

3.确定控制算法:PID控制算法是一种经典的温度控制方法,可在PLC中实现。

PID控制算法由比例、积分和微分三个参数组成,可以通过自整定或手动调整获得最佳参数值。

4.确定控制模式:根据实际需求,选择合适的控制模式,比如开环控制、闭环控制或自适应控制。

对于温度控制,一般采用闭环控制。

5. PLC软件设计:根据控制系统需求和算法确定的参数,设计PLC 软件。

PLC软件可以使用Ladder Diagram(梯形图)或Function Block Diagram(功能块图)等语言编程。

下面是一个基本的PID温度控制的PLC程序设计示例(以Ladder Diagram为例):```ladder====主程序====-,----[]----[]----[]----()PID----[]----]----[]----[]----,[]----温度输入设置温度温度差系数K----[+]=--------]--------]-----------温度设定温度差积分控制值----[/K]------]--------------------------[]----------------[+]=---------控制值累计量----[]----[]----[]----()KpKiKd```上述Ladder Diagram中,PID控制算法的三个参数Kp、Ki和Kd通过输入设置,通过调整这些参数可以改善控制系统的响应速度和稳定性。

plc200温度编程

plc200温度编程

plc200温度编程
PLC200温度编程是指使用PLC200控制器进行温度控制的编程。

PLC200是一种可编程逻辑控制器,用于自动化控制系统
中的温度监测和控制。

它具有强大的计算能力和多功能输入输出接口,可以实现精确的温度调节和控制。

在PLC200温度编程中,首先需要定义温度传感器的输入信号。

将温度传感器连接到PLC200的输入接口,并配置相应的输入
参数。

然后,根据温度的实际变化情况,编写逻辑控制程序。

在编程中,可以设置温度上下限的阈值,以便在温度超过或低于指定范围时触发报警或控制动作。

还可以根据温度变化的速度调整控制动作的频率。

同时,还可以设置定时器和计数器,实现定时控制和计数控制。

PLC200温度编程还可以与其他控制设备和传感器进行集成,
实现更复杂的温度控制和调节功能。

例如,可以与电磁阀、电加热器等设备配合使用,实现温度的精确调节和控制。

总而言之,PLC200温度编程是一种利用PLC200控制器进行
温度控制的编程方式,通过编写逻辑控制程序,实现对温度传感器的监测和控制,实现温度的精确调节和控制。

由plc来控制温度的方法

由plc来控制温度的方法

由plc来控制温度的方法PLC(Programmable Logic Controller,可编程逻辑控制器)是一种用于控制工厂设备及工业自动化流程的计算机软硬件系统。

在工业领域,PLC广泛应用于各种制造过程中的自动化控制,其中包括温度控制。

PLC可以通过读取传感器信号、执行控制操作来控制温度。

以下是一种基本的由PLC来控制温度的方法:1. 确定温度控制器需要的输入与输出信号:在控制环路中,传感器测量的温度值通过输入信号送入PLC,PLC通过输出信号送出控制信号。

2. 编写PLC程序:PLC程序是用来实现温度控制的核心部分。

程序将读取输入信号,并根据预设的控制算法,输出相应的控制信号。

程序应该考虑到温度控制的各种因素,比如设定温度、上下限温度、控制加热时间、升降温速度等等。

3. PLC连接控制器:接下来,PLC需要连接温度控制器。

温度控制器将输出信号发送给加热设备,从而控制温度。

PLC需要将自己的输出信号绑定到温度控制器上,以实现对温度的控制。

4. 调试PLC程序:PLC程序的调试非常重要。

在调试过程中,需要注意使用模拟信号模拟传感器信号,模拟控制器输出,并读取模拟的信号以判断程序的正确性。

5. 完善自动化控制系统:最后,将自动化控制系统完善,使其其它相关设备能够自动地工作。

这包括和其他设备、机械等进行接口连接。

总体来说,由PLC来控制温度是一种高效且可靠的方法。

通过编写PLC程序,能够实现对温度的实时控制,使温度保持在设定的范围内。

这种方法在工业自动化流程中得到了广泛应用,特别是在需要对温度进行精细控制的生产过程中效果尤为明显。

虽然由PLC来控制温度在实践中已经被证明是一种相对高效的方法,但仍有一些要注意的事项:首先,由于温度控制涉及到很多因素,程序编写和调试过程需要耐心而细致的操作;其次,需要注意漏电等安全问题,确保操作人员的安全。

最后,随着技术的进步和工业自动化的深入发展,如何将PLC技术能够不断地提高工业生产的效率和质量,还需要我们在实践中不断地思考和探索。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

温度控制器程序 Jenny was compiled in January 2021//PT100自身温度范围#define M_temper_MIN -200 //最低温度#define M_temper_MAX 500 //最高温度//CPU引脚定义#define P_LED P0sbit LED_S1 = P2 ^ 0; //LED1位选sbit LED_S2 = P2 ^ 1; //LED2位选sbit LED_S3 = P2 ^ 2; //LED3位选sbit LED_S4 = P2 ^ 3; //LED4位选sbit KEY_S1 = P1 ^ 0; //上下限温度设置sbit KEY_S2 = P1 ^ 1; //温度加sbit KEY_S3 = P1 ^ 2; //温度减//全局变量寄存器uchar M_LED1, M_LED2, M_LED3, M_LED4; //4位LED显示寄存器uchar LED_DISP_TAB[] = //LED编码表{0X3f, 0X06, 0X5b, 0X4f, 0X66,0X6d, 0X7d, 0X07, 0X7f, 0X6f, //0-90X40, 0X23, 0X1c, 0X58 //字符: - n u c};uchar Set_count; //温度设置按钮计数uchar T0_count; //T0定时中断计数uint T1_count; //T1定时中断计数char M_temper_up; //温度上限char M_temper_down; //温度下限char M_temper_AI; //设置中温度char M_temper_conver; //当前温度bit B_set,B_set_AI; //温度设置标志bit B_set_T0,B_set_T1; //定时器中断标志//函数声明void T1int_init();/* 定时器T1初始化:设置工作方式赋初值开启中断 */ void T0int_init();/* 定时器T0初始化:设置工作方式赋初值开启中断 */ void Set_temper();/*设置上下限温度:按键次数=1:显示上限温度并处于操作状态按键次数=2:显示下限温度并处于操作状态按键次数=3:保存设置值并退出*/ void Inc_temper();/*提高设置的温度 */ void Dec_temper();/*降低设置的温度 */ void LED_data_BCD(char Disp_dat);/*数码管显示温度 */ void PT100_delay(uint count);/* PT100延时程序 */void PT100_reset(void);/*PT100复位初始程序:根据PT100要求对其进行复位初始控制 */bit PT100_readbit(void) ;/*PT100位读子程序:从PT100取出一位数据 */uchar PT100_readbyte(void);/*PT100字节读子程序:读出的一字节数据并返回数据值 */void PT100_writebyte(uchar dat);/*PT100字节写子程序:将输入参数值写入PT100 */void PT100_change(void); //启动PT100温度转换uchar PT100_Gettemper(void); /*读取PT100温度数据:单线方式读取PT100转换的温度数据,并返回处理后的温度值 */void Delay_ms(uint count); //延时子程序:延时 count (ms)void main() {uchar M_temper_curr;SP=0x50; //堆栈起始地址M_temper_up =100; //初始温度上下限M_temper_down=0;Delay_ms(500);T0int_init(); //T0 T1初始化T1int_init();while(1){if (B_set_T0) //T0定时读取温度标志{EA=0; //关总中断B_set_T0=0;if(!B_set) //上下限设置状态时,取消温度读取 {PT100_change(); //读取温度M_temper_curr=PT100_Gettemper();M_temper_conver=(M_temper_curr > 126 (127-M_temper_curr):M_temper_curr);//转换正负温度LED_data_BCD(M_temper_conver);//转换LED显示}EA=1;}if (B_set_T1) //T1定时LED显示扫描标志 {TR1=0;B_set_T1=0;++T1_count;switch (T1_count) //依次显示4位LED{ case 1:LED_S4 = 1;P_LED = LED_DISP_TAB[M_LED1];LED_S1 = 0;break;case 2:LED_S1 = 1;P_LED = LED_DISP_TAB[M_LED2]; LED_S2 = 0;break;case 3:LED_S2 = 1;P_LED = LED_DISP_TAB[M_LED3]; LED_S3 = 0;break;case 4:LED_S3 = 1;P_LED = LED_DISP_TAB[M_LED4]; LED_S4 = 0;T1_count = 0;break;}TR1=1; //开T1定时器}if((M_temper_conver>M_temper_down)&&(M_temper_conver<M_temper_up)) { //温度在上下限范围内BUZZ=B_BUZZ_OFF;RED_ALARM=B_RED_OFF;GREEN_ALARM=B_GREEN_OFF;}else{ BUZZ=B_BUZZ_ON;if(M_temper_conver<M_temper_down)RED_ALARM=B_RED_ON; //低于下限温度elseGREEN_ALARM=B_GREEN_ON; //高于上限温度 }if (!KEY_S1) //按键检测{Set_temper(); //设置温度Delay_ms(200);}if (B_set){if (!KEY_S2){Inc_temper(); //温度加Delay_ms(200);}if (!KEY_S3){Dec_temper(); //温度减Delay_ms(200);}}}}void Set_temper() //设置温度{++Set_count;B_set = 1; //设置标志 if (Set_count == 1) //设置上限 {B_set_AI = 0; LED_data_BCD(M_temper_up); M_temper_AI = M_temper_up; //将原上限温度取出}else if (Set_count == 2) //设置下限{B_set_AI = 1;M_temper_up = M_temper_AI; //存入新的上限温度LED_data_BCD(M_temper_down);M_temper_AI = M_temper_down; //将原下限温度取出 }else{ //确认退出B_set = 0;Set_count = 0;LED_data_BCD(M_temper_conver);M_temper_down = M_temper_AI; //存入新的下限温度 }}void Inc_temper() //温度加{if (B_set_AI) //判断当前是设置上限(0)还是下限(1) {if ((M_temper_AI <M_temper_MAX) && (M_temper_AI <M_temper_up)){M_temper_AI++;} //不能加到上线温度和温度范围 }else{if (M_temper_AI <M_temper_MAX){M_temper_AI++;}} LED_data_BCD(M_temper_AI);}void Dec_temper() //温度减{if (B_set_AI) //判断当前是设置上限(0)还是下限(1) {if (M_temper_AI > M_temper_MIN){M_temper_AI--;}}else{if ((M_temper_AI > M_temper_MIN) && (M_temper_AI > M_temper_down)){M_temper_AI--;}}LED_data_BCD(M_temper_AI);}void PT100_delay(uint count) //PT100特定延时{uint i;while(count){i=200;while(i>0)i--;count--;}}void PT100_reset(void) //PT100复位初始{ uint i;DQ=0;i=103;while(i>0)i--;DQ=1;i=4;while(i>0)i--;}bit PT100_readbit(void) //PT100位读子程序{uint i;bit dat;DQ=1;_nop_();DQ=0;i++;DQ=1;i++;i++;dat=DQ;i=8;while(i>0)i--;return (dat);}uchar PT100_readbyte(void) //PT100字节读子程序{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=PT100_readbit();dat=(j<<7)|(dat>>1); //把读取的数据一位一位放进去 } return(dat);}void PT100_writebyte(uchar dat) //PT100字节写子程序{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //write 1{DQ=0;i++;i++;DQ=1;i=8;while(i>0)i--;}else{DQ=0; //write 0i=8;while(i>0)i--;DQ=1;i++;i++;}}}void PT100_change(void) //启动PT100温度转换{PT100_reset();PT100_delay(1);PT100_writebyte(0xcc); PT100_writebyte(0x44); }uchar PT100_Gettemper() //读取PT100温度数据{uint temp;uchar M_temper_L=0,M_temper_H=0;PT100_reset();PT100_delay(1);PT100_writebyte(0xcc);PT100_writebyte(0xbe);M_temper_L=PT100_readbyte();M_temper_H=PT100_readbyte();temp=M_temper_H; //温度数据处理temp<<=8;temp=temp|M_temper_L;if (M_temper_H>0xf0) //正(0)负(1)温度值{temp=((0x1000-(temp&0x0fff))/16)+127; //计算温度 }else{temp=temp/16;}M_temper_H=temp;return M_temper_H;}void LED_data_BCD(char Disp_dat) //显示数据LED编码处理{if (Disp_dat <0) //负温度{ M_LED1 = 0X0a; // 调用第10个M_LED2 = (0-Disp_dat) / 10;M_LED3 = (0-Disp_dat) % 10;}else{M_LED1 = Disp_dat / 100; //正温度M_LED2 = (Disp_dat % 100) / 10;M_LED3 = (Disp_dat % 100) % 10;}if (B_set) //设置状态时显示字符{if (B_set_AI){M_LED4 = 0x0c; }else{M_LED4 = 0x0b; }}else{M_LED4 = 0x0d;}}void T0int_init() //定时器T0初始化{TMOD = 0X11;TH0 = (65536-XTAL/12*T0_TIMER) / 256;TL0 = (65536-XTAL/12*T0_TIMER) % 256; EA = 1; ET0 = 1;TR0 = 1;}void T1int_init() //定时器T1初始化{TMOD = 0X11;TH1 = (65536-XTAL/12*T1_TIMER) / 256;TL1 = (65536-XTAL/12*T1_TIMER) % 256;EA = 1;ET1 = 1;TR1 = 1;}void Delay_ms(uint count) //延时 count (ms){uint i;while(--count>0){for (i = 0; i < 125; i++);}}void Timer0() interrupt 1 using 1 //T0定时器中断服务程序{if(++T0_count>T0_TIMER_S);{ B_set_T0=1;T0_count=0;}TH0 = (65536-XTAL/12*T0_TIMER) / 256;TL0 = (65536-XTAL/12*T0_TIMER) % 256;TF0=0;}void Timer1() interrupt 3 using 1 //T0定时器中断服务程序{ B_set_T1=1;TH1 = (65536-XTAL/12*T1_TIMER) / 256;TL1 = (65536-XTAL/12*T1_TIMER) % 256;TF1=0;}。

相关文档
最新文档