温度控制C程序

合集下载

模糊PID控制温控系统设计C语言程序代码

模糊PID控制温控系统设计C语言程序代码

模糊PID控制温控系统设计C语言程序代码介绍本文介绍了使用模糊PID控制方法来设计温控系统的C语言程序代码。

本温控系统使用传感器读取室内温度,然后根据读取的数值对应调整冷风机的风速和加热器的加热时间,从而控制室内温度达到一个设定值。

系统设计本温控系统采用模糊PID控制方法,具体实现流程如下:1.根据设定温度和当前室内温度计算出误差值2.使用模糊控制方法将误差值转化为温度调节量3.根据模糊控制输出的温度调节量计算出PID控制器的输出4.根据PID控制器的输出调节冷风机的风速和加热器的加热时间系统设计中需要使用的传感器,冷风机和加热器的具体型号及参数需要根据实际情况进行选择。

此处不做详细说明。

程序代码实现以下代码实现了上述系统设计,包括模糊控制和PID控制。

// 温控系统C语言程序代码#include<stdio.h>#include<stdlib.h>// 模糊控制double GetTemperatureByFuzzy(double error){double delta = 0.5; // 设定的温度调节步长double result = 0;if (error <= -5){result = 1;}else if (error > -5 && error < 0){result = (error + 5) / 5.0;}else if (error >= 0 && error < 5){result = (5 - error) / 5.0;}else{result = 0;}return result * delta;}// PID控制double GetTemperatureByPID(double error, double lastError, double integ ral){double Kp = 0.5; // 比例系数double Ki = 0.01; // 积分系数double Kd = 0.1; // 微分系数double deltaT = 0.1; // 采样时间double derivate = (error - lastError) / deltaT;double result = Kp * error + Ki * integral + Kd * derivate;return result;}// 主函数int main(){double setTemp = 25; // 设定温度double curTemp = 24; // 当前温度,需要从传感器读取double lastError = 0; // 上一次的误差值double integral = 0; // 积分项while (1){double error = setTemp - curTemp; // 计算当前误差值double fuzzyTemp = GetTemperatureByFuzzy(error); // 模糊控制integral += error; // 更新积分项double pidTemp = GetTemperatureByPID(error, lastError, integra l); // PID控制lastError = error; // 更新上一次误差值// 根据pidTemp和fuzzyTemp调节冷风机的风速和加热器的加热时间,省略// 读取传感器更新当前温度,省略// curTemp = GetCurTemp();// 采样时间,省略// sleep(1);}}本文介绍了使用模糊PID控制方法来设计温控系统的C语言程序代码。

温度控制的PID算法及C程序实现

温度控制的PID算法及C程序实现

本文档如对你有帮助,请帮忙下载支持!温度控制与PID 算法温度控制与PID 算法j 较为复杂,下面结合实际浅显易懂的阐述一下 PID 控制理论,将温度控制及PID 算法作一个简单的描述。

1.温度控制的框图asgstiB这是一个典型的闭环控制系统,用于控制加热温区的温度( PV )保持在恒定的温度 设定值(SV )。

系统通过温度采集单元反馈回来的实时温度信号( PV )获取偏差值(EV ),偏差值经过 PID 调节器运算输出,控制发热管的发热功率,以克服偏差,促使偏差趋近 于零。

例如,当某一时刻炉内过PCB 板较多,带走的热量较多时,即导致温区温度下降,这时,通过反馈的调节作用,将使温度迅速回升。

其调节过程如下:温度控制的功率输出采用脉宽调制的方法。

固态继电器电压U ouT 。

当SSR 的触发角触发时,电源电压U AN 通过SSR 的输出端加到发热管的两 端;当SSR 的触发角没有触发信号时,SSR 关断。

因此,发热管两端的平均电压为U d = (t/T )* U AN =K* U AN其中K= t/T ,为一个周期T 中,SSR 触发导通的比率,称为负载电压系数或是占空比, K的变化率在0- 1之间。

一般是周期 T 固定不便,调节t,当t 在0-T 的范围内变化时, 发热管的电压即在 0- U AN 之间变化,这种调节方法称为定频调宽法。

下面将要描述的 PID调节器的算式在这里的实质即是运算求出一个实时变化的,能够保证加热温区在外界干扰的情况下仍能保持温度在一个较小的范围内变化的合理的负载电压系数K 。

甌汕血Ikinl 曲汀 備錢(哉0.1/ 1A『'、、A____ 5^50 工 /it TTVI PID 调节鼬 固憲继电器勻岌恿習 X ?n -Tr-Zn 4f t 沮LEV)*冲端出易度 A 崭1出功率SSR 的输出端为脉宽可调的2.温度控制的两个阶段本文档如对你有帮助,请帮忙下载支持! 本文档如对你有帮助,请帮忙下载支持!温度控制系统是一个惯性较大的系统,也就是说,当给温区开始加热之后, 并不能立即观察得到温区温度的明显上升;同样的,当关闭加热之后, 温区的温度仍然有一定程度的上升。

pidc语言程序

pidc语言程序

pidc语言程序
PIDC语言程序是一种用于控制工业过程的编程语言。

PIDC的全称为Proportional-Integral-DerivativeController,即比例积分微分控制器。

PIDC语言程序在工业自动化领域中应用广泛,特别是在控制温度、湿度、压力、流量等过程方面。

PIDC语言程序由多个功能块组成,每个功能块都有特定的输入和输出。

常用的功能块包括:比例调节器(P调节器)、积分调节器(I调节器)、微分调节器(D调节器)、开关控制器、计时器、计数器等。

这些功能块可以根据需要进行组合,形成一个完整的PIDC控制系统。

PIDC语言程序的编写需要掌握基本的编程概念和语法。

其中,需要了解如何定义变量、使用运算符、编写条件语句、循环语句以及调用函数等。

此外,还需要了解PIDC语言的特殊语法规则,如时间常数、采样周期、目标值等。

PIDC语言程序的优点在于可以实现高精度的控制,以及对过程的自适应调整。

PIDC控制器可以根据实时反馈的过程数据,自动调整控制参数,使得控制系统能够更加稳定、可靠地运行。

总之,PIDC语言程序是一种重要的工业自动化编程语言,其应用广泛、功能强大,对于提高工业生产效率和产品质量具有重要意义。

- 1 -。

温度控制的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算法温度控制c语言程序

pid算法温度控制c语言程序

pid算法温度控制c语言程序PID算法是一种常用的温度控制算法,广泛应用于各种温度控制系统中。

在C语言中,我们可以通过编写程序来实现PID算法的温度控制功能。

我们需要了解PID算法的基本原理。

PID算法是通过对系统的反馈信号进行不断调整,使得系统的输出达到期望值。

PID算法由三个部分组成:比例控制、积分控制和微分控制。

比例控制根据反馈信号与期望值的差异来调整输出;积分控制根据反馈信号与期望值的累积差异来调整输出;微分控制根据反馈信号的变化率来调整输出。

在C语言中,我们可以使用变量来表示系统的输入、输出和期望值。

以下是一个简单的示例代码:```c#include <stdio.h>// 定义PID参数float Kp = 1.0; // 比例系数float Ki = 0.5; // 积分系数float Kd = 0.2; // 微分系数// 定义系统变量float setpoint = 25.0; // 期望值float input = 0.0; // 输入值float output = 0.0; // 输出值// 定义误差变量float error = 0.0; // 当前误差float last_error = 0.0; // 上一次误差float integral = 0.0; // 累积误差// PID算法函数float pid_algorithm(float setpoint, float input) {// 计算误差error = setpoint - input;// 计算比例控制float proportional = Kp * error;// 计算积分控制integral += error;float integral_control = Ki * integral;// 计算微分控制float derivative = Kd * (error - last_error); // 计算输出output = proportional + integral_control + derivative;// 更新误差last_error = error;return output;}int main(){// 模拟温度传感器的输入input = 23.5;// 调用PID算法函数output = pid_algorithm(setpoint, input);// 打印输出结果printf("Output: %.2f\n", output);return 0;}```在上述代码中,我们首先定义了PID算法的参数和系统变量。

温度控制的PID算法与C程序实现

温度控制的PID算法与C程序实现

温度控制的PID算法与C程序实现PID (Proportional-Integral-Derivative) 是一种经典的反馈控制算法,被广泛应用于温度控制中。

在温度控制中,PID算法可以根据实际温度与设定温度之间的差异来调整控制器的输出,以达到稳定的温度控制。

下面将介绍PID算法的原理及其在C程序中的实现。

PID算法是通过对三个控制参数的不同组合调整,来实现对控制系统的精确控制。

这三个参数分别是比例项(P),积分项(I)和微分项(D)。

比例项(P)是根据实际温度与设定温度的差异计算出来的,并且与这个差异成比例。

比例项主要用于对系统的快速响应进行调整。

如果比例项过大,可能会导致系统产生震荡,如果比例项过小,则可能导致控制系统响应迟缓。

积分项(I)用于校正持续的误差,通过对误差的积分来进行控制系统的调整。

积分项主要用于对系统的稳定性进行调整。

如果积分项过大,可能会导致系统产生超调和振荡,如果积分项过小,则可能导致系统无法快速地消除误差。

微分项(D)用于预测系统未来变化的趋势,并根据这个趋势来进行控制系统的调整。

微分项主要用于对系统的响应速度进行调整。

如果微分项过大,可能会导致系统产生过度的抖动,如果微分项过小,则可能导致系统响应迟缓。

PID算法的输出是三个控制参数的加权和,即 control = P * error + I * integral + D * derivative。

其中,error为实际温度与设定温度的差异,integral为误差的累积和,derivative为误差的变化率。

下面是一个使用PID算法实现温度控制的C程序的示例:```c#include <stdio.h>//PID参数float Kp = 0.5;float Ki = 0.2;float Kd = 0.1;//温度设定值float setpoint = 50.0;//初始化float errorSum = 0;float lastError = 0;//计算PID控制量float calculateOutput(float currentTemperature) float error = setpoint - currentTemperature; errorSum += error;//计算PID控制量float proportional = Kp * error;float integral = Ki * errorSum;float derivative = Kd * (error - lastError);float output = proportional + integral + derivative; lastError = error;return output;int mai//模拟当前温度float currentTemperature = 40.0;//模拟控制循环while (1)//获取温度传感器读数// float currentTemperature = readTemperature(;//计算PID控制量float controlOutput = calculateOutput(currentTemperature); //执行控制动作,例如根据控制量控制加热器或冷却器// executeControlAction(controlOutput);//模拟温度变化currentTemperature += 0.5;//输出当前温度和控制量printf("Current temperature: %.2f, Control output: %.2f\n", currentTemperature, controlOutput);}return 0;```上述C程序中,首先定义了PID参数Kp、Ki和Kd,以及温度设定值setpoint。

PID控制C代码

PID控制C代码

PID控制当今的自动控制技术都是基于反馈的概念。

反馈理论的要素包括三个部分:测量、比较和执行。

测量关心的变量,与期望值相比较,用这个误差纠正调节控制系统的响应。

这个理论和应用自动控制的关键是,做出正确的测量和比较后,如何才能更好地纠正系统。

比例控制(P):比例控制是最常用的控制手段之一,比方说我们控制一个加热器的恒温100度,当开始加热时,离目标温度相差比较远,这时我们通常会加大加热,使温度快速上升,当温度超过100度时,我们则关闭输出,通常我们会使用这样一个函数e(t)=SP —y(t);u(t)=e(t)*PSP设定值、e(t)――误差值、y(t)――反馈值、u(t)――输出值、P――比例系数滞后性不是很大的控制对象使用比例控制方式就可以满足控制要求,但很多被控对象中因为有滞后性。

也就是如果设定温度是200度,当采用比例方式控制时,如果P选择比较大,则会出现当温度达到200度输出为0后,温度仍然会止不住的向上爬升,比方说升至230度,当温度超过200度太多后又开始回落,尽管这时输出开始出力加热,但温度仍然会向下跌落一定的温度才会止跌回升,比方说降至170度,最后整个系统会稳定在一定的范围内进行振荡。

如果这个振荡的幅度是允许的比方说家用电器的控制,那则可以选用比例控制比例积分控制(PI):积分的存在是针对比例控制要不就是有差值要不就是振荡的这种特点提出的改进,它常与比例一块进行控制,也就是PI控制。

其公式有很多种,但大多差别不大,标准公式如下:u(t)=Kp*e(t)+Ki 刀e(t)+u0u(t)――输出、Kp比例放大系数、Ki――积分放大系数、e(t)――误差、u0――控制量基准值(基础偏差) 大家可以看到积分项是一个历史误差的累积值,如果光用比例控制时,我们知道要不就是达不到设定值要不就是振荡,在使用了积分项后就可以解决达不到设定值的静态误差问题,比方说一个控制中使用了PI控制后,如果存在静态误差,输出始终达不到设定值,这时积分项的误差累积值会越来越大,这个累积值乘上Ki后会在输出的比重中越占越多,使输出u(t)越来越大,最终达到消除静态误差的目的。

单片机温控程序

单片机温控程序

单片机温控程序设计一个单片机温控程序涉及多个方面,包括传感器的接口、温度采集、控制算法、显示等。

以下是一个简要的单片机温控程序的设计示例,具体实现可能依赖于使用的单片机型号、传感器型号等。

1. 硬件设计a. 传感器接口选择合适的温度传感器,比如常用的DS18B20数字温度传感器。

连接传感器的引脚到单片机的GPIO口。

c// DS18B20传感器连接// VCC -> 单片机电源// GND -> 单片机地// DQ -> 单片机GPIO口b. 输出控制选择用于控制的输出设备,如继电器、加热器、风扇等。

连接输出设备的引脚到单片机的GPIO口。

c// 控制设备连接// 继电器、加热器、风扇等的控制引脚连接到单片机GPIO口c. 显示设备如果需要显示当前温度或其他信息,可以选择合适的显示设备,如数码管、LCD等。

c// 显示设备连接// 数码管、LCD等的引脚连接到单片机GPIO口2. 软件设计a. 温度采集使用单片机的GPIO口读取温度传感器的数据,获取当前环境温度。

c// 读取DS18B20传感器温度数据float readTemperature(){// 实现读取DS18B20数据的代码// 返回浮点数温度值}b. 控制算法根据采集到的温度数据,实现控制算法。

比如,当温度过高时打开风扇或者关闭加热器。

c// 温控算法void temperatureControl(float currentTemperature){float targetTemperature =25.0;// 目标温度float hysteresis =1.0;// 温度死区if(currentTemperature >targetTemperature +hysteresis){// 温度过高,执行降温操作,比如打开风扇turnOnFan();}else if(currentTemperature <targetTemperature -hysteresis){// 温度过低,执行升温操作,比如关闭风扇、打开加热器turnOffFan();turnOnHeater();}else{// 温度在目标范围内,保持当前状态turnOffFan();turnOffHeater();}}c. 控制设备根据控制算法的结果,控制相应的输出设备。

单片机控制的温度传感器C语言程序

单片机控制的温度传感器C语言程序
temp_h= Readbyte(); //存储温度高字节值(其中高五位为符号位)
EA = 1;
}
/*数据转换*/
void DigitalConvert()
{
uchar total = 0;
tempsign = (temp_h >> 7) & 0x01; //得出符号位
if(tempsign == 0)//正数的处理方法
{
uint i = 0;
bit b = 0;
DO = 0; //产生读时隙
i++;//维持低电平至少1us
DO = 1; //1us以上后拉高
Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效
b = DO; //读取数据
Delayus(40);//每个读时隙至少持续60us
}
/*写一个字节*/
void Writebyte(uchar byte_to_write)
{
uchar i = 0;
uchar j = 0;
bit write_bit = 0;
for(j=0; j<8; j++)
{
write_bit =(byte_to_write & 0x01);
if(write_bit == 1) //写1
return(b);
}
/*读取一个字节*/
uchar Readbyte()
{
uchar byte_read = 0;
uchar i, j;ቤተ መጻሕፍቲ ባይዱ
for(i=0; i<8; i++)
{
j = Readbit();

模糊PID控制温控系统设计C语言程序代码

模糊PID控制温控系统设计C语言程序代码

模糊PID控制温控系统设计C语言程序代码请注意,由于1200字的限制,下面的代码只是模糊PID控制温控系统的一个简单示例。

如果您需要更详细和完整的代码,请提供更多的细节和规格要求。

```c#include <stdio.h>//PID参数float kp = 0.5; // 比例系数float ki = 0.2; // 积分系数float kd = 0.1; // 微分系数//PID变量float integral = 0; // 积分累计float previous_error = 0; // 上一次的误差//温度传感器读取函数,返回当前温度float read_temperatur//实现温度传感器读取的代码逻辑//返回当前温度值//控制器输出函数,将控制信号发送给执行机构void control_output(float control_signal)//实现将控制信号发送给执行机构的代码逻辑int mai//设置设定温度float setpoint = 25.0;//主循环while (1)//获取当前温度float current_temperature = read_temperature(;//计算误差float error = setpoint - current_temperature;//计算PID控制信号float p_term = kp * error;integral += ki * error;float d_term = kd * (error - previous_error);float control_signal = p_term + integral + d_term; //更新上一次的误差previous_error = error;//输出控制信号control_output(control_signal);}return 0;```上述代码中,我们首先定义了PID参数和变量,以及温度传感器读取函数和控制器输出函数。

pid控制温度实例 c语言

pid控制温度实例 c语言

pid控制温度实例 c语言以下是一个简单的PID温度控制器的C语言实现示例:```c#include <stdio.h>// PID参数结构体typedef struct {double Kp; // 比例系数double Ki; // 积分系数double Kd; // 微分系数double integral; // 积分项double pre_error; // 上一次误差} PID_t;// PID温度控制器函数double pid_temperature_control(PID_t *pid, double setpoint, double actual_temperature) {double error = setpoint - actual_temperature; // 计算误差pid->integral += error; // 计算积分项double derivative = error - pid->pre_error; // 计算微分项double output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative; // 计算输出值pid->pre_error = error; // 保存上一次误差值return output;}int main() {PID_t pid = {1.0, 0.5, 0.1, 0.0, 0.0}; // PID参数初始化 double setpoint = 100.0; // 设定温度值double actual_temperature = 0.0; // 实际温度值double output = 0.0; // 输出值int i;for (i = 0; i < 100; i++) { // 模拟控制过程,迭代100次 output = pid_temperature_control(&pid, setpoint, actual_temperature); // 计算输出值printf("Time: %d, Setpoint: %f, ActualTemperature: %f, Output: %f\n", i, setpoint,actual_temperature, output); // 输出结果actual_temperature += output * 0.1; // 根据输出值调整实际温度值,模拟控制过程}return 0;}```在上面的示例中,我们首先定义了一个PID参数结构体,其中包含了比例系数、积分系数、微分系数、积分项和上一次误差等参数。

恒温控制算法 c语言版

恒温控制算法 c语言版

恒温控制算法 c语言版恒温控制算法是用于维持一个恒定的温度值的控制系统。

在C语言中,我们可以实现一个简单的恒温控制算法。

首先,我们需要定义一个目标温度值,然后通过传感器获取当前的温度值。

接下来,我们可以使用一些控制算法来调节加热或冷却设备,使得当前温度逐渐接近目标温度。

一个简单的恒温控制算法可以是基于比例控制(P控制)的。

在C语言中,我们可以定义一些变量来存储目标温度值、当前温度值以及控制设备的输出值。

然后,我们可以编写一些逻辑来根据当前温度与目标温度的差异来调节控制设备的输出值。

以下是一个简单的伪代码示例:c.#include <stdio.h>。

int main() {。

float targetTemperature = 25.0;float currentTemperature = 0.0;float error, output;while (1) {。

// 获取当前温度值。

currentTemperature = readTemperature();// 计算误差。

error = targetTemperature currentTemperature; // 根据误差调节输出值。

output = kp error; // kp为比例系数。

// 控制加热或冷却设备。

controlHeater(output);// 程序延时一段时间。

delay(1000); // 延时1秒。

}。

return 0;}。

在上面的示例中,我们假设已经有了readTemperature()函数来获取当前温度值,controlHeater()函数来控制加热或冷却设备,以及delay()函数来实现延时。

我们还假设有一个比例系数kp来调节输出值。

当然,实际的恒温控制系统可能会更复杂,可能会涉及到积分控制(I控制)和微分控制(D控制),以及其他因素的考虑。

这只是一个简单的示例,希望能够帮助你理解在C语言中实现恒温控制算法的基本思路。

空调c语言源程序

空调c语言源程序

空调c语言源程序空调C语言源程序引言:空调是一种常见的家用电器,它能够调节室内温度、湿度和空气流通情况,为人们提供舒适的居住环境。

在本文中,将介绍一个基于C语言的空调源程序,该程序能够实现空调的基本功能,包括温度调节、制冷和制热模式的切换,以及风速控制等。

1. 程序结构为了实现空调的各项功能,我们需要定义一些变量和函数。

下面是程序的基本结构:```c#include <stdio.h>// 温度范围#define MIN_TEMP 16#define MAX_TEMP 30// 当前温度int current_temp = 25;// 制冷模式void cooling_mode() {// 制冷控制逻辑}// 制热模式void heating_mode() {// 制热控制逻辑}// 温度调节void adjust_temperature(int temp) { // 温度调节逻辑}// 风速控制void adjust_fan_speed(int speed) { // 风速控制逻辑}int main() {// 主程序逻辑return 0;}```2. 温度调节空调的核心功能之一就是温度调节。

在上述程序中,我们定义了一个`adjust_temperature`函数,用于调节温度。

该函数接受一个整数参数`temp`,表示目标温度。

在函数内部,我们可以根据当前温度和目标温度的大小关系,实现相应的温度调节逻辑。

3. 制冷和制热空调可以根据室内温度的不同选择制冷或制热模式。

在上述程序中,我们分别定义了`cooling_mode`和`heating_mode`函数,用于实现制冷和制热逻辑。

在这两个函数内部,我们可以根据当前温度和目标温度的关系,控制空调的制冷或制热功能。

4. 温度范围限制为了保证温度调节的安全性,我们需要对温度进行范围限制。

在上述程序中,我们使用了两个宏定义`MIN_TEMP`和`MAX_TEMP`来表示温度的最低值和最高值。

基于51的温度控制系统设计C语言源程序

基于51的温度控制系统设计C语言源程序

未 ************* ********* 未章 **** 未章 ***)*(未章 ********** 未*******/八程序名称:温度监控系统*/广程序功能:利用89C52单片机和DS18B20温度传感器实现环境 */ /*温度的实时测量和高、低温报警*/八程序版本:vl.O */八作 者: 严编写时间:未 ************* ********* 未章 **** 未章 ***)*(未章 ********** 未*******///定义数据类型★define uchar unsigned char ★define uint unsigned int〃定义端口#define LED PO 〃段码输出口 sbit DQ = P3A 2; //传感器数据口sbit SMG_q = P20; //定义数码管阳级控制脚(千位) sbit SMG_b = P"l; //定义数码管阳级控制脚(百位) sbit SMG_s = P"2; 〃定义数码管阳级控制脚(十位) sbit SMG 」= P"3; //定义数码管阳级控制脚(个位)sbit buzzer = P1A 5; //蜂鸣器 sbit ledjow = P2A 6; 〃低温指示灯 sbit led.high = P2A 7; 〃高温指不灯 sbit led_ok = P2 人5; 〃温度正常指示灯 sbit led_work = P2A 4; 〃工作指不灯 sbit set = P3A 7;〃设置按键sbit add= P3A 4;〃加一按键 sbitdec = P3A 5;〃减一按键 〃共阳 LED 段码表 n 0H n l u n 2H”3” ”4” H 5n H 6n H 7n ”8” “9"不亮uchar code LED_code[12] = {0xc0.0xf9.0xa4,0xb0,0x99,0x92,0x82.0x18.0x80,0x90}; uchar code LED_codel[] = {0x40,0x79,0x24,0x30^0x19,0x12,0x02,0x78^0x00,0x10}; uchar code ditab[16]=*/ */^include <reg52.h> #include <intnns.h>〃含_nop_()延时函数〃定义变量和常量int count = 0; int h;uint temp; uchar r;uchar high = 35」ow = 20;〃按键次数寄存器 〃主函数用循环计数器 //温度值 〃温度值整数形式 〃上下限初值广函数名称:ds_resetQ */{0x00,0x01,0x0],0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,OxO&OxO&0x09,0x09};// 小数部分转换码表uchar data temp_data[2] = {0x00,0x00};//存储从传感器读出的温度值uchar data dp[5] = {0x00,0x00,0x00,0x00.0x00}显示单元数据,共 4 个数据和一个运算 〃子函数声明 void ds_reset();void ds_WTite(uchar ds_wrdata); uchar ds_read(); read_temp();void change_temp(uint tem);void xianshi(int horl);void display();void keyscanQ;void warn_led();void delay(uint t);}change_temp(read_temp()); 〃温度数据读取和处理//DS18B20初始化函数 //DS18B20写数据函数 //DS18B20读数据函数 //读取温度函数 //温度数据处理 //温度显示转换 〃数码管显示函数〃按键查询函数 〃超限报警〃延时函数,单次25us*/void mainQ{LED=0x00; led 1=0; led2=0; led3=0; led4=0;for(h=0 ;h<4 ;h++) { dp[h]=8; } while(l) { u c h ar i;for(i=0;i<200;i++) {warn_ledQ; displayQ; keyscan();〃初始化显示端口〃循环执行显示和温度读収〃指示灯控制 〃显示 〃按键扫描八函数功能:DS18B20初始化 *//沐入口参数:无 */ 八输出参数:无*/ /*调用函数:delayQ;_nop_0; */八全局变量:无 */ /沐局部变量:presence */void ds_reset(void) {char presence=l; while(presence) {while(presence) {DQ=1; _nop_0; _nop_0;DQ=0; delay(50); DQ=1; delay(6);presence=DQ; }delay(45); presence=、DQ; }DQ=1;led_work=0; }/沐函数名称:ds_write()*//*函数功能:向DS18B20写数据 *//*入 口 参数:ds_wi:data */ 八输出参数:无*/ /*调用函数:delayQ;_nop_0; */ 八全局变量:无*/ /沐局部变量:ds_wrdata */void ds_x\Tite(uchar ds_wrchta) {uchar i;for(i=8;i>0;i-)DQ=1; _nop_0; _nop_();〃传感器数据段先置高电平 〃适当延时〃传感器数据段从高电平拉到低电平 〃延时〃再置高电平 〃延时〃初始化成功,继续下一步 〃延时〃拉高电平〃开工作指示灯DQ=O; _nop_(); _nop_(); _nop_(); _nop_();DQ=ds_v\Tdata&0x01; delay(6);ds_wrdat3=ds_\vrdata/2; } DQ=1; delay(l); }严函数名称:ds_read()*/八函数功能:从DS18B20读数据 *//沐入口参数:无 *//沐输出参数:value♦/广调用函数:delayQ;_nop_0; */ 广全局变量: */严局部变量:i ;value; */uchar ds_read(void) {uchar i;uchar value=O; for(i=8;i>0;i-) {DQ=l;_nop_(); _nop_(); value»=l; DQ=O; _nop_(); _nop_(); _nop_(); _nop_(); DQ=1; _nop_(); _nop_(); _nop_();_nop_(); if(DQ)value|=0x80; delay(6); }DQ=1;return(value); }〃最低位移出 〃右移1位read_temp() 读温度数据数据 无 yempds_resetO;ds_\vriteO;ds_read(); */delay(); */ temp */ temp_data[]; */read_temp() {ds_reset(); delay(200); ds_wnte(Oxcc); ds_wnte(0x44); ds_reset(); delay(l); ds_wnte(Oxcc); ds_wnte(0xbe);temp_data[O]=ds_read(); temp_data[l]=ds_read(); temp=temp_data[ 1 ]; temp«=8;temp=temp|temp_data[O]; return temp;}〃传感器初始化 〃发跳过读取序列号命令 〃发温度转换命令〃读18B20中存储器 〃读温度值的低字节命令 〃读温度值的髙字节 〃两字节合成一个整型变量〃返回温度值/沐函数名称:chang_temp()*/ 八函数功能:将温度传感器中独到的数据进行转换 */ 广入口参数:tem */ 广输出参数:dp[] */ 八调用函数:无*/广全局变量:dp[];ditab[];r; */广局部变量:tem*/void change_temp(uint tem) {uchar n=0; if(tem>6348) {tem=65536-tem; n=l ;}dp[4]=tem&0x0f; dp[0]=ditab[dp[4]]; dp[4]=tem»4;八函数名称: 八函数功能: 八入口参数: 广输出参数: 八调用函数: 严广全局变量:广局部变量: */ */ */ *///温度值正负判断 //负温度求补码 〃标志位置1〃取小数部分的值 //存入小数部分显示值〃取中间八位,即整数部分的值广函数名称:xianshiQ */严函数功能:温度数据转换成显示所需LED 段码 */ 八入口参数:horl */八输出参数:dp[] */八调用函数:无 */广全局变量:dp[]; */ 广局部变量:n;*/void xianshi(int horl) {int n=0; if(horl>128){ horl=256-horl; n=l ; }dp[3]=horV100; dp[3]=dp[3]&OxOf; dp[2]=horl%100/10; dp[l]=horl%10; dp[0]=0; 現!dp[3]) {dp[3]=0x0a; 垠!dp[2])dp[2]=0x0a;dp[3]=dp[4]/100; dp[l]=dp[4]%100; dp[2]=dp[l]/10; dp[l]=dp[l]%10;r=dp[l]+dp[2]*10+dp[3]*100; 現!dp ⑶) {dp[3]=0x0a; 敢!dp[2]) {dp[2]=0x0a; } } if(n) {dp[3]=0x0b;//取百位数据 //取后两位数据 //取十位数据 //个位〃实际温度值(十进制) 〃符号位显示判断〃最高位为0时彳、显示〃次髙位为0时不显示〃负温度时最高位显示叮'〃负数补码转换〃百位 〃十位 〃个位 //小数位 //髙位为零不显不〃负数最高位显示dp[3]=0x0b; } }/沐函数名称:displayQ 八函数功能:数码管显示 严入口参数:无 八输出参数:无*//沐调用函数:delayQ*/ 广全局变量:dp[];LED_code[];LED_codel[];*/ /* Iedl;led2;led3;led4; */广局部变量:j ;*/void display() {intj;for0=0j<4j++) //4 位 LED 扫描控制 {switch 。

PID算法温控C语言

PID算法温控C语言

PID算法温控C语言浏览次数:1964次悬赏分:80|解决时间:2008-5-23 12:57 |提问者:3849801我在做一个89S51单片机的温控试验,要求是1升水的保温。

温度任意设定,要求用C语言编写PID算法来实现温度控制(使用1个18B20传感器)要求温度精确小于0.5度。

急求高手写一段程序,让小弟学习学习最佳答案1. PID调试步骤没有一种控制算法比PID调节规律更有效、更方便的了。

现在一些时髦点的调节器基本源自PID。

甚至可以这样说:PID调节器是其它控制调节算法的妈。

为什么PID应用如此广泛、又长久不衰?因为PID解决了自动控制理论所要解决的最基本问题,既系统的稳定性、快速性和准确性。

调节PID的参数,可实现在系统稳定的前提下,兼顾系统的带载能力和抗扰能力,同时,在PID调节器中引入积分项,系统增加了一个零积点,使之成为一阶或一阶以上的系统,这样系统阶跃响应的稳态误差就为零。

由于自动控制系统被控对象的千差万别,PID的参数也必须随之变化,以满足系统的性能要求。

这就给使用者带来相当的麻烦,特别是对初学者。

下面简单介绍一下调试PID参数的一般步骤:1.负反馈自动控制理论也被称为负反馈控制理论。

首先检查系统接线,确定系统的反馈为负反馈。

例如电机调速系统,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。

其余系统同此方法。

2.PID调试一般原则a.在输出不振荡时,增大比例增益P。

b.在输出不振荡时,减小积分时间常数Ti。

c.在输出不振荡时,增大微分时间常数Td。

3.一般步骤a.确定比例增益P确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。

输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。

温度控制的PD算法及C程序实现

温度控制的PD算法及C程序实现

温度控制的PD算法及C程序实现温度控制与PID算法温度控制与PID算法j较为复杂,下⾯结合实际浅显易懂的阐述⼀下PID控制理论,将温度控制及PID算法作⼀个简单的描述。

1.温度控制的框图这是⼀个典型的闭环控制系统,⽤于控制加热温区的温度(PV)保持在恒定的温度设定值(SV)。

系统通过温度采集单元反馈回来的实时温度信号(PV)获取偏差值(EV),偏差值经过PID调节器运算输出,控制发热管的发热功率,以克服偏差,促使偏差趋近于零。

例如,当某⼀时刻炉内过PCB板较多,带⾛的热量较多时,即导致温区温度下降,这时,通过反馈的调节作⽤,将使温度迅速回升。

其调节过程如下:温度控制的功率输出采⽤脉宽调制的⽅法。

固态继电器SSR的输出端为脉宽可调的电压U OUT 。

当SSR的触发⾓触发时,电源电压U AN通过SSR的输出端加到发热管的两端;当SSR的触发⾓没有触发信号时,SSR关断。

因此,发热管两端的平均电压为U d=(t/T)* U AN=K* U AN其中K=t/T,为⼀个周期T中,SSR触发导通的⽐率,称为负载电压系数或是占空⽐,K 的变化率在0-1之间。

⼀般是周期T固定不便,调节t, 当t在0-T的范围内变化时,发热管的电压即在0-U AN之间变化,这种调节⽅法称为定频调宽法。

下⾯将要描述的PID 调节器的算式在这⾥的实质即是运算求出⼀个实时变化的,能够保证加热温区在外界⼲扰的情况下仍能保持温度在⼀个较⼩的范围内变化的合理的负载电压系数K。

2.温度控制的两个阶段温度控制系统是⼀个惯性较⼤的系统,也就是说,当给温区开始加热之后,并不能⽴即观察得到温区温度的明显上升;同样的,当关闭加热之后,温区的温度仍然有⼀定程度的上升。

另外,热电偶对温度的检测,与实际的温区温度相⽐较,也存在⼀定的滞后效应。

这给温度的控制带来了困难。

因此,如果在温度检测值(PV)到达设定值时才关断输出,可能因温度的滞后效应⽽长时间超出设定值,需要较长时间才能回到设定值;如果在温度检测值(PV)未到设定值时即关断输出,则可能因关断较早⽽导致温度难以达到设定值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
temp=xiaxian;
fm=1;
red=1;
green=0;
}
if(b2==0xbf)
{
if(temp>=xiaxian)
temp=xiaxian;
if((temp==xiaxian)&&b2==0xbf)
{
dsreset();
delay(1);
tempwritebyte(0xcc); // 写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
void tht1()
{
dsreset();
delay(1);
}
else
{
ds=0; //写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20开始获取温度并转换
uchar num,num1,num2,num3;
uint temp,shangxian,xiaxian,aa,bb,ee; //定义温度上下限值
uint flag1,b1,t,t1,f,f1,b2,n;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
A3=A2t%10;
P2=0x01; //显示负号
P0=b1;
delay(2);
//显示百位
P2=0x02;
P0=table[A1];
delay(2);
//显示十位
P2=0x04;
else
b2=0xff;
A1=num2/10;
A2=num2%10;
//显示负号
P2=0x01;
P0=b2;
delay(2);
//显示百位
P2=0x02;
P0=table[A1];
delay(2);
{
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=i&(~((0X01)<<(num)));
P0=i;
wela=1;
wela=0;
delay(1);
}
void dis_temp(uint t)
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //都1个字节数据函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
if(flag1!=0xff)
{
b1=0xff;
if(b2!=0xbf)
{
if(temp>=shangxian)
temp=shangxian;
if(temp<=xiaxian)
temp=xiaxian;
}
//显示十位
{
fm=1;red=1;
green=0;
}
else
{
fm=0;
red=0;
green=1;
}
}
}
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}
void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数
{
uint i;
uchar j;
if(b2==0xbf)
{
if(temp>=shangxian)
temp=shangxian;
}
if((temp==xiaxian)&&b2==0xff||(temp==shangxian))
{
fm=1;
red=1;
sbit fm=P3^6; // 蜂鸣器信号线
sbit key1=P3^0; //按键1控制
sbit key2=P3^1; //按键2控制
sbit key3=P3^2; //按键3控制
sbit key4=P3^3; //按键4控制
uchar biaozhi;
{
num2--;
if(num2==0)
num2=99;
if(num==1)
t=num2;
if(num==2)
f=num2;
while(!key4);
}
}
num1=0;
num2=0;
f=num2;
}
if(num==3)
{
num=0;
n=1;
}
while(!key1);
}
}
if(key2==0)
{
delay(10);
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //读1位数据函数dat;
ds=0;i++; //i++ 起延时作用
ds=1;i++;i++;
dat=ds;
}
void zhi()
{
uchar shi,shi1,ge,ge1;
if(n==1)
{
shi=t/10;
ge=t%10;
shi1=f/10;
ge1=f%10;
aa=shi*10+ge*1;
bb=shi1*10+ge1*1;
n=0;
//不带小数点0~9编码和负号
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//带小数点0~9编码
/******延时函数******/
void delay(uchar z)
{
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
tht1();
}
}
void init()
{
num=0;
num1=0;
num2=0;
aa=90;
bb=50;
ee=0x7f;
b2=0xbf;
}
void display(uint temp)
{
uchar A1,A2,A2t,A3,b1;
if(key2==0&&num==2)
{
num1++;
if(num1==2)
num1=0;
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //DS18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
}
if(num==1)
t=num2;
if(num==2)
f=num2;
while(!key3);
}
}
if(key4==0)
{
delay(10);
if(key4==0)
P0=table1[A2];
delay(2);
//显示个位
P2=0x08;
P0=table[A3];
delay(2);
}
void display1()
{
uchar A1,A2;
if(num1==1)
b2=0xbf;
green=0;
}
else
{
fm=0;
red=0;
green=1;
}
}
if(flag1==0xff)
{
b1=0xbf;
相关文档
最新文档