单片机温控器PID程序.txt
《单片机温控器PID程序.txt》由会员分享,可在线阅读,更多相关《单片机温控器PID程序.txt(8页珍藏版)》请在冰豆网上搜索。
![单片机温控器PID程序.txt](https://file1.bdocx.com/fileroot1/2022-10/7/12f56be7-a405-4578-b307-c47bafdf2fd0/12f56be7-a405-4578-b307-c47bafdf2fd01.gif)
/*****************************************************/
/*����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(); //�����¶�����
}
}