51系列单片机闭环温度控制实验报告_第1页
51系列单片机闭环温度控制实验报告_第2页
51系列单片机闭环温度控制实验报告_第3页
51系列单片机闭环温度控制实验报告_第4页
51系列单片机闭环温度控制实验报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 成绩:综合实验报告题 目:51系列单片机闭环温度控制 班 级: 小组成员:指导教师:完成时间: 2015年11月 一、实验名称: 51系列单片机闭环温度控制实验基于Protuse仿真实验平台实现基本情况:1.实验项目组长:2. 小组成员:序号姓 名班 级学 号分工系数1233.具体分工:负责程序编写,主要负责查询资料与实验报告撰写。4.实验要求:设计硬件电路: 温度检测:采用热电偶或热电阻 温度给定:采用电位器进行模拟电压给定,05V AD转采用12位转换 显示采用8位LED,或者LCD1602显示 键盘4X4,PID等参数通过键盘设置。软件 控制算法:数字PID,参数在线修改。显示窗口:显

2、示温度的设置值SV、温度的实际值PV。实际温度值,温度峰值、峰值时间等通过串口上传到上位机(选做)二、实验容1、 系统基本原理(实验原理介绍)根据实验要求,温度闭环控制,即对加温速度、超调量、调节时间级误差参数,选择PID控制参数级算法,实现对温度的自动控制。闭环温度控制系统原理图如下:测温温控数字输出计算机PID2、 PID算法的数字实现本次试验通过8031通过OVEN 是模拟加热的装置,加一定的电压便开始不停的升温,直到电压要消失则开始降温。仿真时,U形加热器为红色时表示正在加热,发红时将直流电压放过来接,就会制冷,变绿。T端输出的是电压,温度越高,电压就越高。8031对温度的控制是通过可

3、控硅调控实现的。可控硅通过时间可以通过可控硅控制板上控制脉冲控制。该触发脉冲想8031用软件在P1.3引脚上产生,受过零同步脉冲后经光偶管和驱动器输送到可控硅的控制级上。偏差控制原理是要求对所需温度求出偏差值,然后对偏差值处理而获得控制信号去调节加热装置的温度。PID控制方程式:式中e是指测量值与给定值之间的偏差TD 微分时间T 积分时间KP 调节器的放大系数将上式离散化得到数字PID位置式算法,式中在位置算法的基础之上得到数字PID增量式算法:3、 温度控制软件设计程序结构图如下:4、硬件电路设计在温度控制中,经常采用是硬件电路主要有两大部分组成:模拟部分和数字部分,对这两部分调节仪表进行调

4、节,但都存在着许多缺点,用单片机进行温度控制使构成的系统灵活,可靠性高,并可用软件对传感器信号进行抗干拢滤波和非线性补偿处理,可大大提高控制质量和自动化水平;总的来说本系统由四大模块组成,它们是输入模块、单片机系统模块、计算机显示与控制模块和输出控制模块。输入模块主要完成对温度信号的采集和转换工作,由温度传感器与其与单片机的接口部分组成。利用模拟加热的装置来控制温度。 该闭环温度控制系统采用AT89S51八位机作为微处理单元进行控制。采用4X4键盘把设定温度的最高值和最低值存入单片机的数据存储器,还可以通过键盘完成温度检测功能的转换。温度传感器把采集的信号与单片机里的数据相比较来控制温度控制器

5、。5、 电路原理图1、仿真完整电路图2、12位AD转换模块3、OVEN模型与信号调理电路4、单片机主电路三、实验结果分析(含程序、数据记录与分析和实验总结等,可附页):1、51系列单片机闭环温度控制实验程序Main.c13 / 13#include "includes.h"char measure_temperature6 = '+','0','0','0','C','0'char setting_temperature6 = '0','1',&#

6、39;0','0','C','0'char code_table16 = '7','8','9','T', '4','5','6','P', '1','2','3','I', '+','0','-','D'char Pv6='P','0','9&#

7、39;,'0',' ','0'char Iv6='I','0','0','0',' ','0'char Dv6='D','0','0','5',' ','0'int PWM_Period = 100;int PWM_Hight = 1;int PWM_Hights = 50;short m_temperature = 0;short s_temperatur

8、e = 100;float pc = 090.0;float ic = 0.0;float dc = 5.0;float e1 = 0;float e2 = 0;char RX_Data5 = 0;int main()timer_init();lcd_init();while(1)ADCRead();keyscan();Data_update();LCD_Display(0x80+0x08,setting_temperature);LCD_Display(0x80+0x40,Pv);LCD_Display(0x80+0x45,Iv);LCD_Display(0x80+0x4A,Dv);retu

9、rn 0;PWM.c#include "includes.h"uchar T_update = 0;uchar P_update = 0;uchar I_update = 0;uchar D_update = 0;void T0_time() interrupt 1 /PWMPWM_Hights-;if(PWM_Hights = 0)PWM_EN = 0; PWM_Hights = 1; PWM_Period-;if(PWM_Period = 0)PWM_EN = 1;PWM_Period = 100;PWM_Hights = PWM_Hight;void pid()sta

10、tic long sum = 0;e2 = e1;e1 = s_temperature-m_temperature;sum += e1;if(e1 > 20)PWM_Hight = 100;else if(e1 < -20)PWM_Hight = 1;elsePWM_Hight = PWM_Hight+ pc*(e1+ic*sum+dc*(e1-e2);if(PWM_Hight > 100)PWM_Hight = 100;else if(PWM_Hight < 1)PWM_Hight = 1;void Interrupt_T1() interrupt 3static i

11、nt count = 0;TH1 = 0x3C;/定时50msTL1 = 0xB0;count+;if(count = 20) pid(); count = 0;void update_Temp()short j = 0;short tmp = 0;for(j = 1;j<=3;j+)tmp = tmp*10+(setting_temperaturej-'0');if(setting_temperature0 = '-')tmp = -tmp;s_temperature = tmp;void update_Pv()short j = 0;short tmp

12、 = 0;for(j = 1;j<=3;j+)tmp = tmp*10+(Pvj-'0');pc = tmp;void update_Iv()short j = 0;short tmp = 0;for(j = 1;j<=3;j+)tmp = tmp*10+(Ivj-'0');ic = tmp;void update_Dv()short j = 0;short tmp = 0;for(j = 1;j<=3;j+)tmp = tmp*10+(Dvj-'0');dc = tmp;void Data_update() /循环检查每一次T

13、、PID值是否有修改if(T_update = 1)update_Temp();T_update =0;else if(P_update = 1)update_Pv();P_update =0;else if(I_update = 1)update_Iv();I_update =0;else if(D_update = 1)update_Dv();D_update =0;Timer.c#include "includes.h"void timer_init()EA = 0;/关闭总中断ET0 = 1;/ET0用于PWM产生ET1 = 1;/ET1测速计时TMOD = 0x1

14、2;/T0:工作方式2 T1:工作方式1TH0 = 0x9C;TL0 = 0x9C;TH1 = 0x3C;/定时50msTL1 = 0xB0;TR0 = 1;/运行定时器0TR1 = 1;/运行定时器1PT0 = 1; /T0中断优先级高EA = 1;/打开总中断ADS7824.c#include "includes.h"void itoa(short num,char str)int i=3;num = (num/2047.0)*999.0;for(i=3; i>0; i-)stri = (num % 10) + '0'num = num / 10;

15、str5 = '0'void ADCRead()short num = 0;/无符号16位RC = 0;/启动转换RC = 1;/启动读取while(BUSY = 0);num = 0;BYTE = 0; /读取高4位num = (num|P1)<<8;num = num & 0x0F00;BYTE = 1;/读取低8位num = num|P1;/12位数据完整取好if(num&0x0800) = 0x0800)measure_temperature0 = '-'num = num&0xF7FF;num = (num0x07F

16、F)+1;m_temperature = -(num/2047.0)*999.0);elsemeasure_temperature0 = '+'m_temperature = (num/2047.0)*999.0;itoa(num,measure_temperature);LCD_Display(0x80,measure_temperature);RC = 0;Delay.c#include "includes.h"void delay_ms(int n)/1ms延时uint i=0,j=0;for(i=0;i<n;i+)for(j=0;j<12

17、3;j+);Display.c#include "includes.h"void lcd_wcom(uchar ) /1602 写命令函数 单片机给 1602 写命令 rs=0; /选择指令寄存器rw=0; /选择写P0=; /把命令字送入delay_ms(1);en=1; /使能线电平变化, 命令送入 1602 的 8 位数据口delay_ms(1);en=0;void lcd_wdat(uchar dat) /1602 写数据函数rs=1; /选择数据寄存器rw=0; /选择写P0=dat; /把要显示的数据送入delay_ms(1);en=1; /使能线电平变化, 数

18、据送入 1602 的 8 位数据口delay_ms(1);en=0;void LCD_Display(uint location, uchar Display_Part)int i=0;lcd_wcom(location); for(i=0;Display_Parti != 0;i+)lcd_wdat(Display_Parti);delay_ms(1);void lcd_init() /1602 初始化函数lcd_wcom(0x38); /8 位数据, 双列, 5*7 字形lcd_wcom(0x0c); /开启显示屏, 关光标, 光标不闪烁lcd_wcom(0x06); /显示地址递增, 即

19、写一个数据后, 显示位置右移一位lcd_wcom(0x01); /清屏 LCD_Display(0x80+0x08,setting_temperature);LCD_Display(0x80+0x40,Pv);LCD_Display(0x80+0x45,Iv);LCD_Display(0x80+0x4A,Dv);Keyboard.c#include "includes.h"void keyscan()uint keyno = 16;uchar temp = 0;uchar i = 0;static char update_flag = 0;static int update

20、_index = 0;char key_code = 0;P3 = 0x0F;if(P3 != 0x0F) P3 = 0x0F; /delay_ms(1);temp = P3; i = temp0x0F; switch(i) case 1: keyno = 0;break; case 2: keyno = 1;break; case 4: keyno = 2;break; case 8: keyno = 3;break; default: keyno = 16; /无键按下 P3 = 0xF0;temp = P3; /delay_ms(1); i = (temp >> 4) 0x0

21、F; switch(i) case 1: keyno += 0;break; case 2: keyno += 4;break; case 4: keyno += 8;break; case 8: keyno += 12;break; while(P3 != 0xF0);if(keyno>=0 && keyno <=15) if(update_flag = 1) key_code = code_tablekeyno; setting_temperatureupdate_index = key_code; update_index+; if(update_index

22、= 4) update_flag = 0;update_index = 0;T_update = 1; else if(update_flag = 2) key_code = code_tablekeyno; Pv1+update_index = key_code; update_index+; if(update_index = 3) update_flag = 0;update_index = 0;P_update = 1; else if(update_flag = 3) key_code = code_tablekeyno; Iv1+update_index = key_code; update_index+; if(update_index = 3) update_flag = 0;update_index = 0;I_update = 1; else if(update_flag = 4) key_code = code_tablekeyno; Dv1+update_index = key_code; update_index+; if(update_index = 3) update_flag = 0;update_index = 0;D_update = 1; else switch(keyno)case 3:update_flag = 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论