51系列单片机闭环温度控制实验报告Word格式.docx

上传人:b****5 文档编号:19522440 上传时间:2023-01-07 格式:DOCX 页数:22 大小:156.12KB
下载 相关 举报
51系列单片机闭环温度控制实验报告Word格式.docx_第1页
第1页 / 共22页
51系列单片机闭环温度控制实验报告Word格式.docx_第2页
第2页 / 共22页
51系列单片机闭环温度控制实验报告Word格式.docx_第3页
第3页 / 共22页
51系列单片机闭环温度控制实验报告Word格式.docx_第4页
第4页 / 共22页
51系列单片机闭环温度控制实验报告Word格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

51系列单片机闭环温度控制实验报告Word格式.docx

《51系列单片机闭环温度控制实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《51系列单片机闭环温度控制实验报告Word格式.docx(22页珍藏版)》请在冰豆网上搜索。

51系列单片机闭环温度控制实验报告Word格式.docx

偏差控制原理是要求对所需温度求出偏差值,然后对偏差值处理而获得控制信号去调节加热装置的温度。

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的认识

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

当前位置:首页 > 工程科技 > 材料科学

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

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