51系列单片机闭环温度控制实验报告Word格式.docx
- 文档编号:19522440
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:22
- 大小:156.12KB
51系列单片机闭环温度控制实验报告Word格式.docx
《51系列单片机闭环温度控制实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《51系列单片机闭环温度控制实验报告Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
偏差控制原理是要求对所需温度求出偏差值,然后对偏差值处理而获得控制信号去调节加热装置的温度。
PID控制方程式:
式中e是指测量值与给定值之间的偏差
TD微分时间
T积分时间
KP调节器的放大系数
将上式离散化得到数字PID位置式算法,式中在位置算法的基础之上得到数字PID
增量式算法:
3、硬件电路设计
在温度控制中,经常采用是硬件电路主要有两大部分组成:
模拟部分和数字部分,对这两部分调节仪表进行调节,但都存在着许多缺点,用单片机进行温度控制使构成的系统灵活,可靠性高,并可用软件对传感器信号进行抗干拢滤波和非线性补偿处理,可大大提高控制质量和自动化水平;
总的来说本系统由四大模块组成,它们是输入模块、单片机系统模块、计算机显示与控制模块和输出控制模块。
输入模块主要完成对温度信号的采集和转换工作,由温度传感器及其与单片机的接口部分组成。
利用模拟加热的装置来控制温度。
程序结构图如下:
3、电路原理图
三、实验结果分析(含程序、数据记录及分析和实验总结等,可附页):
1、51系列单片机直流电机闭环调速实验程序
/*--------------------------------------------------------------------------
REG52.H
Headerfileforgeneric80C52and80C32microcontroller.
Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.
Allrightsreserved.
--------------------------------------------------------------------------*/
#ifndef__REG52_H__
#define__REG52_H__
/*BYTERegisters*/
sfrP0=0x80;
sfrP1=0x90;
sfrP2=0xA0;
sfrP3=0xB0;
sfrPSW=0xD0;
sfrACC=0xE0;
sfrB=0xF0;
sfrSP=0x81;
sfrDPL=0x82;
sfrDPH=0x83;
sfrPCON=0x87;
sfrTCON=0x88;
sfrTMOD=0x89;
sfrTL0=0x8A;
sfrTL1=0x8B;
sfrTH0=0x8C;
sfrTH1=0x8D;
sfrIE=0xA8;
sfrIP=0xB8;
sfrSCON=0x98;
sfrSBUF=0x99;
/*8052Extensions*/
sfrT2CON=0xC8;
sfrRCAP2L=0xCA;
sfrRCAP2H=0xCB;
sfrTL2=0xCC;
sfrTH2=0xCD;
/*BITRegisters*/
/*PSW*/
sbitCY=PSW^7;
sbitAC=PSW^6;
sbitF0=PSW^5;
sbitRS1=PSW^4;
sbitRS0=PSW^3;
sbitOV=PSW^2;
sbitP=PSW^0;
//8052only
/*TCON*/
sbitTF1=TCON^7;
sbitTR1=TCON^6;
sbitTF0=TCON^5;
sbitTR0=TCON^4;
sbitIE1=TCON^3;
sbitIT1=TCON^2;
sbitIE0=TCON^1;
sbitIT0=TCON^0;
/*IE*/
sbitEA=IE^7;
sbitET2=IE^5;
sbitES=IE^4;
sbitET1=IE^3;
sbitEX1=IE^2;
sbitET0=IE^1;
sbitEX0=IE^0;
/*IP*/
sbitPT2=IP^5;
sbitPS=IP^4;
sbitPT1=IP^3;
sbitPX1=IP^2;
sbitPT0=IP^1;
sbitPX0=IP^0;
/*P3*/
sbitRD=P3^7;
sbitWR=P3^6;
sbitT1=P3^5;
sbitT0=P3^4;
sbitINT1=P3^3;
sbitINT0=P3^2;
sbitTXD=P3^1;
sbitRXD=P3^0;
/*SCON*/
sbitSM0=SCON^7;
sbitSM1=SCON^6;
sbitSM2=SCON^5;
sbitREN=SCON^4;
sbitTB8=SCON^3;
sbitRB8=SCON^2;
sbitTI=SCON^1;
sbitRI=SCON^0;
/*P1*/
sbitT2EX=P1^1;
//8052only
sbitT2=P1^0;
/*T2CON*/
sbitTF2=T2CON^7;
sbitEXF2=T2CON^6;
sbitRCLK=T2CON^5;
sbitTCLK=T2CON^4;
sbitEXEN2=T2CON^3;
sbitTR2=T2CON^2;
sbitC_T2=T2CON^1;
sbitCP_RL2=T2CON^0;
#endif
#ifndefWENDU_H_
#defineWENDU_H_
#defineu8unsignedchar
#defineu16unsignedint
#definePULSE200
//////LCD///////
sbitRS=P2^5;
sbitRW=P2^6;
sbitEN=P2^7;
sbitLED=P3^0;
sbitENA=P3^7;
sbitIN2=P3^6;
sbitIN1=P3^5;
voiddelay_ms(u16z);
voidLCD_WriteData(u8Dat);
voidLCD_WriteCOM(u8com);
voidShow_Num(u8x,u8y,u8n,u16num);
//n为数字长度num小于等于65535
voidShow_fNum(u8x,u8y,u16num);
voidLCD_Init(void);
voidkey_scan(void);
//voidkey_scan(void);
externu16read_tlc2543(u8port);
#ifndefTLC2543_H_
#defineTLC2543_H_
//////TLC2543////
sbitSDO=P2^0;
sbitSDI=P2^1;
sbitCS=P2^2;
sbitCLK=P2^3;
sbitEOC=P2^4;
//u16read_tlc2543(u8port);
u16read_tlc2543(u8port);
u8AD_deal(void);
#endif
#include<
reg52.h>
#include"
tlc2543.h"
//#include"
wendu.h"
voiddelay_us(u16z)
{
u16i;
for(i=z;
i>
0;
i--);
;
}
u16read_tlc2543(u8port)
staticu8PORT=0;
u8Temp,i,k=0;
u16AD_value=0;
Temp=port;
CS=1;
CLK=0;
delay_us
(1);
Temp<
<
=4;
CS=0;
while
(1)
{
for(i=0;
i<
8;
i++)
CLK=0;
if(Temp&
0x80)
SDI=1;
else
SDI=0;
AD_value<
=1;
if(SDO)
AD_value|=0x01;
CLK=1;
delay_us
(2);
Temp<
}
for(i=8;
12;
{
AD_value<
AD_value|=0x01;
if(PORT==port)
break;
else
Temp=port;
Temp<
delay_us
(2);
CS=0;
//PORT=port;
}
k++;
if(k>
2)
PORT=port;
}
returnAD_value;
u8AD_deal(void)
u16AD_value;
u16temp;
floattemp1;
AD_value=read_tlc2543(0x00);
temp1=(AD_value*0.04069);
temp=(u16)(temp1*10);
if((temp%10)>
4)
temp=temp/10+1;
else
temp=temp/10;
temp=(u8)temp;
returntemp;
u8S_Temp=100;
//设置温度
u8P_Temp=25;
//实际温度
u8pulse=0;
u8Kp=30,Ki=0;
Kd=10;
intuk=0;
intnum=0;
structFLAG
u8turn;
myflag;
/*************
函数功能:
延时
****************/
voiddelay_ms(u16z)
u8j;
i--)
for(j=120;
j>
j--);
LCD写数据
voidLCD_WriteData(u8Dat)
RS=1;
//delay_ms(5);
P1=Dat;
EN=1;
delay_ms(5);
EN=0;
LCD命令
voidLCD_WriteCOM(u8com)
RS=0;
P1=com;
Show_Num初始化
voidShow_Num(u8x,u8y,u8n,u16num)//n为数字长度num小于等于65535
u16Temp=num;
u8a[5],i;
n;
a[i]=Temp%10;
Temp=Temp/10;
if(y%2==1)
LCD_WriteCOM(0x80+x);
LCD_WriteCOM(0x80+0x40+x);
for(i=n;
LCD_WriteData(a[i-1]+0x30);
Show_fNum初始化
voidShow_fNum(u8x,u8y,u16num)
u8a,b;
a=num/10%10;
b=num%10;
LCD_WriteData(a+0x30);
LCD_WriteData(b+0x30);
voidShow_char(u8x,u8y,u8ch)
LCD_WriteData(ch);
LCD初始化
voidLCD_Init(void)
RW=0;
//delay_ms(20);
LCD_WriteCOM(0x38);
LCD_WriteCOM(0x0c);
LCD_WriteCOM(0x06);
LCD_WriteCOM(0x01);
voidLCD_display(void)
Show_char(0,1,'
P'
);
Show_char(1,1,'
T'
Show_char(2,1,'
:
'
Show_char(9,1,'
S'
Show_char(10,1,'
Show_char(11,1,'
Show_Num(12,1,3,S_Temp);
Show_char(0,2,'
Show_char(1,2,'
Show_Num(2,2,2,Kp);
Show_char(5,2,'
I'
Show_char(6,2,'
Show_Num(7,2,2,Ki);
Show_char(10,2,'
D'
Show_char(11,2,'
Show_Num(12,2,2,Kd);
定时器2初始化
voidtimer2_init()
RCAP2H=(65536-100)/256;
//100us
RCAP2L=(65536-100)%256;
TH2=RCAP2H;
TL2=RCAP2L;
ET2=1;
TR2=1;
EA=1;
voidTemp_crl()
staticintess[3]={0};
staticsum=0;
ess[0]=S_Temp-P_Temp;
uk=Kp*ess[0]+Ki*sum+Kd*(ess[0]-ess[1]);
ess[2]=ess[1];
ess[1]=ess[0];
sum=sum+ess[0];
uk=(int)(uk/10);
if(uk>
=0)
=200)
uk=199;
myflag.turn=1;
uk=-uk;
if(uk>
myflag.turn=0;
pulse=uk;
intmain(void)
u16AD_value1=0;
myflag.turn=0;
ENA=1;
LCD_Init();
LCD_display();
timer2_init();
AD_value1=read_tlc2543(0);
P_Temp=AD_deal();
Temp_crl();
Show_Num(3,1,3,P_Temp);
key_scan();
return0;
voidtimer2()interrupt5
staticu16num1=0;
TF2=0;
num1++;
if(num1<
pulse)
if(myflag.turn)
IN1=0;
IN2=1;
IN1=1;
IN2=0;
{ENA=0;
IN1=0;
IN2=0;
if(num1>
=PULSE)
{num1=0;
ENA=1;
}
voidkey_scan(void)
u8Temp=P0;
staticu8Add_Ver=0,one_ten=0;
staticTri=0,CON=0;
Temp=Temp^0xff;
Tri=Temp&
(Temp^CON);
CON=Temp;
if(Tri==0x10)
{Add_Ver++;
Add_Ver=Add_Ver%2;
elseif(Tri==0x20)
{one_ten++;
one_ten=one_ten%2;
elseif(Tri==0x01)
if(S_Temp+1<
=120&
&
Add_Ver==0&
one_ten==0)
S_Temp++;
elseif(S_Temp>
=1&
Add_Ver==1&
S_Temp--;
elseif(S_Temp+10<
=100&
one_ten==1)
S_Temp=S_Temp+10;
elseif(S_Temp>
=10&
S_Temp=S_Temp-10;
Show_Num(12,1,3,S_Temp);
elseif(Tri==0x02)
if(Kp+1<
Kp++;
elseif(Kp>
Kp--;
elseif(Kp+10<
Kp=Kp+10;
elseif(Kp>
Kp=Kp-10;
elseif(Tri==0x04)
if(Ki+1<
Ki++;
elseif(Ki>
Ki--;
elseif(Ki+10<
Ki=Ki+10;
elseif(Ki>
Ki=Ki-10;
Show_Num(7,2,2,Ki);
elseif(Tri==0x08)
if(Kd+1<
Kd++;
elseif(Kd>
Kd--;
elseif(Kd+10<
Kd=Kd+10;
elseif(Kd>
Kd=Kd-10;
Show_Num(12,2,2,Kd);
2、程序分析结果
3、结论分析
在工业生产和日常生活中,对温度控制系统的要求,主要是保证温度在一定温度范围内变化,稳定性好,不振荡,对系统的快速要求不高。
在论文中简单分析了温度控制系统基于Protuse仿真实验,采用热电偶作为温度检测器,应用LED显示,通过键盘4X4来对PID进行参数控制。
本实验设计使用8031作为主芯片进行控制,单片机具有集成度高,通用性好,功能强,特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数字、智能化方面有广泛用途。
其温度控制所用的热电偶,范围广泛,在系统中如果加强算法,会大大提高控制精度,同时降低成本,提高效率。
实验总结
经过这次的实验,我又一次加深了对LED的认识
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 系列 单片机 闭环 温度 控制 实验 报告