单片机温控器PID程序.txt

上传人:b****1 文档编号:235179 上传时间:2022-10-07 格式:TXT 页数:8 大小:6.27KB
下载 相关 举报
单片机温控器PID程序.txt_第1页
第1页 / 共8页
单片机温控器PID程序.txt_第2页
第2页 / 共8页
单片机温控器PID程序.txt_第3页
第3页 / 共8页
单片机温控器PID程序.txt_第4页
第4页 / 共8页
单片机温控器PID程序.txt_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

单片机温控器PID程序.txt

《单片机温控器PID程序.txt》由会员分享,可在线阅读,更多相关《单片机温控器PID程序.txt(8页珍藏版)》请在冰豆网上搜索。

单片机温控器PID程序.txt

/*****************************************************/

/*����AT89C51Ϊ������оƬ*/

/*P0��Ϊ����ܵĶ�ѡ�ڣ�P2.4~P2.7Ϊλѡ��*/

/*DS18B20��DQ��P2.3��12MHZ����*/

/*P2^2��PWM���ƽ�*/

/*****************************************************/

#include

#defineKp1 //����ϵ��

#defineKi0.25//����ϵ��

#defineKd1 //΢��ϵ��

unsignedcharm,n,p; //�¶ȵ�ʮλ��λС��

unsignedchartest_temp; //�¶ȼ춨��־

unsignedcharkey_set_flag; //�����趨�����־

unsignedcharkey_hold; //�������ֱ�־

unsignedcharChange_step=1; //�¶����ò���

intReal_temp; //ʵ���¶�ֵ

intSet_temp; //�����¶�

intDisp_temp; //��ʾ�¶�

intlast_error; //�ϴ����

floatI_term; //ǰ���²��

intPID_MAX;

unsignedintout,PWMT,counter;

inttime; //�ɿع����崥��ʱ��

sbitDQ=P2^3; //����DS18b20�Ĺܽ�

sbitL1=P2^7; //�����������ܵĹܽ�

sbitL2=P2^6;

sbitL3=P2^5;

sbitL4=P2^4;

sbitPWM=P2^2; //PWM���ƽ�

unsignedchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,

0x82,0xF8,0x80,0x90,0x7F,0xbF,0xC6};//0-9���֣�����Ϊ".-C"

/*****��ʱ�ӳ���*****/

voiddelay(unsignedintt)

{

for(;t>0;t--);

}

voiddelay_50us(unsignedintt)

{

unsignedcharj;

for(;t>0;t--)

for(j=19;j>0;j--);

}

/*****��ʼ��DS18B20*****/

unsignedcharInit_DS18B20(void)

{

unsignedcharx=0;

DQ=1;//DQ��λ

delay(8);//������ʱ

DQ=0;//��Ƭ����DQ����

delay(80);//��ȷ��ʱ������480us

DQ=1;//��������

delay(8);

x=DQ;//������ʱ�����x=0���ʼ���ɹ���x=1���ʼ��ʧ��

delay(4);

returnx;

}

/*****��һ���ֽ�*****/

unsignedcharReadOneChar(void)

{

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//�������ź�

dat>>=1;

DQ=1;//�������ź�

if(DQ)

dat|=0x80;

delay(4);

}

return(dat);

}

/*****дһ���ֽ�*****/

voidWriteOneChar(unsignedchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

delay(4);

DQ=1;

dat>>=1;

}

delay(4);

}

/*****��ȡ�¶�*****/

intReadTemperature(void)

{

unsignedchara=0;

unsignedcharb=0;

unsignedintt=0;

t=Init_DS18B20();

if(t)returnReal_temp;

WriteOneChar(0xCC);//����������кŵIJ���

WriteOneChar(0x44);//����¶�ת��

//delay(10);

t=Init_DS18B20();

if(t)returnReal_temp;

WriteOneChar(0xCC);//����������кŵIJ���

WriteOneChar(0xBE);//��ȡ�¶ȼĴ���

a=ReadOneChar();//����8λ

b=ReadOneChar();//����8λ

t=b;

t<<=8;

t=t|a;

if(t<=0||t>0x900)returnReal_temp;

return(t);

}

voiddisplay(signedintdd)//�����ɨ�躯��

{

inttt=0;

tt=(unsignedint)(dd*0.625+0.5);//�Ŵ�10���������������

m=tt/100; //�����ʮλ

n=(tt%100)/10; //�������λ

p=tt%10; //�����С��λ

P0=table[m];

L1=1; //��δ1����������������Ҫ��Ϊ0

delay(300);

L1=0; //��ر���ʾ

P0=table[n];

//P1=table[10];//�ڶ�λ����ʾ�м��

L2=1;

delay(300);

L2=0;

P0=table[10];

L2=1;

delay(300);

L2=0;

P0=table[p]; //������

L3=1;

delay(300);

L3=0;

P0=table[12];

L4=1;

delay(300);

L4=0;

}

voidkey_set(void)

{

unsignedcharkey_value;

key_value=P1;

key_value&=0x07; //��ȡ������ֵ

if(key_value!

=7) //��������

{

if(!

key_hold) //������һ�ΰ���

{

key_hold=1; //��־�������ڱ��ְ���״̬

switch(key_value)

{

//set������

case6:

{ if(key_set_flag==0) //�״ν����¶�����

{

key_set_flag=1; //��־�¶��趨״̬

Disp_temp=Set_temp; //��ʾ�¶�ֵΪԭ�趨�¶�

}else

{

Set_temp=Disp_temp; //���趨�¶�Ϊ��ǰ��ʾ�¶�

key_set_flag=0; //���¶��趨��־

Change_step=1; //�ָ�ȱʡ�趨����ֵ

}

break;

}

//+������

case5:

{ if(key_set_flag)Disp_temp+=Change_step;

break;

}

//-������

case3:

{ if(key_set_flag)Disp_temp-=Change_step;

break;

}

//������ϰ����������䣬����δ����

default:

break;

}

}

elseif(key_set_flag)

{ //��������һֱ����״̬

key_hold++;

if(key_hold>20) //�������������趨ʱ��

{

Change_step=16; //�趨������1�Ȳ���

key_hold=0; //�尴������״̬���ɽ���Ӽ���������

}

}

}elseif(key_hold)

{

key_hold=0;//��־�����ɿ�״̬

Change_step=1;

}

}

intPID(intSet_value,intReal_value)//��׼PID�¶ȿ����㷨

{

interror;

floatP_term,D_term;

intpid_out;

error=Set_value-Real_value;//�����

P_term=Kp*error; //������

I_term+=Ki*error; //������

if(I_term>PID_MAX)I_term=PID_MAX; //�޶�����������

elseif(I_term<0)I_term=0; //�޶�����������

D_term=Kd*(error-last_error); //΢����

last_error=error; //���浱ǰ�����

pid_out=(signedint)(P_term+I_term+D_term); //PID����������

if(pid_out>PID_MAX)pid_out=PID_MAX; //����������=PID_MAX

elseif(pid_out<0)pid_out=0; //����������=0

return(pid_out);

}

voidInit0(void)interrupt0

{

TH0=time>>8;

TL0=time&0x00FF;

TF0=0;

ET0=1;

counter++;

}

voidT0_int(void)interrupt1

{

TH0=0xFF;

TL0=0x80;

if(PWM)

{ PWM=0;

TH0=0xDA;

TL0=0x00;

}

else PWM=1;

}

voidmain()

{

PWMT=128; //128������PWM����

PID_MAX=PWMT;

counter=0;

out=0;

PWM=0;

I_term=0;

last_error=0;

Set_temp=41; //��ʼ�趨�¶�Ϊ41��

Set_temp<<=4;

Real_temp=Set_temp;

Init_DS18B20();

WriteOneChar(0xCC); //����������кŵIJ���

WriteOneChar(0x44);//����¶�ת��

delay_50us(15000); //�ȴ��¶Ȳ���

TMOD=0x01; //��ʱ��0ģʽ1

TH0=0xFD; //��ʼ����������780us��ʱ

TL0=0x00;

TR0=1;

ET0=1;

IT0=1;

EX0=1;

EA=1;

while

(1)

{ if(counter>=5)

{

test_temp=1; //5*20ms=100ms����һ���¶ȼ춨

counter=0;

}

if(test_temp) //�¶ȼ춨��־��λ�������¶�PID����

{

Real_temp=ReadTemperature();//�ɼ���ǰʵ���¶�

out=PID(Set_temp,Real_temp);//PID����

time=~((9500/PID_MAX)*(PID_MAX-out)+250);//�ɿع败��ʱ�̼���

test_temp=0; //�춨��ɣ����¶ȼ춨��־

}

// Real_temp=ReadTemperature(); //��ȡ��ǰ�¶�

// out=PID(Set_temp,Real_temp); //PID����

//��ʾ�¶�(�趨״̬��ʾ�趨�¶ȣ����趨״̬��ʾʵ���¶�)

if(!

key_set_flag)Disp_temp=Real_temp;

display(Disp_temp);

key_set(); //�����¶�����

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1